我对 Cassandra 种子节点以及客户端如何连接到集群感到有些困惑。我似乎无法在文档中找到这一点信息。
客户端是否仅包含种子节点的列表,并且每个节点都委派一个新主机供客户端连接?种子节点真的只用于节点到节点的发现,而不是客户端的特殊节点吗?
每个客户端是否应该使用 DC 中的一小部分随机节点进行连接?
或者,每个客户端都应该使用 DC 中的所有节点吗?
我对 Cassandra 种子节点以及客户端如何连接到集群感到有些困惑。我似乎无法在文档中找到这一点信息。
客户端是否仅包含种子节点的列表,并且每个节点都委派一个新主机供客户端连接?种子节点真的只用于节点到节点的发现,而不是客户端的特殊节点吗?
每个客户端是否应该使用 DC 中的一小部分随机节点进行连接?
或者,每个客户端都应该使用 DC 中的所有节点吗?
回答我自己的问题:
种子
从常见问题解答:
在启动期间使用种子来发现集群。
同样来自“Gossip”的DataStax 文档:
除了引导新节点加入集群的八卦过程之外,种子节点的指定没有其他目的。种子节点不是单点故障,除了节点引导之外,它们在集群操作中也没有任何其他特殊用途。
从这些细节来看,种子对客户来说似乎没什么特别的。
客户
从有关客户请求的DataStax 文档中:
Cassandra 中的所有节点都是对等节点。客户端读取或写入请求可以发送到集群中的任何节点。当客户端连接到节点并发出读取或写入请求时,该节点充当该特定客户端操作的协调器。
协调器的工作是充当客户端应用程序和拥有所请求数据的节点(或副本)之间的代理。协调器根据集群配置的分区器和副本放置策略确定环中的哪些节点应该获取请求。
我收集到客户端连接到的节点池可能只是 DC 中的少数(随机?)节点,以允许潜在的故障。
种子节点有两个目的。
cassandra 客户端联系点只是向客户端提供集群拓扑,之后客户端可以连接到集群中的任何节点。因此,它们类似于种子节点,并且对种子和客户端联系人使用相同的节点是有意义的。但是,您可以安全地配置任意数量的 cassandra 客户端联系点。唯一的其他考虑因素是客户端联系的第一个节点设置其数据中心亲和性,因此您可能希望订购您的联系点以首选给定的数据中心。
有关接触点的更多详细信息,请参阅此问题:Cassandra Java 驱动程序:多少个接触点是合理的?
你的回答是对的。我唯一要补充的是,建议在整个集群中使用相同的种子列表(即在您的 cassandra.yaml 中),作为“最佳实践”之类的东西。帮助八卦流量以良好的常规速率传播,因为八卦代码(参见https://cwiki.apache.org/confluence/display/CASSANDRA2/ArchitectureGossip)对种子的处理(非常少)不同。