假设客户端应用程序需要访问Cassandra集群。在Java中,我们创建一个集群实例,并通过会话发送读或写请求。如果我们使用读/写一致性一,api如何选择实际节点(协调器节点)来转发请求。是随机选择吗?请帮忙弄清楚这件事。
发布于 2014-11-22 15:05:32
Cassandra驱动程序使用“八卦”协议(以及一个称为节点发现的过程)来获取有关集群的信息。如果节点不可用,客户端驱动程序将自动尝试其他节点,并安排与死节点的重新连接时间。根据到DataStax文档
八卦是一种点对点的通信协议,在这种协议中,节点周期性地交换关于自己和他们所知道的其他节点的状态信息。流言过程每秒钟运行一次,并与集群中最多三个其他节点交换状态消息。这些节点交换关于自己的信息,以及它们讨论过的其他节点的信息,因此所有节点都能快速了解集群中的所有其他节点。
本质上,为客户端提供要连接的节点列表是获取整个集群信息的初始联络点。这就是为什么您的客户端可以与集群中的所有节点进行通信(如果需要的话),即使您只能在连接字符串中提供一小部分节点。
一旦您的驱动程序获得了集群上的流言信息,它就可以对在哪个节点上运行查询做出明智的决定。节点选择不是一个投票或随机选择的过程。根据返回的流言信息,客户端驱动程序应用其负载平衡策略。虽然它确实考虑了几个因素,但基本上它尝试从客户端选择网络“距离”最小的节点。
编辑20200322
让我就负载平衡策略的问题进行一些阐述。我鼓励高性能应用程序的开发人员使用TokenAwarePolicy.。此策略将分区键值散列为“令牌”,并使用此散列来确定哪个节点负责生成令牌范围。这将跳过选择“协调器”节点的中间步骤,并将查询直接发送到包含请求数据的节点。
但是,如果您使用的是非令牌感知的负载平衡策略,或者运行的查询不对分区键进行筛选,则应用上面描述的原始过程。
https://stackoverflow.com/questions/27077701
复制相似问题