我听说过 Cassandra 及其发行版。真的想知道数据在整个集群中是如何分布的现象吗?我的意思是 Cassandra 如何决定哪些节点拥有哪些数据?
3 回答
如果您了解 HastTable 数据结构以及如何在 Hashtable 中完成散列,则非常简单。
哈希表
STEP 1. 基本上,哈希表中键的索引是如何确定的
index = hashfunc(key_you_want_to_distribute) % array_size
寻找选择散列函数的详细信息。
第2 步。 然后要检索您想要的数据,您只需给它您想要查找的值。它将为该值创建哈希并查找该索引。
卡桑德拉
它在 Distribute Hashtables/ Cassandra 中的工作方式相同。
步骤1。在 cassandra 中,您必须指定要包含的记录中的哪些字段以创建哈希。说,如果你有一张桌子User
。您可能希望按用户分配用户username
,因此您决定将其作为主键。
您选择创建哈希的字段在 Cassandra 世界中称为分区键,因为它是分区记录的决定因素。
然后,Cassandra 为您要插入的记录创建哈希,然后根据您的节点/机器的范围,分发记录。
假设您有 3 个节点,哈希范围如下,
node1 | 1 - 2000
node2 | 2000 - 4000
node3 | 4000 - 6000
例如,见下表,我给出了随机散列以使其简单。Cassandra 实际使用 Murmur3 哈希。
username | hash(example) | which node it goes to |
----------|---------------|------------------------|
prayagupd | 1 | node1 |
mike | 3000 | node2 |
zach | 5000 | node3 |
第2步。然后,如果您想使用 username 检索用户'prayagupd'
,cassandra 将为它创建哈希,说它1
并且它知道 1 属于 node1 (1-2000)。
答对了!!!
同样重要的是要了解 cassandra 中的一个分区都驻留在一个节点上,而其他东西(例如 cassandra 项目的开源 playorm)在所有节点上都有一个分区,因此在访问单个分区中的大量记录时可以获得更多的磁盘并行性。如果你需要从一个分区中获取 500k 条记录,你可能不想使用 cassandra 分区,而是像 PlayOrm 那样做你自己的虚拟分区。
负责任何给定数据的节点集(单个节点或多个节点)由以下因素决定:
- 行键(数据在行键上分区)
- 复制因子
- 复制策略
重要的是要了解 Cassandra 不会根据变化的特征(例如当前负载、哪些节点启动或关闭,或者您的客户端碰巧与哪个节点通信)来更改给定行键的副本集。
有关更多详细信息,请参阅cassandra 常见问题解答