参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architecturePartitionerAbout_c.html#concept_ds_dwv_npf_fk

  一个分区器决定了数据是怎样分布在集群中的节点上的。通常,一个分区器就是一个hash函数去计算每一行键值的hash值——token。每一行数据通过一个键值唯一标识并且在集群中按token分部。

  Murmur3Partitioner 和 RandomPartitioner都使用token去帮助分配相同部分的数据在每个节点上并均匀的分配所有表中的数据到环上或其他分组(例如keyspace)。即使table使用了不同的行键值,例如用户名或者时间戳。甚至于,集群的读请求和写请求同样也是平均的分布并且负载平衡的,因为平均每部分的Hash范围都接收到相等数目的行。

  Cassandra提供了以下分区器:

•Murmur3Partitioner (默认地): 在集群中均匀地分布数据基于 MurmurHash 哈希值

•RandomPartitioner: 在集群中均匀地分布数据基于 md5 值

•ByteOrderedPartitioner:通过key的字节来保持数据词汇的有序分布

对于新的Cassandra 集群,Murmur3Partitioner 是默认的分区策略,在几乎所有情况下都是正确的选择。

  在 cassandra.yaml文件中指定分区器:

•Murmur3Partitioner: org.apache.cassandra.dht.Murmur3Partitioner

•RandomPartitioner: org.apache.cassandra.dht.RandomPartitioner

•ByteOrderedPartitioner: org.apache.cassandra.dht.ByteOrderedPartitioner

  提示:如果使用虚拟节点,你不需要计算节点的token。如果没有使用虚拟节点,在cassandra.yaml文件中你必须计算token并分配给 initial_token参数。

Murmur3Partitioner

  相比于原来默认地分区器RandomPartitioner,Murmur3Partitioner哈希更快而且性能更好。

  对于新的集群,你完全可以只使用Murmur3Partitioner。你不能改变已有节点的分区器。如果你使用1.2版本的cassandra.yaml,你需要确认修改分区器设置以匹配之前的分区器。

  Murmur3Partitioner使用MurmurHash函数。MurmurHash哈希函数为每一个行键值创建了64比特的哈希值。哈希数值的范围从-263 到2+63.

当使用Murmur3Partitioner的时候,你可以在CQL 3 查询中使用token function为所有行分页。

RandomPartitioner

  Cassandra 1.2之前的默认分页器。

  虽然不再是默认分页器了,你仍然可以在Cassandra 1.2中使用RandomPartitioner,甚至在使用虚拟节点时使用RandomPartitioner。然而,如果你不使用虚拟节点,你必须计算token,就像在 Generating tokens中描述的那样。RandomPartition分发数据使用MD5哈希函数计算行键值。数值范围从0到2127 -1。当使用RandomPartitioner的时候,你可以在CQL 3 查询中使用token function为所有行分页。

ByteOrderedPartitioner

  用来进行有序的分区。

  Cassandra 提供ByteOrderedPartitioner 用来进行有序的分区。这个分区器按key的字节值来进行排序。你可以通过查看行键值的真实数值,采用16进制表示key的首字母来计算token。例如,如果你想让行按字母顺序排列,你可以指定一个tokenA使用16进制的41表示。

  使用有序分区器允许按主键有序遍历。这意味着你可以遍历每一行就好像使用一个游标通过一个传统的数据库索引。例如,如果你的程序使用用户名作为行键值,你可以遍历用户(姓名在 Jake和Joe之间)。对于随即分区器来说这种方式的查询是做不到的,因为键值按照md5的顺序存储,而不是顺序的。

  尽管对于有序分区器来说拥有这种能力听起来是一个非常棒的特性,但通过table indexes也能实现同样的功能。

  因为以下原因,不建议使用有序分区器:

1、困难的负载平衡

  为了保持集群的负载平衡,需要更多的管理开销。一个顺序的分区器需要管理员经常性的计算 partition ranges根据行键值的分布估计。在实践中,但数据加载后需要经常性的改变节点的token去适应实际数据的分布。

2、顺序写导致热点

  如果你的程序写入或者更新一块数据包含很多按顺序排列的行的时候,它们不会分布在集群上,会分布同一节点上。当系统处理和时间相关的数据的时候这是一个常见的问题。

3、多表时负载不平衡

  如果你的应用程序用到多个表,这些表有不同的行键值和不同的数据分布。在同一个集群中,对于一张表一个有序的分区对于另一个表可能会导致热点和不均匀分布。

Cassandra1.2文档学习(4)——分区器的更多相关文章

  1. Cassandra1.2文档学习解读计划——为自己鼓劲

    最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...

  2. Cassandra1.2文档学习(6)—— 客户端数据请求

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  3. Cassandra1.2文档学习(3)——数据分配和复制

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  4. Cassandra1.2文档学习(19)—— CQL索引

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...

  5. Cassandra1.2文档学习(17)—— CQL数据模型(上)

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_anatomy_table_c.ht ...

  6. Cassandra1.2文档学习(16)—— 模式的变化

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_schema ...

  7. Cassandra1.2文档学习(15)—— 配置数据一致性

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...

  8. Cassandra1.2文档学习(14)—— 事务和并发控制

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...

  9. Cassandra1.2文档学习(13)—— 数据读取

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...

随机推荐

  1. C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决

            近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...

  2. PAT 1017

    1017. Queueing at Bank (25) Suppose a bank has K windows open for service. There is a yellow line in ...

  3. 插件就是生产力——那些不能错过的XCode插件们

    古人云"工欲善其事必先利其器",打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径! 晾一下我的武器库,欢迎大家选用:) 全能搜索家CodePilot 2.0 -------- ...

  4. Google前工程经理王忻:如何准备软件工程师的面试

    http://t.jobdu.com/thread-368-1-1.html 导读:原文作者王忻,Google前工程经理,2003年月加入Google,是Google Lively背后的主导力量,是G ...

  5. Spring在Web项目中的三种启动加载的配置

    在最近的项目中,使用到了spring相关的很多东西,有点把spring的配置给搞混了,从网上查到的资料以及整理了一下. 在Web项目中,启动spring容器的方式有三种,ContextLoaderLi ...

  6. 运用surfaceView与MediaPlayer实现播放视频的功能

    该程序运用了surfaceView与MediaPlayer结合,实现播放视频,surfaceView详情请见 SurfaceView的使用 使用了第三方包Volly里面的方法StringQueue下载 ...

  7. JavaScript总结1

    一.JavaScript变量类型.声明.作用域 1.1 数字 number 小数和整数都叫number,以0x或0X开头的表示十六进制.当无穷大时,用Infinity表示(试试 9/0),其他非数字用 ...

  8. 我的第二篇--nginx安装问题之路径问题

    这几天还是一直在搭建nginx,并且要在nginx的基础之上配置naxsi(WAF防火墙)并使它生效,但是随之而来的问题也会有很多,也许因为我是个新手,所以遇到的问题要多,不解的问题也要很多,不知道又 ...

  9. 用expect做自动应答脚本

    Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools).使用它系统管理员可以创 ...

  10. [转]ASP.NET MVC中你必须知道的13个扩展点

    本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...