我应该担心 Cassandra C++ 驱动程序的负载平衡选择吗?
Should I be worried about the load balancing choices of the Cassandra C++ driver?
我有一个由 4 个节点组成的小型 Cassandra 集群 运行 Cassandra 3.9。
我将 4 个 IP 地址传递给 connect()
函数,当我检查与 netstat -a4n | grep 9042
的连接时,我可以看到它们都已连接。请注意,无论我将 1 个 IP 还是 4 个 IP 传递给 connect()
,一旦完全连接,结果是相同的,包括到 10.0.1.1 节点的双连接...(10.0.1.1 和 10.0.1.3 是种子,但不知何故,只有 10.0.1.1 有双重连接,所以我不太确定为什么会发生这种情况,我试图打乱用于连接的 IP 列表,但最终没有任何区别。)
tcp 0 0 10.0.0.1:45012 10.0.1.3:9042 ESTABLISHED
tcp 0 0 10.0.0.1:48400 10.0.1.4:9042 ESTABLISHED
tcp 0 0 10.0.0.1:51514 10.0.1.2:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56460 10.0.1.1:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56452 10.0.1.1:9042 ESTABLISHED
当我查看 nodetool status
的输出时,它看起来很不错:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.0.1.1 7.92 MiB 256 76.1% (id) rack1
UN 10.0.1.4 12.26 MiB 256 77.7% (id) rack1
UN 10.0.1.3 10.08 MiB 256 72.2% (id) rack1
UN 10.0.1.2 8.77 MiB 256 74.0% (id) rack1
(注:ID我去掉了,这里用不上了)
但是,在网络方面,当我查看传输到这些机器的数据量时,我发现存在巨大差异。我使用 iptables -L -nvx
命令,令我惊讶的是,我发现我向第一个 Cassandra 节点发送了大约 3 倍的数据包和近 20 倍的数据:
6856 13581751 RETURN all -- eth1 * 10.0.1.1 0.0.0.0/0
2736 816810 RETURN all -- eth1 * 10.0.1.2 0.0.0.0/0
2831 807426 RETURN all -- eth1 * 10.0.1.3 0.0.0.0/0
2745 806023 RETURN all -- eth1 * 10.0.1.4 0.0.0.0/0
(6,856 / 2,736 = 2.51 和 13,581,751 / 806,023 = 16.85)
我想在某种程度上,只要节点不忙,这并不重要,但我仍然想知道为什么我会看到如此巨大的差异?为什么不是所有 4 个连接都以相似的级别参与?
驱动程序将使用接触点作为初始连接点来设置连接池。在此之后,将根据您的架构拓扑、本地平衡策略和池化选项创建池。在这里参考一些有用的文档(抱歉,如果你已经看过这些):
http://datastax.github.io/cpp-driver/topics/
http://datastax.github.io/cpp-driver/topics/configuration/
额外的流量很可能是驱动程序使用的控制连接,它使自身与模式拓扑保持同步以帮助驱动程序运行:
http://datastax.github.io/cpp-driver/topics/basics/schema_metadata/
我有一个由 4 个节点组成的小型 Cassandra 集群 运行 Cassandra 3.9。
我将 4 个 IP 地址传递给 connect()
函数,当我检查与 netstat -a4n | grep 9042
的连接时,我可以看到它们都已连接。请注意,无论我将 1 个 IP 还是 4 个 IP 传递给 connect()
,一旦完全连接,结果是相同的,包括到 10.0.1.1 节点的双连接...(10.0.1.1 和 10.0.1.3 是种子,但不知何故,只有 10.0.1.1 有双重连接,所以我不太确定为什么会发生这种情况,我试图打乱用于连接的 IP 列表,但最终没有任何区别。)
tcp 0 0 10.0.0.1:45012 10.0.1.3:9042 ESTABLISHED
tcp 0 0 10.0.0.1:48400 10.0.1.4:9042 ESTABLISHED
tcp 0 0 10.0.0.1:51514 10.0.1.2:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56460 10.0.1.1:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56452 10.0.1.1:9042 ESTABLISHED
当我查看 nodetool status
的输出时,它看起来很不错:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.0.1.1 7.92 MiB 256 76.1% (id) rack1
UN 10.0.1.4 12.26 MiB 256 77.7% (id) rack1
UN 10.0.1.3 10.08 MiB 256 72.2% (id) rack1
UN 10.0.1.2 8.77 MiB 256 74.0% (id) rack1
(注:ID我去掉了,这里用不上了)
但是,在网络方面,当我查看传输到这些机器的数据量时,我发现存在巨大差异。我使用 iptables -L -nvx
命令,令我惊讶的是,我发现我向第一个 Cassandra 节点发送了大约 3 倍的数据包和近 20 倍的数据:
6856 13581751 RETURN all -- eth1 * 10.0.1.1 0.0.0.0/0
2736 816810 RETURN all -- eth1 * 10.0.1.2 0.0.0.0/0
2831 807426 RETURN all -- eth1 * 10.0.1.3 0.0.0.0/0
2745 806023 RETURN all -- eth1 * 10.0.1.4 0.0.0.0/0
(6,856 / 2,736 = 2.51 和 13,581,751 / 806,023 = 16.85)
我想在某种程度上,只要节点不忙,这并不重要,但我仍然想知道为什么我会看到如此巨大的差异?为什么不是所有 4 个连接都以相似的级别参与?
驱动程序将使用接触点作为初始连接点来设置连接池。在此之后,将根据您的架构拓扑、本地平衡策略和池化选项创建池。在这里参考一些有用的文档(抱歉,如果你已经看过这些):
http://datastax.github.io/cpp-driver/topics/
http://datastax.github.io/cpp-driver/topics/configuration/
额外的流量很可能是驱动程序使用的控制连接,它使自身与模式拓扑保持同步以帮助驱动程序运行:
http://datastax.github.io/cpp-driver/topics/basics/schema_metadata/