两个 Cassandra DC 在 nodetool describecluster 中逐渐变得不可访问

Posted

技术标签:

【中文标题】两个 Cassandra DC 在 nodetool describecluster 中逐渐变得不可访问【英文标题】:Two Cassandra DCs become Unreachable in nodetool describecluster gradually 【发布时间】:2017-06-28 23:12:04 【问题描述】:

我建立了一个由两个 DC 组成的 Cassandra 集群,一个在美国东部,一个在美国西部。没有***/网关。每次我重新启动整个集群时,nodetool describecluster 都会报告一切正常,并且具有一致级别 ALL 的长读取工作正常。

然而,几分钟后,每个节点上的“describeculster”显示一个UNREACHABLE: [xxx.xxx, ...],unreachable set逐渐增加,直到两个DC互不可达。并且读取请求在 ReadTimeoutException 上失败。

但是每个节点上的任何“nodetool status”运行都会报告所有节点正常。 ssh 到节点并 ping 另一个 DC 也可以正常工作。

增加read_request_timeout_in_ms,调GC并不能解决问题。

任何想法为什么会发生这种情况?

casandra.yaml: 监听地址:private_ip rpc_address:0.0.0.0 广播rpc_address:public_ip 广播地址:public_ip

【问题讨论】:

日志中有错误吗? 没有错误。仅警告 jmx 端口未打开。并且在启动时说 gc pause 大于 Cassandra-env.sh 中的 jvm 设置,但没有将节点标记为关闭。然后所有日志都清理干净。我想我需要打开更多日志。你能推荐一些我应该尝试的东西吗? 最后这一行 system.log 将我引向这个问题***.com/questions/42477913/… 和我自己的答案:INFO [SharedPool-Worker-4] 2017-06-30 16:33:27,772 Message.java: 536 - 请求期间出现意外异常;频道 = [id: 0x4c8011ee, L:/10.2.1.100:9042 ! R:/167.220.0.104:57169] io.netty.channel.unix.Errors$NativeIoException: readAddress() failed: Connection timed out at io.netty.channel.unix.Errors.newIOException(Errors.java:117) ~[ netty-all-4.0.44.Final.jar:4.0.44.Final] 【参考方案1】:

经过几轮搜索和调整。我现在主要可以缓解这个问题。

GC 调整。 将 read_request_timetout_in_ms 增加到更高的级别,但这最多只能隐藏问题。

这个应该是关键的。当流量较低时,您的基础设施提供商的防火墙设置可能会休眠空闲连接。所以保持 tcp 的存活时间更长。根据 DataStax,

sudo sysctl -w net.ipv4.tcp_keepalive_time=60 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_keepalive_intvl=10

我的系统默认设置是 75、9 和 300。 http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/troubleshooting/trblshootIdleFirewall.html

其他调整,例如设置网关和 DC 之间的 vnet2vnet *** 连接没有帮助。

【讨论】:

以上是关于两个 Cassandra DC 在 nodetool describecluster 中逐渐变得不可访问的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra数据存储:数据目录空间不等于占用空间

利用DC/OS平台部署Cassandra

Cassandra通过GCP上的VPN进行DC同步

Cassandra复制因子:需要节点具有完整的报告数据

nodetool 清理后磁盘空间使用量增加 - Apache Cassandra

Apache Cassandra:auto_bootstrap 属性是不是允许新(非种子)节点从另一个 DC 中的节点流式传输数据?