我正在使用 Datastax 提供的 Python Cassandra 驱动程序连接到单节点 Cassandra 实例。我的 Python 代码生成多个进程(使用多处理模块),每个进程都会打开与该节点的连接,并在退出时将其关闭。
这是我观察到的行为:当生成的进程数量较少(比如大约 30)时,我的代码运行完美。但是当数字更大时,我会看到这样的错误(可能并不奇怪):
File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 755, in connect
self.control_connection.connect()
File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 1868, in connect
self._set_new_connection(self._reconnect_internal())
File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 1903, in _reconnect_internal
raise NoHostAvailable("Unable to connect to any servers", errors)
NoHostAvailable: ('Unable to connect to any servers', {'127.0.0.1': error(99, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Cannot assign requested address")})
显然,主机无法接受新连接。这看起来应该由驱动程序或 Cassandra 来处理 - 让新的连接请求排队并在释放时授予它们。
我该如何实现这种行为?
最佳答案
“无法分配请求的地址”可能表明您的本地端口已用完。这不取决于驱动程序——这是系统配置问题。 Here is a good article about the problem (它指的是MySQL,但问题是相同的)。请注意,处于 TIME_WAIT 状态的连接会占用本地端口,并且可能会在单个程序运行之后持续存在。
本文讨论了多种解决方案,包括扩展端口范围、监听多个 IP 地址或更改应用程序连接行为。我会考虑应用程序行为,并建议运行更少的进程。根据您试图通过多处理克服的问题,您可能最好使用(进程数)<=(机器核心)(这是 multiprocessing.Pool 的默认行为)。
关于python-2.7 - 使用 Python Cassandra 驱动程序进行多个连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296911/