我正在使用以下组件运行 Web 应用程序:
- Python 3.5.2
- uWSGI 2.0.11.2
- 卡桑德拉驱动程序3.6.0
- 卡桑德拉3.7
使用 Cassandra 集群(3 个节点):
- 节点 1 - IP:172.17.0.4
- 节点 2 - IP:172.17.0.5
- 节点 3 - IP:172.17.0.6
使用配置NetworkTopologyStrategy和GossipingPropertyFileSnitch。
我遵循了cqlengine 的uWSGI 连接示例:
from cqlengine import connection
from cassandra.io.libevreactor import LibevConnection
from cqlengine.connection import (
cluster as cql_cluster,
session as cql_session
)
try:
from uwsgidecorators import postfork
except ImportError:
# We're not in a uWSGI context, no need to hook Cassandra session
# initialization to the postfork event.
pass
else:
@postfork
def cassandra_init():
""" Initialize a new Cassandra session in the context.
Ensures that a new session is returned for every new request.
"""
if cql_cluster is not None:
cql_cluster.shutdown()
if cql_session is not None:
cql_session.shutdown()
connection.setup(
['172.0.4'],
'my_keyspace',
port=9042,
connection_class=LibevConnection
)
但我在所有 cassandra 节点(172.17.0.4、172.17.0.5和172.17.0.6 )上都收到错误“无法为新主机 xxxx 创建连接池” :
Respawned uWSGI worker 2 (new pid: 90)
mapping worker 2 to CPUs: 3 4 5
2016-09-14 21:00:47,434 WARNI [cassandra.cluster][Thread-2] Failed to create connection pool for new host 172.17.0.4:
Traceback (most recent call last):
File "cassandra/cluster.py", line 2232, in cassandra.cluster.Session.add_or_renew_pool.run_add_or_renew_pool (cassandra/cluster.c:38826)
File "cassandra/pool.py", line 328, in cassandra.pool.HostConnection.__init__ (cassandra/pool.c:6243)
File "cassandra/cluster.py", line 1107, in cassandra.cluster.Cluster.connection_factory (cassandra/cluster.c:14943)
File "cassandra/connection.py", line 330, in cassandra.connection.Connection.factory (cassandra/connection.c:5766)
cassandra.OperationTimedOut: errors=Timed out creating connection (5 seconds), last_host=None
2016-09-14 21:00:47,437 WARNI [cassandra.cluster][Thread-1] Failed to create connection pool for new host 172.17.0.6:
Traceback (most recent call last):
File "cassandra/cluster.py", line 2232, in cassandra.cluster.Session.add_or_renew_pool.run_add_or_renew_pool (cassandra/cluster.c:38826)
File "cassandra/pool.py", line 328, in cassandra.pool.HostConnection.__init__ (cassandra/pool.c:6243)
File "cassandra/cluster.py", line 1107, in cassandra.cluster.Cluster.connection_factory (cassandra/cluster.c:14943)
File "cassandra/connection.py", line 330, in cassandra.connection.Connection.factory (cassandra/connection.c:5766)
cassandra.OperationTimedOut: errors=Timed out creating connection (5 seconds), last_host=None
...The work of process 19 is done. Seeya!
worker 7 killed successfully (pid: 19)
根据日志,它能够连接到节点,但由于某种原因,它会断开连接并抛出先前的错误:
2016-09-15 23:23:03,786 DEBUG [cassandra.pool][Thread-2] Initializing connection for host 172.17.0.4
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Not sending options message for new connection(139905425534704) to 172.17.0.4 because compression is disabled and a cql version was not specified
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Sending StartupMessage on <LibevConnection(139905425534704) 172.17.0.4:9042>
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Sent StartupMessage on <LibevConnection(139905425534704) 172.17.0.4:9042>
2016-09-15 23:23:03,788 DEBUG [cassandra.connection][event_loop] Got ReadyMessage on new connection (139905425534704) from 172.17.0.4
2016-09-15 23:23:03,788 DEBUG [cassandra.pool][Thread-2] Finished initializing connection for host 172.17.0.4
2016-09-15 23:23:03,788 DEBUG [cassandra.cluster][Thread-2] Added pool for host 172.17.0.4 to session
2016-09-15 22:24:29,239 DEBUG [cassandra.io.libevreactor][Thread-2] Closing connection (139945376028152) to 172.17.0.4
2016-09-15 22:24:29,240 DEBUG [cassandra.io.libevreactor][Thread-2] Closed socket to 172.17.0.4
2016-09-15 22:24:29,240 DEBUG [cassandra.connection][Thread-2] Connection to 172.17.0.4 was closed during the startup handshake
2016-09-15 22:24:29,242 WARNI [cassandra.cluster][Thread-2] Failed to create connection pool for new host 172.17.0.4:
已编辑(添加了有关该问题的更多调试信息)
该应用程序可以 ping 端口 9042 上的任何节点,因此这不是连接问题。如果我nodetool status
在集群中运行三个节点似乎没问题:
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.17.0.5 111.72 KiB 256 67.3% fdd4740d-1ce5-4deb-9a3e-5c18c80ee63e rack1
UN 172.17.0.4 98.96 KiB 256 66.8% 4fe5a60c-2b6a-4d57-ab6a-e4176ce69b68 rack1
UN 172.17.0.6 94.67 KiB 256 66.0% 5e2675e3-c2a7-4af1-80f0-4cb9573ecf2b rack1
我已经尝试过 Cassandra 3.7和2.2.7,但得到了相同的结果。但是,如果我尝试仅使用Node1运行该应用程序,它就可以工作!
Cassandra 节点中的日志显示以下内容:
INFO 22:14:33 Unexpected exception during request; channel = [id: 0xd6d3c9ae, L:/172.17.0.6:9042 ! R:/172.17.0.5:42944]
io.netty.channel.unix.Errors$NativeIoException: syscall:read(...)() failed: Connection reset by peer
INFO 22:16:26 Unexpected exception during request; channel = [id: 0x2cfa996f, L:/172.17.0.6:9042 - R:/172.17.0.5:42954]
io.netty.channel.unix.Errors$NativeIoException: syscall:read(...)() failed: Connection reset by peer
INFO 22:54:13 Unexpected exception during request; channel = [id: 0x4134ec0f, L:/172.17.0.6:9042 ! R:/172.17.0.5:42992]
有人知道这里发生了什么吗?任何帮助将不胜感激。