【发布时间】:2016-07-21 12:57:15
【问题描述】:
我听说过 Cassandra 及其发行版。真的想知道数据在整个集群中是如何分布的现象吗?我的意思是 Cassandra 如何决定哪些节点拥有哪些数据?
【问题讨论】:
标签: cassandra
我听说过 Cassandra 及其发行版。真的想知道数据在整个集群中是如何分布的现象吗?我的意思是 Cassandra 如何决定哪些节点拥有哪些数据?
【问题讨论】:
标签: cassandra
如果您了解 HastTable 数据结构以及如何在 Hashtable 中完成哈希,那就很简单了。
第 1 步。 基本上,在 hashtable 中 key 的索引是如何决定的
index = hashfunc(key_you_want_to_distribute) % array_size
详情请联系choosing hash function。
第 2 步。 然后要检索您想要的数据,您只需给它您想要查找的值。它将为该值创建哈希并查找该索引。
它在 Distribute Hashtables/ Cassandra 中的工作方式相同。
STEP1. 在 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 |
STEP2. 然后如果你想用用户名'prayagupd' 检索用户,cassandra 将为它创建哈希,比如它的1,它知道 1 属于 node1 (1-2000 )。
宾果游戏!!!
【讨论】:
负责任何给定数据的节点集(单个或多个)由以下因素决定:
请务必了解,Cassandra 不会根据当前负载、哪些节点启动或关闭或您的客户端碰巧与哪个节点通信等不断变化的特征来更改给定行键的副本集。
更多详情请通过cassandra FAQ
【讨论】:
了解 cassandra 中的一个分区都驻留在一个节点上也很重要,而其他项目(例如 cassandra 项目的开源 playorm)在所有节点上都有一个分区,因此在访问大量记录时可以获得更多磁盘并行性单分区。如果您需要从一个分区中获取 500k 条记录,您可能不想使用 cassandra 分区,而是像 PlayOrm 那样进行自己的虚拟分区。
【讨论】: