【问题标题】:ECS EC2 Launch Type: Service database connection stringECS EC2 启动类型:服务数据库连接字符串
【发布时间】:2019-01-15 11:18:56
【问题描述】:

我正在 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 而不是说明我自己的数据库,我会尝试这样做,但现在需要这个工作,因为我已经开始使用它。感谢您的帮助。

【问题讨论】:

    标签: mysql docker amazon-ecs service-discovery


    【解决方案1】:

    好吧,在我自己解决问题之前,我已经提出了一些观点:

    • 您是否需要使用 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/

    【讨论】:

    • 谢谢。我确实需要它仅作为 EC2 启动类型工作,因为 POC/实验是专门为此而设计的。但是自从我发布这个问题以来,我按照你上面所说的做了几件事。一,我试过 Fargate 但没有进展,因为它是无状态的,而数据库可以是 RDS,搜索(用于索引)和店面(用于媒体文件、机密等)需要访问通常安装到容器中的文件从实例中,我无法使用坐骑。
    • 我尝试的第二种方法是将所有三个容器放在同一个任务中并在它们之间创建链接,这很有效,但我不希望它们都以相同的方式缩放,所以这也是不适合我。剩下的另一个选择是使用 EKS。如果我在这方面取得任何进展,我会阅读您上面提到的链接并在此处更新。
    • 哦,真的很高兴你能在不同的路径上锻炼。希望你能实现你的目标。在 Lambda 中尝试一下,在 AWS 中几乎所有你可以用 Lambda 做的事情,我认为你可能需要考虑一下,但这是可能的。在这里更新,也许我可以进一步帮助你。
    • 另一件事是设置答案,如果需要,您可以在此处发布答案,或者将我标记为答案。但是,很高兴每个人都看到问题已经解决了。
    • 好的,我确实提出了这个问题,因为问题是关于 EC2 启动类型,但它不起作用。我打算在某个时候再试一次。但是,如果您认为其他方法可以被视为答案,我可以将您的方法标记为答案。告诉我。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2016-11-12
    • 1970-01-01
    • 2011-01-07
    • 2018-07-17
    • 2019-11-27
    相关资源
    最近更新 更多