通过套接字将 ec2 服务器连接到 rds?
Connect ec2 server to rds via socket?
我目前正在通过以下方式将我的 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 个小时之一)。
简答:你不能。
旁白:Linux 服务器上到 MySQL 的所有连接当然都使用 "sockets,",无论它们是 Internet (TCP) 套接字,还是 IPC/Unix 域套接字。但是在这个问题中,按照常见的MySQL说法,"socket"指的是IPC套接字连接,使用特殊文件,例如/tmp/mysql.sock
,尽管套接字文件的具体路径因人而异Linux分布.
A Unix domain socket or IPC socket (inter-process communication socket) is a data communications endpoint for exchanging data between processes executing within the same host operating system.
所以,不能使用MySQL "socket"连接机制,因为RDS服务器不在同一台机器上。当然,只要 MySQL 服务器在不同的机器上,这同样适用。
在本地机器上,IPC 套接字连接和 TCP 套接字连接(from/to 同一台机器)之间的性能差异可以忽略不计。由于 TCP/IP 包装器和校验和、三向握手等,TCP 连接比 IPC 有更多的开销,这一点没有异议……但同样,这些微小的毫秒差异将完全丢失在不经意的观察者身上。
得出 TCP 连接比 IPC 连接 "slower",尤其是 10 倍的结论是不正确的。 "slower" 周围的引号反映了我的结论,即您尚未足够精确地定义 "slower":连接速度慢?传输大量数据很慢(bandwidth/throughput 问题)?每个查询的速度变慢 return?
注意 Fallacies of Distributed Computing,尤其是这个:
Latency is zero.
我怀疑您的主要性能问题是因为您的代码对于非零延迟不是最佳的。区域内 EC2(包括 RDS)中系统之间的延迟应该低于 1 毫秒,但这仍然是本地机器上往返延迟的数百倍(从技术上讲,这不是零,但很容易只是几微秒).
在本地测试您的代码,使用 TCP 连接(使用主机 127.0.0.1 和端口 3306)而不是 IPC 套接字应该说明是否真的存在显着差异或者问题是否出在其他地方......可能效率低下使用连接,或不必要地重复 disconnect/reconnect,尽管如果不更清楚地理解您所说的 "slow."
是什么意思,就很难进一步推测
我目前正在通过以下方式将我的 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 个小时之一)。
简答:你不能。
旁白:Linux 服务器上到 MySQL 的所有连接当然都使用 "sockets,",无论它们是 Internet (TCP) 套接字,还是 IPC/Unix 域套接字。但是在这个问题中,按照常见的MySQL说法,"socket"指的是IPC套接字连接,使用特殊文件,例如/tmp/mysql.sock
,尽管套接字文件的具体路径因人而异Linux分布.
A Unix domain socket or IPC socket (inter-process communication socket) is a data communications endpoint for exchanging data between processes executing within the same host operating system.
所以,不能使用MySQL "socket"连接机制,因为RDS服务器不在同一台机器上。当然,只要 MySQL 服务器在不同的机器上,这同样适用。
在本地机器上,IPC 套接字连接和 TCP 套接字连接(from/to 同一台机器)之间的性能差异可以忽略不计。由于 TCP/IP 包装器和校验和、三向握手等,TCP 连接比 IPC 有更多的开销,这一点没有异议……但同样,这些微小的毫秒差异将完全丢失在不经意的观察者身上。
得出 TCP 连接比 IPC 连接 "slower",尤其是 10 倍的结论是不正确的。 "slower" 周围的引号反映了我的结论,即您尚未足够精确地定义 "slower":连接速度慢?传输大量数据很慢(bandwidth/throughput 问题)?每个查询的速度变慢 return?
注意 Fallacies of Distributed Computing,尤其是这个:
Latency is zero.
我怀疑您的主要性能问题是因为您的代码对于非零延迟不是最佳的。区域内 EC2(包括 RDS)中系统之间的延迟应该低于 1 毫秒,但这仍然是本地机器上往返延迟的数百倍(从技术上讲,这不是零,但很容易只是几微秒).
在本地测试您的代码,使用 TCP 连接(使用主机 127.0.0.1 和端口 3306)而不是 IPC 套接字应该说明是否真的存在显着差异或者问题是否出在其他地方......可能效率低下使用连接,或不必要地重复 disconnect/reconnect,尽管如果不更清楚地理解您所说的 "slow."
是什么意思,就很难进一步推测