Python无效列表节点cassandra集群



我有2个dc和3个节点:
DC1: cas01.dc01.net(172.16.3.15)和cas02.dc01.net(172.16.3.16)

以172.16.9.3为例。

执行以下脚本:

  cluster = Cluster(['cas01.dc01.net', 'cas02.dc01.net', 'cas01.dc02.net'],auth_provider=auth,protocol_version=3, load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='DC1'))
session = cluster.connect('test')
print '_dc_live_hosts:'
for k, v in cluster.load_balancing_policy._dc_live_hosts.items():
    print "DC name: %s; Node address: %s" % (k, [node.address for node in v])
print 'Cluster metadata:'
for host in cluster.metadata.all_hosts():
    print 'Datacenter: %s; Host: %s; Rack: %s' % (host.datacenter, host.address, host.rack)

和接收响应:

_dc_live_hosts:
DC name: DC1; Node address: ['cas01.dc01.net', 'cas01.dc02.net', 'cas02.dc01.net', '172.16.3.15']
DC name: DC2; Node address: ['172.16.9.3']
Cluster metadata:
Datacenter: None; Host: cas01.dc01.net; Rack: None
Datacenter: None; Host: cas01.dc02.net; Rack: None
Datacenter: DC1; Host: 172.16.3.15; Rack: Rack1
Datacenter: DC2; Host: 172.16.9.3; Rack: Rack1
Datacenter: DC1; Host: cas02.dc01.net; Rack: Rack1

为什么要重复节点?
如果指定一个IP地址列表:

cluster = Cluster(['172.16.3.15', '172.16.3.16', '172.16.9.3'],auth_provider=auth,protocol_version=3, load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='DC1'))
...

节点列表是正确的:

_dc_live_hosts:
DC name: DС1; Node address: ['172.16.3.16', '172.16.3.15']
DC name: DС2; Node address: ['172.16.9.3']
Cluster metadata:
Datacenter: DС1; Host: 172.16.3.16; Rack: Rack1
Datacenter: DС1; Host: 172.16.3.15; Rack: Rack1
Datacenter: DС2; Host: 172.16.9.3; Rack: Rack1

请帮。

对驱动程序如何工作的简短描述,以澄清您的问题:

  1. 传递给Cluster构造器的节点列表是初始接触节点

    驱动程序选择其中一个来创建控制连接。传递多个节点是一种很好的做法,这样如果其中一个节点不能立即访问,驱动程序可以尝试不同的连接。

  2. 使用在步骤1中建立的控制连接,驱动程序从system表中检索有关集群拓扑的信息。它使用这些细节来填充集群元数据对象。

    system表(特别是peers表)中的信息反映了每个节点的配置(基于broadcast_address, rpc_address等)

我不确定这是唯一的问题,但是:

  • 所有节点必须有相同的种子
  • 种子列表必须包含每个数据中心的至少一个节点

Try this:

    - seeds : "172.16.3.16, 172.16.9.3"

最新更新