Datastax cassandra驱动程序提供有关主机状态的错误元数据信息
我有一个带有2个DC的集群,每个DC包含2个节点。
DC1: 192.168.60.81 192.168.60.82 DC2: 192.168.60.242 192.168.60.247
应用程序连接到192.168.60.81,因此应用程序的本地DC是DC1。
情况1:
最初当所有节点都启动时,当我尝试获取cluster.metadata.allHosts
,它会向我提供有关主机状态为UP的信息。
情况2:
当本地数据中心(DC1)中的任何节点上升或下降时, cluster.metadata.allHosts
会为我提供正确的主机状态信息。
问题:
当远程数据中心(DC2)中的任何节点发生故障时, cluster.metadata.allHosts
主机状态信息正确地显示为DOWN。 但是当同一节点重新启动时,仍然是cluster.metadata.allHosts
将主机状态信息作为DOWN提供给我。
我在Host.StateListener中注册,以查看是否为远程DC中的节点触发了事件。 但不幸的是,当远程DC中的节点重新启动时,它也永远不会通知。
任何帮助,将不胜感激。
所有节点中的Cassandra版本:2.1.4
Datastax java驱动程序版本:2.1.9
我从邮件论坛的Datastax的Andrew Tolbert那里得到了这个答案:
如果驱动程序没有主动尝试重新连接到DOWN节点,则它非常依赖于Cassandra将主机UP事件传递给驱动程序。 我的猜测是你必须使用默认的负载均衡策略或DCAwareRoundRobinPolicy和0 usedRemoteHostsPerRemoteDC,因此永远不会尝试连接到DC2中的节点。 由于您运行的是相当旧版本的C *,我怀疑升级可能有所帮助。
说明:
上面的答案非常有意义,因为我的负载均衡策略是DCAwareRoundRobinPolicy,其中有0个usedRemoteHostsPerRemoteDC。 因此,驱动程序没有尝试重新连接到远程DC中的节点。 因此,远程节点的状态与驱动程序的视图不一致。
谢谢安迪。
- 写入cassandra datastax驱动程序引发的超时
- 为什么Cassandra客户端在没有epoll的情况下失败?
- 如何将Java Long转换为Cassandra的byte ?
- 使用datastax java驱动程序连接到本地cassandra节点?
- Java 8:类JavaLaunchHelper在两者中实现
- java.lang.NoClassDefFoundError:org / apache / spark / Logging
- Cassandra的IN关系对查询有害吗?
- RDD不可序列化的Cassandra / Spark连接器java API
- 如何在Cassandra中执行批处理语句和LWT作为事务