我读过一些关于卡桑德拉的文章和原始论文。现在我对这段记忆感到困惑:
有些文章说memtable中的行是按行键排序的,但是有些文章说它就像一个哈希表,这是对的吗?
关于分区器:因为cassandra中基本上有两个分区器:RandomPartitioner和ByteOrderedPartitioner,memtable中与我选择的分区相关的行的顺序是什么? (例如,如果我选择RP,那么行就像哈希表一样存储,如果我选择BOP,那么行是按键排序的?)
如果按行排序行,memtable句柄如何插入? (插入是否导致行的移动?)
与cassandra隐式维护的主索引(行键索引)有什么关系吗?
答案 0 :(得分:0)
将来,请尝试将每个问题限制为一个问题。几乎所有这些都可以作为一个问题单独存在。
Cassandra将其数据存储在(Strickland,2014)“分布式哈希表数据结构”中。这样可以在群集中均匀地存储和分发数据,但仍然可以快速查询。使用名为Consitent Hashing的进程对行键(也称为分区键)的值进行哈希处理。然后,数据存储在集群中,无论哪个节点负责包含密钥散列值的令牌范围。在未指定WHERE
子句的情况下运行CQL查询时,可以使用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
毫无疑问,是的,随机分区器和字节有序分区器将以不同的方式分布环上的数据。实际上,您缺少默认分区程序,即Murmur3Partitioner。 Murmur3分区器与随机分区器具有相同的目标,即确保数据分布均匀。在新的群集中,您应该使用Murmur3分区程序,这两者之间的差异已在此处得到解答:Which is better partioner. Random or Murmur3 in cassandra in termo of throughput and what is the diffence b/w them?
出于向后兼容的原因,仍然包含BOP,并且实际上不应该再使用它。我们还应详细讨论你应该避免使用BOP的原因:Cassandra ByteOrderedPartitioner
DataStax文档The Write Path of an Update的摘录非常清楚地解释了这一点。并且不介意标题...插入和更新与Cassandra基本相同。
使用顺序I / O将更新流式传输到磁盘并存储在新的SSTable中。 在更新期间,Cassandra使用写入路径标记列并将列写入磁盘。 在更新期间,如果记忆中存在多个版本的列,Cassandra 仅将较新版本的列刷新到磁盘
文档The Write Path to Compaction的最后一段摘录回答了这个问题的最后部分:
为了刷新数据,Cassandra按令牌对memtables进行排序,然后按顺序将数据写入磁盘。
如果我理解这个问题,这个Cassandra 1.1文档(About Indexes in Cassandra)可能有点过时,但是对它的RDBMS对应部分进行了解释:
在Cassandra中,列族的主索引是其行键的索引。每个节点都为其管理的数据维护此索引。
由配置群集的分区程序和密钥空间配置的副本放置策略将行分配给节点。 Cassandra中的主索引允许按行键查找行。由于每个节点都知道每个键的范围 节点管理,通过仅在相关副本上扫描行索引,可以有效地定位请求的行。
希望这能回答你的问题。
参考文献:
Strickland R.(2014)。 Cassandra High Availability。 Packt Publishing Ltd.英国伯明翰。 (第19-24页)。