在EC2上,以每秒几千次的速度连接ElastiCache和RDS,针对名字解析失败时的应对措施

以下是关于从本地服务器迁移到AWS时遇到的标题问题的TIPS,涉及一个大型WEB系统。

在使用EC2构建的中大型系统中,使用数据存储(如RDS或ElastiCache)的连接时,使用端点(即没有固定IP)可能是必要的安全措施。

系统配置

作为系统配置,它是常见模式之一。

尽管我认为Elastic Beanstalk或Lambda等WEB应用程序服务器可能更好,但由于WEB应用程序的复杂性,我还是选择了EC2来进行自动扩展。

一方面,我们正在使用ElastiCache和Aurora Mysql进行数据存储。

EC2和数据存储正在利用丰富的实例大小。

处理能力

大致上来说,对于WEB应用程序的访问以及访问发生时的ElastiCache和Aurora Mysql等数据存储的终端点,有时会达到每秒数千次的水平。

预先采取措施

在托管服务中,ElastiCache和Aurora MySQL只进行了参数组的微调。

在EC2中,我进行了对主要中间件PHP和Apache的常见限制项(如memory_limit和max_client等)的上限值更改,并针对大规模系统进行了内核设置(如ipv4.tcp_syncookies和ipv4.ip_local_port_range等)。

情况

这次尝试连接数据存储时,出现了无法解析名称而无法连接的错误,当处理量增加时,会在日志中输出相关信息。

PHP Warning:  Memcache::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known

PHP Warning:  PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known

PHP Warning:  mysql_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known

解决方案 ‘àn)

AWS于2019年10月份公开了解决方案。

请参考这个链接:https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/

由于操作系统的类型等原因,对策可能略有不同,但对于我的情况,我使用的是AmazonLinux。我下载了AutomateDnsmasq.sh并运行它,基本上就完成了防护措施。

最初的时候,在Linux控制台上运行的本地dnsmasq只能进行名称解析,无法使用Web应用程序,但是当我重新启动PHP后,问题解决了。

据说缓存时间通常基于DNS记录的TTL,所以如果想要延长缓存时间,请使用以下设置。尽管有一些信息表明这个设置有时候不会很好地工作,但我尝试进行了调整后,缓存时间就延长了,所以在这个环境下似乎是有效的。

max-cache-ttl

然而,当然,由于托管服务的IP可能会发生变化,所以请考虑并进行相应的调整以应对这种风险。

我认为基本上最好不要去调整”max-cache-ttl”。

广告
将在 10 秒后关闭
bannerAds