我听说过卡桑德拉及其分布。实际上想了解数据在整个集群中的分布情况?我的意思是Cassandra如何决定哪些节点有哪些数据?
答案 0 :(得分:2)
如果您了解HastTable数据结构以及如何在Hashtable中完成散列,那么非常简单。
第1步。 基本上,如何在哈希表中确定密钥的索引是
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 |
第2步。然后,如果您要检索用户名为'prayagupd'
的用户,cassandra将为其创建哈希值,例如1
,并且它知道1属于node1 (1-2000)。
宾果!!!
答案 1 :(得分:1)
负责任何给定数据的节点集(单个节点或几个节点)由以下因素确定:
重要的是要理解Cassandra不会根据当前负载,节点上升或下降或客户端碰巧与哪个节点交互等特性改变给定行键的副本集。
有关详情,请浏览cassandra FAQ
答案 2 :(得分:1)
理解cassandra中的分区都驻留在一个节点上也很重要,而cassandra项目的开源playorm等其他东西都有一个驻留在所有节点上的分区,因此当访问大量记录时,您可以获得更多的磁盘并行性。单个分区。如果您需要从分区获取500k记录,您可能不想使用cassandra分区,而是像PlayOrm那样进行自己的虚拟分区。