Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Can';t从EC2实例连接到RDS实例_Mysql_Amazon Web Services_Amazon Ec2_Amazon Rds - Fatal编程技术网

Mysql Can';t从EC2实例连接到RDS实例

Mysql Can';t从EC2实例连接到RDS实例,mysql,amazon-web-services,amazon-ec2,amazon-rds,Mysql,Amazon Web Services,Amazon Ec2,Amazon Rds,我正在尝试从EC2实例i-78a8df00连接到RDS实例mysql。*************.us-east-1.RDS.amazonaws.com。他们都在美国东部地区。我将EC2实例的安全组(sg-*******)添加到RDS安全组中,但没有帮助。运行此命令时超时,这似乎是防火墙/DNS问题: ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com 错误2003(HY000)

我正在尝试从EC2实例i-78a8df00连接到RDS实例mysql。*************.us-east-1.RDS.amazonaws.com。他们都在美国东部地区。我将EC2实例的安全组(sg-*******)添加到RDS安全组中,但没有帮助。运行此命令时超时,这似乎是防火墙/DNS问题:

ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com
错误2003(HY000):无法连接到MySQL.********.us-east-1.rds.amazonaws.com(110)上的MySQL服务器


我可以使用与上面相同的线路从本地机器连接到RDS实例。我尝试了各种论坛解决方案,但都没有用。

显然,multi-AZ把一切都搞砸了。由于默认的multi-AZ配置将我的数据库放置在区域us-east-1d中,而我的EC2实例位于区域us-east-1a中,因此DNS没有正确路由。我将RDS实例重新创建为非multi AZ,并使其在us-east-1a中运行,一切都很高兴


如果有任何超级天才在AWS上使用RDS、ELB和multi-AZ功能进行DNS路由,知道如何做到这一点将是非常棒的,因为亚马逊Web服务的文档中没有任何地方记录这一点。

看起来像是上一次发布和本次发布之间的某个时间,Amazon修复了DNS路由问题,因为现在对于多AZ rds一切正常…

对于尝试连接到rds或RedShift时可能遇到类似问题的人,其他信息:

1)检查安全组

验证RDS实例的安全组是否允许从源服务器所属的安全组进行访问(如果源服务器位于AWS外部,则直接添加其IP)。您应该查看的安全组是在RDS控制台UI的RDS实例属性中指定的安全组(名为“安全组”)

注意:数据库安全组可能不同于AWS EC2安全组。如果您的RDS实例在classic/public EC2中,您应该在RDS UI的“数据库安全组”部分进行检查。对于VPC用户,安全组将是一个普通的VPC安全组(名称sg xxx将列在RDS实例的属性中)

2)确认DNS不是问题。

Amazon使用拆分DNS,因此AWS外部的DNS查找将返回公共IP,而AWS内部的查找将返回私有IP。如果您怀疑这是DNS问题,您是否确认从不同的可用性区域返回了不同的IP?如果不同的AZ获得不同的IP,您需要联系AWS支持

3)通过建立套接字连接来确认网络连接。

像tracepath和traceroute这样的工具可能不会有帮助,因为RDS目前会丢弃ICMP流量

通过尝试在端口3306(mysql或5432,用于postgres)上建立到RDS实例的套接字连接来测试端口连接。首先查找RDS实例的IP并使用telnet或nc:

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306
a)如果您的连接尝试未成功并立即失败,则该端口可能已被阻止,或者远程主机未在该端口上运行服务。您可能需要使用AWS支持来进一步排除故障。如果从AWS外部连接,请首先尝试从AWS内部的另一个实例连接(因为您的防火墙可能会阻止这些连接)

b)如果您的连接不成功并且超时,则数据包可能被防火墙丢弃/忽略,或者数据包返回到不同的网络路径。您可以通过运行
netstat-an | grep SYN
(在运行并等待telnet/nc命令超时时,从不同的CLI窗口/会话)来确认这一点。处于SYN状态的连接意味着您已发送连接请求,但尚未收到任何回复(SYN_ACK或reject/block)。通常这意味着防火墙或安全组正在忽略或丢弃数据包

检查以确保您没有在主机和RDS实例之间使用iptables或NAT网关。如果您在VPC中,还应确保允许来自源主机的出口/出站流量

c)如果您的套接字连接测试成功,但无法连接mysql客户端(CLI、workbench、app等),请查看netstat的输出,查看连接处于何种状态(将x.x.x.x替换为RDS实例的实际IP地址):

netstat-an | grep x.x.x.x

如果在使用telnet或NC时建立连接,但在使用mysql客户端时看到“SYN”状态,则可能会遇到MTU问题

在编写此文件时,RDS可能不支持用于PMTUD()的ICMP数据包。如果您试图通过ClassClink从经典ec2实例访问VPC中的RDS或红移,这可能是一个问题。尝试用以下方法降低MTU,然后再次测试:

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400
如果较低的MTU工作正常,请务必向AWS客户支持部门寻求帮助,并说明您在尝试连接到RDS实例时发现MTU问题。如果TCP数据包使用用于隧道的封装进行包装,则可能发生这种情况,从而导致数据包数据/有效负载的可用MTU降低。降低源服务器上的MTU允许包装的数据包仍符合限制

如果它不起作用,请将MTU设置回默认值,并与AWS支持联系以进行进一步的故障排除。

根据,我们应该使用:

PROMPT> mysql -h <endpoint> -P 3306 -u <mymasteruser> -p
PROMPT>mysql-h-p3306-u-P
其中,endpointmymasteruser(用户名)来自您的RDS实例


我直接使用IP公共地址(端点)而不是端点(****.us-east-1.rds.amazonaws.com)解决了这个问题。您可以使用“ping”命令(ping***.us-east-1.rds.amazonaws.com)获取IP公共地址。

,而Mark的问题似乎与多AZ路由和EC2 cla有关