Cassandra如何选择节点发送请求?

想象一下,客户端应用程序需要访问Cassandra集群。 在Java api中,我们创建一个集群实例并通过Session发送读或写请求。 如果我们使用读/写一致性ONE,api如何选择实际节点(协调器节点)以转发请求。 这是随机选择吗? 请帮助解决这个问题。

Cassandra驱动程序使用“八卦”协议(以及称为节点发现的过程)来获取有关群集的信息。 如果节点变得不可用,则客户端驱动程序会自动尝试其他节点并安排与死亡节点重新连接的时间。 根据DataStax文档 :

Gossip是一种点对点通信协议,其中节点定期交换关于他们自己和他们所知道的其他节点的状态信息。 八卦过程每秒运行一次,并与群集中最多三个其他节点交换状态消息。 节点交换有关他们自己以及他们闲聊的其他节点的信息,因此所有节点都可以快速了解集群中的所有其他节点。

实际上,您为客户端提供连接的节点列表是获取整个群集信息的初始联系点。 这就是为什么您的客户端可以与群集中的所有节点通信(如果需要),即使您可能只在连接字符串中提供一小部分节点。

一旦您的驱动程序在群集上获得了八卦信息,它就可以明智地决定运行查询的节点。 节点选择不是投票或随机选择的过程。 根据返回的八卦信息,客户端驱动程序应用其负载平衡策略 。 虽然它确实需要考虑几个因素,但基本上它会尝试选择与客户端具有最低网络“距离”的节点。