部分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。还要补充一点,这几周没有写入。
我已经尝试在所有节点上启用、禁用八卦并重新启动 cassandra。生成标记在 system_auth table 中是最新的。我可以使用 cqlsh 连接到这些节点,但正如预期的那样,在某些情况下我得到 NoHostAvailable 因为一些数据位于“死”节点上。
nodetool describecluster 显示 DN 节点不可访问,这取决于我正在执行它的节点。因此,即 .54 将 .164、.115、.147 和 .19 显示为无法访问。
同样在 nodetool gossipinfo 中,一切看起来都正常,状态:正常和最新的生成。
在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]
- 在 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
您需要检查没有像 iptables
或 firewalld
这样的防火墙阻止端口 7000
上的流量,否则节点无法相互通信。
使用 Linux 工具(例如 telnet
或 nc
进行测试非常简单。例如,运行 节点 .54
上的此命令:
$ telnet 192.168.100.115 7000
如果您收到“连接被拒绝”错误,则表示以下情况之一为真:
- 没有到节点的网络路由,
- 到默认 gossip 端口
7000
的流量被阻止,或者
- gossip 在另一个端口上配置(在
cassandra.yaml
中检查 storage_port
但根据我的经验,最可能的原因是流量被防火墙阻止了。干杯!
我有一个 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。还要补充一点,这几周没有写入。
我已经尝试在所有节点上启用、禁用八卦并重新启动 cassandra。生成标记在 system_auth table 中是最新的。我可以使用 cqlsh 连接到这些节点,但正如预期的那样,在某些情况下我得到 NoHostAvailable 因为一些数据位于“死”节点上。
nodetool describecluster 显示 DN 节点不可访问,这取决于我正在执行它的节点。因此,即 .54 将 .164、.115、.147 和 .19 显示为无法访问。
同样在 nodetool gossipinfo 中,一切看起来都正常,状态:正常和最新的生成。
在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]
- 在 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
您需要检查没有像 iptables
或 firewalld
这样的防火墙阻止端口 7000
上的流量,否则节点无法相互通信。
使用 Linux 工具(例如 telnet
或 nc
进行测试非常简单。例如,运行 节点 .54
上的此命令:
$ telnet 192.168.100.115 7000
如果您收到“连接被拒绝”错误,则表示以下情况之一为真:
- 没有到节点的网络路由,
- 到默认 gossip 端口
7000
的流量被阻止,或者 - gossip 在另一个端口上配置(在
cassandra.yaml
中检查
storage_port
但根据我的经验,最可能的原因是流量被防火墙阻止了。干杯!