【发布时间】:2015-10-18 15:16:02
【问题描述】:
我已经阅读了很多关于 Cassandra 的文章和很多关于 SO 的问题/答案,但我仍然无法弄清楚 Cassandra 在读取数据时如何决定去哪个节点。
首先,关于虚拟集群的一些假设:
- 复制策略 = 简单
- 使用随机分区器
- 10 个节点的集群
- 复制因子为 5
以下是我根据我阅读的各种 Datastax 文章和其他博客文章对写入工作原理的理解:
- 客户端将数据发送到随机节点
- “随机”节点是根据主键的 MD5 哈希值决定的。
数据写入 commit_log 和 memtable,然后传播 4 次(RF = 5)。
然后选择环中的 4 个下一个节点并将数据持久保存在其中。
到目前为止,一切都很好。
现在的问题是,当客户端向集群发送读取请求(比如 CL = 3)时,Cassandra 如何知道它需要联系哪些节点(最坏的情况是 10 个节点中的 5 个)才能获得这个数据?当然它不会用到所有 10 个节点,因为那样效率很低。
我是否正确假设 Cassandra 将再次对(请求的)主键进行 MD5 哈希并根据该哈希选择节点然后遍历环?
另外,网络拓扑案例是如何工作的?如果我有多个数据中心,Cassandra 如何知道每个 DC/Rack 中的哪些节点包含数据?据我了解,只有第一个节点是明显的(因为主键的哈希已明确导致该节点)。
对不起,如果问题不是很清楚,如果您需要有关我的问题的更多详细信息,请添加评论。
非常感谢,
【问题讨论】: