Partitioners

Partitioners

分区程序确定数据如何分布在集群中的节点(包括副本)上。基本上,分区器是一个函数,用于从其分区键派生表示一个行的标记,通常通过散列。然后每行数据通过标记的值分布在整个集群中。

两者Murmur3Partitioner并RandomPartitioner用的令牌,以帮助分配数据给各节点的相等部分和均匀地从整个环或其它分组的所有表,如一个密钥空间分配数据。即使这些表使用不同的分区键(如用户名或 时间戳)也是如此。此外,对群集的读写请求也均匀分布,因为散列范围的每个部分平均接收相同数量的行,所以简化了负载均衡。有关更多详细信息,请参阅一致性散列。

两个分区之间的主要区别在于每个分区如何生成令牌哈希值。在RandomPartitioner使用加密哈希是需要较长时间才能产生比Murmur3Partitioner。Cassandra并不需要加密散列,因此使用Murmur3Partitioner 结果的性能提高了3-5倍。

Cassandra提供了以下可以在cassandra.yaml文件中设置的分区。

  • Murmur3Partitioner(默认):基于MurmurHash散列值在集群中统一分配数据。
  • RandomPartitioner:基于MD5哈希值在整个集群中统一分配数据。
  • ByteOrderedPartitioner:通过关键字节保持数据的有序分布。

这Murmur3Partitioner是Cassandra 1.2及更新版本的默认分区策略,也是几乎所有情况下新集群的正确选择。但是,分区不兼容,用一个分区程序分区的数据不能轻易转换为其他分区程序。

注意:如果使用虚拟节点(虚拟节点),你就不会需要计算的标记。如果不使用vnodes,则必须计算要分配给cassandra.yaml文件中的initial_token参数 的标记。请参阅生成令牌,并使用您正在使用的分区程序类型的方法。

Murmur3Partitioner
Murmur3Partitioner提供了快速的哈希和良好的性能。

RandomPartitioner
Cassandra 1.2之前的默认分区程序。

ByteOrderedPartitioner
Cassandra提供了用于有序分区的分区器。包含它是为了向后兼容。

Murmur3Partitioner

Murmur3Partitioner是默认分区程序。Murmur3Partitioner比RandomPartitioner提供了更快的哈希和更好的性能。该 Murmur3Partitioner可以用虚拟节点使用。但是,如果您不使用vnodes,则必须按照“ 生成标记”中所述计算标记。

使用Murmur3Partitioner新的集群; 您不能更改使用不同分区程序的现有集群中的分区程序。在Murmur3Partitioner使用murmur哈希函数。此散列函数创建分区键的64位散列值。散列值的可能范围是从-2 63到+2 63 -1。

在使用时Murmur3Partitioner,可以使用CQL查询中的标记函数来遍历所有行 。

RandomPartitioner

这RandomPartitioner是Cassandra 1.2之前的默认分区程序。包含它是为了向后兼容。RandomPartitioner可以与虚拟节点(vnodes)一起使用。但是,如果不使用vnode,则必须按照“ 生成令牌”中所述计算令牌。 RandomPartitioner使用行密钥的MD5散列值在整个节点间平均分配数据。散列值的可能范围是从0到2 127 -1。

在使用时RandomPartitioner,可以使用CQL查询中的标记函数来遍历所有行 。

ByteOrderedPartitioner

Cassandra提供了ByteOrderedPartitioner有序的分区。包含它是为了向后兼容。此分区程序按关键字节按字面顺序排序。您通过查看分区密钥数据的实际值并使用键中前导字符的十六进制表示来计算令牌。例如,如果您想要按字母顺序对行进行分区,则可以使用十六进制表示形式41来分配A标记。

使用有序分区程序允许通过主键进行有序扫描。这意味着您可以像扫描传统索引中的光标那样扫描行。例如,如果您的应用程序具有用户名作为分区键,则可以扫描名称介于Jake和Joe之间的用户的行。这种类型的查询不可能使用随机分区的分区键,因为这些键按照其MD5哈希(不是按顺序)的顺序存储。

尽管有能力在行上进行范围扫描听起来像是有序分区器的一个理想特性,但是有办法使用表索引来实现相同的功能。

由于以下原因,建议不要使用有序分区程序:

难以负载平衡

  • 负载平衡群集需要更多的管理开销。有序的分区程序要求管理员根据分区键分布的估计来手动计算分区范围。实际上,这需要主动移动节点令牌,以便在数据加载后适应数据的实际分布。

顺序写入会导致热点

  • 如果您的应用程序倾向于一次写入或更新一个连续的行块,那么这些写入不会在群集中分布; 他们都去一个节点。对于处理时间戳数据的应用程序而言,这经常是一个问题。

对多个表格进行不均衡的负载平衡

  • 如果您的应用程序具有多个表,那么这些表有可能具有不同的行键和不同的数据分布。对一个表进行平衡的有序分区器可能会导致同一集群中另一个表的热点和不均匀分布。

你可能感兴趣的:(Cassandra数据修复)