使用 Python Cassandra 驱动程序进行多个连接时出错
Using Python Cassandra driver for multiple connections errors out
我正在使用 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 处理 - 通过让新的连接请求排队并在它释放时授予它们。
我该如何强加这种行为?
"Cannot assign requested address" 可以表示您 运行 不在本地端口。这不取决于驱动程序——这是一个系统配置问题。 Here is a good article about the problem(指的是MySQL,但问题是一样的)。请注意,处于 TIME_WAIT 状态的连接占用本地端口,并且可以在单个程序运行之后持续存在。
本文讨论了多种解决方案,包括扩展端口范围、侦听多个 IP 地址或更改应用程序连接行为。我会考虑应用程序行为,并建议减少 运行 个进程。根据您试图通过多处理克服的问题,您可能最好使用 (process count) <= (machine cores) (这是 multiprocessing.Pool 的默认行为)。
我正在使用 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 处理 - 通过让新的连接请求排队并在它释放时授予它们。
我该如何强加这种行为?
"Cannot assign requested address" 可以表示您 运行 不在本地端口。这不取决于驱动程序——这是一个系统配置问题。 Here is a good article about the problem(指的是MySQL,但问题是一样的)。请注意,处于 TIME_WAIT 状态的连接占用本地端口,并且可以在单个程序运行之后持续存在。
本文讨论了多种解决方案,包括扩展端口范围、侦听多个 IP 地址或更改应用程序连接行为。我会考虑应用程序行为,并建议减少 运行 个进程。根据您试图通过多处理克服的问题,您可能最好使用 (process count) <= (machine cores) (这是 multiprocessing.Pool 的默认行为)。