通过socket将ec2服务器连接到rds?

时间:2015-08-23 16:31:45

标签: mysql sockets tcp amazon-ec2 rds

我目前通过以下方式将我的ec2服务器连接到rds:

    self.conn = MySQLdb.connect (
                         host = settings.DATABASES['default']['HOST'],
                         port = 3306,
                         user = settings.DATABASES['default']['USER'],
                         passwd = settings.DATABASES['default']['PASSWORD'],
                         db = settings.DATABASES['default']['NAME'])

这通过tcp连接,当我通过套接字将自己的机器连接到mysql时,对我来说比本地慢得多。我如何通过套接字连接将ec2实例连接到rds数据库,因此它比使用tcp / ip快速运行脚本要快得多(对我而言,更新脚本需要花费10个小时而不是一个)。

1 个答案:

答案 0 :(得分:2)

简短的回答:你不能。

除此之外:Linux服务器上与MySQL的所有连接都使用“套接字”,当然,无论是Internet(TCP)套接字还是IPC / Unix域套接字。但是在这个问题中,正如常见的MySQL术语一样,“套接字”是指使用特殊文件(例如/tmp/mysql.sock)的IPC套接字连接,尽管套接字文件的特定路径因Linux发行版而异。

  

Unix域套接字或IPC套接字(进程间通信套接字)是一个数据通信端点,用于在同一主机操作系统中执行的进程之间交换数据。

     

https://en.m.wikipedia.org/wiki/Unix_domain_socket

因此,您无法使用MySQL“套接字”连接机制,因为RDS服务器不在同一台机器上。当然,任何时候MySQL服务器都在不同的机器上也是如此。

在本地计算机上,IPC套接字连接和TCP套接字连接(来自/到同一台机器)之间的性能差异可以忽略不计。由于TCP / IP包装器和校验和,三次握手等等,TCP连接比IPC具有更多的开销没有分歧......但同样,这些微小的毫秒级差异将完全丢失在随便的观察者。

得出结论TCP连接比IPC连接“慢”,特别是10倍,是不正确的。 “较慢”的引用反映了我的结论,即你还没有以足够的精度定义“慢”:慢连接?传输大量数据的速度慢(带宽/吞吐量问题)?从每个查询返回的速度较慢?

记下Fallacies of Distributed Computing,特别是这个:

  

延迟为零。

我怀疑您的主要性能问题是因为您的代码不是非零延迟的最佳选择。一个区域内EC2(包括RDS)系统之间的延迟应该低于1毫秒,但这仍然是本地机器上往返延迟的数百倍(技术上不是零,但很容易只有几微秒) )。

使用TCP连接(使用主机127.0.0.1和端口3306)而不是IPC套接字在本地测试代码应说明是否存在重大差异或问题是否在其他地方......可能效率低下连接,或不必要地重复断开连接/重新连接,但如果没有更清楚地理解“慢”的意思,很难进一步推测。