mysql - ECS EC2 启动类型:服务数据库连接字符串
问题描述
我正在 docker 上尝试一个小型 POC(学习实验)。我有 3 个 docker 图像,一个用于店面、一个搜索引擎和一个分别称为 storefront、solr、docmysql 的数据库引擎。我曾尝试在 ec2 上的 docker swarm(在单个节点上)中运行它们,并且效果很好。
在 POC 中,我接下来需要在单个非 Amazon ECS-Optimized AMI 上使用 EC2 启动类型将此移动到 AWS ECS。我已经为此安装并启动了一个 ecs-agent。我为在任务中配置为容器的 3 个图像中的每一个创建了 3 个服务和一个任务。问题是关于从店面连接到数据库。
店面有一个属性文件,其中数据库连接通常定义为
"jdbc:mysql://docmysql/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false".
当我将它作为 docker swarm 运行时,这很有效。将其移至 ECS(EC2 启动类型)后,我必须从我的任务/容器中为 docmysql 服务公开端口 3306。这给了我一个 docmysql.local 的服务端点,“local”是一个私有命名空间。我尝试将连接字符串更改为
"jdbc:mysql://docmysql.local/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false"
在属性文件中,它总是以“名称或服务未知”失败。我的连接字符串应该是什么?创建服务后,我在 Route 53 中看到 2 个条目,一个 SRV 记录和一个 A 记录。A 记录的名称为 .docmysql.local,如果我在数据库连接字符串中使用它,我会看到它有效,但显然与 hadcoded taskid 不正确。我已经阅读了 AWS Cloud Map (servicediscovery) 但仍然不太清楚如何去做。我不会在服务中的数据库任务前面放置任何负载均衡器,数据库始终只有一项任务。
那么生成有效的连接字符串的最佳方法是什么。还有为什么当我将它作为 docker swarm 运行时没有问题。
我知道我可以使用 RDS 而不是说明我自己的数据库,我会尝试这样做,但现在需要这个工作,因为我已经开始这样做了。谢谢你的帮助。
解决方案
好吧,在我自己解决问题之前,我已经提出了一些观点:
- 您是否需要使用 ECS 扩展您的实例?如果没有,请将其迁移到 RDS。
- 您需要在 EC2-Type 上部署它吗?如果没有,使用fargate,处理起来更简单。
现在,我在 Fargate 上遇到了这个问题,并发现根据您的容器/任务定义,它可以在同一任务中用于测试目的,因此,127.0.0.1 应该是答案。
在您需要使用 awsvpc 网络模式的不同任务上,您将拥有以下内容:
- 每个使用 awsvpc 网络模式的任务都会收到自己的弹性网络接口,该接口附加到托管它的容器实例。(来自 AWS)
我的建议是创建一个 Lambda 函数来动态发现您的网络接口。
阅读本文以深入了解:
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html
https://aws.amazon.com/blogs/developer/invoking-aws-lambda-functions-from-java/
推荐阅读
- windows-services - 升级到 .net 5 的 .NET core 2.1 Windows 服务无法从 MSI 安装程序运行
- image-processing - 有没有办法限制函数调用的内存使用?
- javascript - IMAGE COMPRESSOR Script [注意:只有变量应该通过引用传递]
- r - 为什么在 R 中使用 left_join() 时会出现“无效的 'times' 参数”错误?
- sql - SQL查询获取其他列中具有差异值的公共列
- c# - SQL CLR标量UDF中的DES解密不起作用
- java - IntelliJ 在运行配置部分显示大写
- javascript - FlatList numColumns 没有显示想要的结果
- java - 与 AND 运算符不同,按位运算符 XOR 和 OR 对负数的工作方式是否不同
- android - 无法通过适用于 Android 11 的 Mediastore API 录制超过 2 分钟的视频