我对Cassandra种子节点以及客户端如何连接到集群有些困惑。在文档中似乎找不到这部分信息。
客户端是否只包含种子节点的列表,每个节点都会为其委派一个新的主机以供客户端连接?种子节点是否仅用于节点间发现,而不是专门为客户端提供服务的特殊节点?
每个客户端应该使用DC中少量随机节点进行连接吗?
还是说,每个客户端应该使用DC中的所有节点?
我对Cassandra种子节点以及客户端如何连接到集群有些困惑。在文档中似乎找不到这部分信息。
客户端是否只包含种子节点的列表,每个节点都会为其委派一个新的主机以供客户端连接?种子节点是否仅用于节点间发现,而不是专门为客户端提供服务的特殊节点?
每个客户端应该使用DC中少量随机节点进行连接吗?
还是说,每个客户端应该使用DC中的所有节点?
回答我的问题:
Seeds
从FAQ中可以得知,种子用于在启动时发现集群。
还从DataStax文档关于"Gossip"的内容中了解到:
种子节点的指定除了用于为加入集群的新节点引导gossip进程外,没有其他目的。种子节点不是单点故障,也没有在集群操作中任何特殊目的,除了引导节点。
从这些细节中可以看出,对于客户端来说,种子节点并没有什么特别的作用。
Clients
从DataStax文档关于客户端请求的内容中了解到:
Cassandra中的所有节点都是同等级别的。客户端读取或写入请求可以发送到集群中的任何节点。当客户端连接到节点并发出读取或写入请求时,该节点将作为特定客户端操作的协调器。
协调器的工作是充当客户端应用程序和拥有被请求数据的节点(或副本)之间的代理。协调器根据集群配置的分区器和副本放置策略确定应该向环中的哪些节点发送请求。
我认为,客户端连接的节点池可以只是DC中少量(随机?)的节点,以便应对潜在的故障。
种子节点(seed nodes)有两个作用。
Cassandra客户端联系点(Cassandra client contact points)只需向客户端提供群集拓扑,之后客户端可以连接集群中的任何节点。因此,它们类似于种子节点,因此使用相同的节点作为种子节点和客户端联系点是合理的。但是,您可以安全地配置任意数量的Cassandra客户端联系点。唯一需要考虑的是客户端首先连接的节点将设置其数据中心关联性,因此您可能希望对联系点进行排序以偏好特定的数据中心。
有关联系点的更多详细信息,请参阅此问题:Cassandra Java驱动程序:合理的联系点数量是多少?
你的答案是正确的。我唯一需要补充的是,建议在集群中使用相同的种子节点列表(即在cassandra.yaml文件中),作为"最佳实践"的一部分。这样有助于使gossip流量以良好、规律的速率传播,因为种子节点在gossip代码中被处理(非常小地)不同(请参见https://cwiki.apache.org/confluence/display/CASSANDRA2/ArchitectureGossip)。