以后,请尽量将自己限制在每个问题一个问题上。几乎所有这些都可以作为一个问题独立存在。
- 有些文章说memtable中的行是按行键排序的,但有些文章说它就像一个哈希表,对吗?
Cassandra 将其数据存储在(Strickland,2014)“分布式哈希表数据结构”中。这允许数据在集群中均匀地存储和分布,但仍然可以快速查询。行键(又名分区键)的值使用称为Consitent Hashing的过程进行散列。然后将数据存储在集群中,无论哪个节点负责包含密钥散列值的令牌范围。当您在不指定子句的情况下运行 CQL 查询时,您可以通过使用该函数WHERE
看到结果集的顺序受散列行键值的影响。token()
> SELECT userid, token(userid), posttime FROM postsbyuser;
userid | token(userid) | posttime
--------+----------------------+--------------------------
1 | -4069959284402364209 | 2015-01-25 13:25:00-0600
1 | -4069959284402364209 | 2015-01-25 13:22:00-0600
0 | -3485513579396041028 | 2015-01-25 13:21:00-0600
2 | -3248873570005575792 | 2015-01-25 13:28:00-0600
2 | -3248873570005575792 | 2015-01-25 13:27:00-0600
2 | -3248873570005575792 | 2015-01-25 13:26:00-0600
- 关于分区器:由于cassandra中基本上有两个分区器:RandomPartitioner和ByteOrderedPartitioner,memtable中的行顺序与我选择的分区器有关吗?(例如,如果我选择 RP,那么行会像哈希表一样存储,如果我选择 BOP,那么行是按键排序的吗?)
最终,是的,Random partitioner 和 Byte Ordered partitioner 将以不同的方式在环上分布数据。实际上,您缺少默认的分区器,即 Murmur3Partitioner。Murmur3 分区器与 Random 分区器具有相同的目标,即确保数据分布均匀。在一个新的集群中,你应该使用 Murmur3 分区器,这里已经回答了两者的区别:哪个是更好的分区器。cassandra中的随机或Murmur3在吞吐量方面有什么区别?
出于向后兼容性的原因,BOP 仍然包含在内,并且真的不应该再使用了。还详细讨论了应避免 BOP 的原因:Cassandra ByteOrderedPartitioner
- 如果行是按键排序的,memtable 如何处理插入?(插入会导致行移动吗?)
摘自 DataStax 文档The Write Path of an Update很好地解释了这一点。并且不要介意标题...插入和更新与 Cassandra 基本相同。
更新使用顺序 I/O 流式传输到磁盘并存储在新的 SSTable 中。在更新期间,Cassandra 使用写入路径标记列并将列写入磁盘。在更新过程中,如果 memtable 中存在多个版本的列,Cassandra 仅将较新版本的列刷新到磁盘
文档The Write Path to Compaction的最后一段摘录回答了这个问题的最后一部分:
为了刷新数据,Cassandra 按令牌对内存表进行排序,然后按顺序将数据写入磁盘。
- cassandra隐式维护的主索引(行键索引)有什么关系吗?
如果我理解这个问题,这个 Cassandra 1.1 文档(关于 Cassandra 中的索引)可能有点过时,但通过比较它的 RDBMS 对应物来解释这一点:
在 Cassandra 中,列族的主索引是其行键的索引。每个节点都为其管理的数据维护此索引。
行由集群配置的分区器和键空间配置的副本放置策略分配给节点。Cassandra 中的主索引允许通过行键查找行。由于每个节点都知道每个节点管理的键范围,因此可以通过仅扫描相关副本上的行索引来有效地定位请求的行。
希望这能回答你的问题。
参考:
斯特里克兰河 (2014)。 卡桑德拉高可用性。Packt Publishing Ltd. 英国伯明翰。(第 19-24 页)。