部分Cassandra节点显示DN——八卦信息不一致

Some Cassandra nodes show DN - gossip information is not unanimous

我有一个 16 节点 Cassandra 集群 (3.11.9),有 3 个种子节点(.54、.115 和 164),复制因子 3 和 gc_grace_seconds 10 天(默认)。一些节点在其他一些节点上显示 DN,但在其他节点上它们显示为 UN。例如,下面是 .54 和 .115 节点的节点工具状态:

.54

和.115

而例如在 .87 上每个节点都是 UN。这种情况现在至少持续了几周,它从两个相互显示的节点开始,即 .54 和 .147。但是,现在似乎越来越多的节点在某些节点(但不是所有节点)上显示 DN。还要补充一点,这几周没有写入。

  1. 我已经尝试在所有节点上启用、禁用八卦并重新启动 cassandra。生成标记在 system_auth table 中是最新的。我可以使用 cqlsh 连接到这些节点,但正如预期的那样,在某些情况下我得到 NoHostAvailable 因为一些数据位于“死”节点上。

  2. nodetool describecluster 显示 DN 节点不可访问,这取决于我正在执行它的节点。因此,即 .54 将 .164、.115、.147 和 .19 显示为无法访问。

  3. 同样在 nodetool gossipinfo 中,一切看起来都正常,状态:正常和最新的生成。

  4. 在debug.log文件中我只得到:

DEBUG [MessagingService-Outgoing-/192.168.100.147-Gossip] 2022-05-30 03:58:43,478 OutboundTcpConnection.java:546 - Unable to connect to /192.168.100.147
java.net.NoRouteToHostException: No route to host
    at sun.nio.ch.Net.connect0(Native Method) ~[na:1.8.0_312]
    at sun.nio.ch.Net.connect(Net.java:482) ~[na:1.8.0_312]
    at sun.nio.ch.Net.connect(Net.java:474) ~[na:1.8.0_312]
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:647) ~[na:1.8.0_312]
    at org.apache.cassandra.net.OutboundTcpConnectionPool.newSocket(OutboundTcpConnectionPool.java:146) ~[apache-cassandra-3.11.9.jar:3.11.9]
    at org.apache.cassandra.net.OutboundTcpConnectionPool.newSocket(OutboundTcpConnectionPool.java:132) ~[apache-cassandra-3.11.9.jar:3.11.9]
    at org.apache.cassandra.net.OutboundTcpConnection.connect(OutboundTcpConnection.java:434) [apache-cassandra-3.11.9.jar:3.11.9]
    at org.apache.cassandra.net.OutboundTcpConnection.run(OutboundTcpConnection.java:262) [apache-cassandra-3.11.9.jar:3.11.9]
  1. 在 system.log 中,它实际上已将所有节点记录为“节点...已重新启动,现在启动”和“节点...状态跳转到正常”。但是我也注意到了这一点,这可能与此无关:
WARN  [GossipStage:1] 2022-05-30 07:22:06,164 Gossiper.java:1693 - \
  Received an ack from /192.168.100.127, who isn't a seed.
  Ensure your seed list includes a live node. Exiting shadow round

有什么方法可以了解正在发生的事情以及为什么会这样吗?我错过了什么吗?

如果您需要更多信息,请告诉我。

对我来说,这看起来像是一个典型的网络问题,因为节点间端口上没有连接(默认为 7000),节点之间无法相互闲聊。您发布的调试消息清楚地说明了原因:

java.net.NoRouteToHostException: No route to host

您需要检查没有像 iptablesfirewalld 这样的防火墙阻止端口 7000 上的流量,否则节点无法相互通信。

使用 Linux 工具(例如 telnetnc 进行测试非常简单。例如,运行 节点 .54 上的此命令:

$ telnet 192.168.100.115 7000

如果您收到“连接被拒绝”错误,则表示以下情况之一为真:

  • 没有到节点的网络路由,
  • 到默认 gossip 端口 7000 的流量被阻止,或者
  • gossip 在另一个端口上配置(在 cassandra.yaml
  • 中检查 storage_port

但根据我的经验,最可能的原因是流量被防火墙阻止了。干杯!