cassandra 3.x官方文档(4)---分区器
写在前面
cassandra3.x官方文档的非官方翻译。翻译内容水平全依赖本人英文水平和对cassandra的理解。所以强烈建议阅读英文版cassandra 3.x 官方文档。此文档一半是翻译,一半是个人对cassandra的认知。尽量将我的理解通过引用的方式标注,以示区别。另外文档翻译是项长期并有挑战的工作,如果你愿意加入cassandra git book,可以发信给我。当然你也可以加入我们的QQ群,104822562。一起学习探讨cassandra.
一个分区器决定了数据将会在集群中的节点中如何分布(包括副本)。从根本上说,一个分区器就是一个方法,根据hash从partition key产生一个token,代表一行数据。每一行数据会通过这个hash值分布在集群中。
Murmur3Partitioner 和RandomPartitioner 都是使用token将数据均匀分配到每个节点。通过ring或者其他的分组方式如keyspace,将来自所有table的数据均匀的分配。这是事实即使表使用不同的partition keys,比如usernames,或者timestamps.不仅如此,到集群的读和写请求也能均匀的分布。负载均衡被简化了因为每一部分的hash值范围都平均收到相同数量的行。更多详细的信息,请看一致性hash
这两个分区器的主要不同点在于如何去产生token hash值。RandomPartitioner 使用加密hash所以相比较Murmur3Partitioner需要花费更多的时间去产生hash值。Cassandra实际上并不需要一个加密的hash,因此使用Murmur3Partitioner能够有3-5倍的性能提升。
Cassandra提供一下partitioners,可以在cassandra.yaml文件中配置。
Murmur3Partitioner(默认): 基于MurmurHash hash值将数据均匀的分布在集群
RandomPartitioner: 基于MD5 hash值将数据均匀的分布在集群中
ByteOrderedPartitioner: 通过键的字节来保持数据词汇的有序分布
Murmur3是Cassandra1.2+ 默认的分区策略。这也是大多数情况新的集群的正确的选择。然而,分区器并不是可适应的。数据通过某个分区器分区后,不是很容易就能转换为另一个分区器的。
Note
如果使用了虚拟节点,你不需要去计算tokens.如果不使用虚拟节点,必须要计算tokens,然后分配给cassandra.yaml文件中[initial_token](http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__initial_token)参数。可以参考Generating tokens,然后使用你用的分区器对应的方法来产生token。
Murmur3Partitioner
Murmur3Partitioner 是默认的分区器,提供了更快的hashing.相比较其他的分区器,极大的提高了性能。Murmur3Partitioner 可以在虚拟节点情况下使用,如果你不使用虚拟节点,你必须要计算tokens。像Generating tokens中描述的一样。
在新集群中使用Murmur3Paritioner;你不能在一个现有的集群中更换分区器,去使用一个不同的分区方式。Murmur3Partitioner 使用MurmurHash方法,这个hashing方法为partition key创建一个64位的hash值。可能的范围值是-2^63 到(2^63)-1.
使用Murmur3Partitioner,可以在一个CQL 查询中使用token function 对结果分页
RandomPartitioner
RandomPartitioner 是Cassandra1.2之前版本的默认分区器,为了后续兼容性被包含进来了。RandomPartitioner可以和虚拟节点一起使用,然而,如果你不使用虚拟节点,你必须要计算tokens。像Generating tokens中描述的一样。RandomPartitioner 使用行key的MD5 hash值将数据均匀的分布在集群的节点上,hash 值的范围值是(2^127)-1
使用Murmur3Partitioner,可以在一个CQL 查询中使用token function 对结果分页
ByteOrderedPartitioner
Cassandra提供ByteOrderedPartitioner为的是有序分区。为了后续兼容性被包含进来了。通过键的字节来对行词汇进行排序。可以看partition key数据的实际值来计算token,采用16进制表示key的首字母。例如,如果你想让行按字母顺序排列,你可以指定一个tokenA使用16进制的41表示。
使用有序分区器允许通过主键有序扫描。这意味着你可以扫描行就好像在索引中移动游标。例如,如果你的程序使用user names作为行键值,你可以扫描用户(姓名在Jake和Joe之间)。这对于Random分区器,这种方式的查询是做不到的,因为键值按照MD5的顺序存储,而不是顺序的。
尽管对于有序分区器来说扫描行这种能力听起来是一个分棒的特性,但通过table indexes也能实现同样的功能。
因为以下原因,不建议使用有序分区器:
负载平衡难
需要更多的管理开销去实现集群的负载平衡。一个顺序的分区器需要管理员根据行键值的可能的分布情况去手动计算 partition ranges。在实践中,一旦数据已经加载后,需要经常性的改变节点的token去适应实际数据的分布。
顺序写导致热点
如果你的程序在某一段时间内的写入或者更新包含很多按顺序排列的行的时候,它们不会均匀的分布在集群上,会分布同一节点上。当系统处理和时间相关的数据的时候这是一个常见的问题。
多表时负载不平衡
如果你的应用程序用到多个表,这些表有不同的行键值和不同的数据分布。在同一个集群中,对于一张表一个有序的分区对于另一个表可能会导致热点和不均匀分布。
cassandra 3.x官方文档(4)---分区器的更多相关文章
- cassandra 3.x官方文档(2)---架构解析
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- cassandra 3.x官方文档(7)---内部原理之如何读写数据
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- cassandra 3.x官方文档(6)---内部原理之存储引擎
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- cassandra 3.x官方文档(5)---探测器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- cassandra 3.x官方文档(3)---gossip通信协议及故障检测与恢复
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- Cassandra 3.x官方文档(1)---关于Cassandra
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- NHibernate官方文档中文版--拦截器和事件(Interceptors and events)
对于应用程序来说,能够对NHibernate内部发生的事件做出响应式很有用的.这能够有助于实现一些类的功能或者扩展NHibernate的功能. 拦截器 IInterceptor接口提供了应用程序ses ...
- Spark官方文档 - 中文翻译
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
- Lagom 官方文档之随手记
引言 Lagom是出品Akka的Lightbend公司推出的一个微服务框架,目前最新版本为1.6.2.Lagom一词出自瑞典语,意为"适量". https://www.lagomf ...
随机推荐
- POJ-1135 Domino Effect---最短路Dijk
题目链接: https://vjudge.net/problem/POJ-1135 题目大意: 有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的.已知每一条路径上的骨牌 ...
- digest-MD5认证
digest-MD5认证机制是基于MD5算法的LINUX安全机制认证. 会比较用户端传送的杂凑值与使用者密码的杂凑值,以认证用户端. 但由于此机制必须读取使用者密码,因此,所有想透过digest-MD ...
- window下编辑了脚本文件linux报如下错误
首先vi :set ff 查看文件类型 接着 下载dos2unix root用户下yum -y install dos2unix 然后 dos2unix 文件.sh 转换格式 接着在正常启动即可
- python3安装ibm_db
在安装好python3之后,使用pip install ibm_db总是报错. 然后按照官方文档的说明添加了环境变量IBM_DB_HOME, 同时在命令行执行easy_install ibm_db就可 ...
- IIS7 http自动跳转到https
1.下载安装URL重写模块:Microsoft URL Rewrite Module 32位:http://download.microsoft.com/download/4/9/C/49CD28DB ...
- Lua版组合算法
高效率的排列组合算法--<编程珠矶>--Lua实现 原文链接 原文是python实现的,这里给出lua版本的实现 组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素 ...
- Python更新pip出现错误解决方法
Python更新pip出现错误解决方法 更新pip python -m pip install --upgrade pip 查看时报错 解决方法 在命令栏(即win+r)输入:easy_install ...
- Shiro整合Spring
首先需要添加shiro的spring整合包. 要想在WEB应用中整合Spring和Shiro的话,首先需要添加一个由spring代理的过滤器如下: <!-- The filter-name ma ...
- Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)
C题卡了好久,A掉C题之后看到自己已经排在好后面说实话有点绝望,最后又过了两题,总算稳住了. AC:ABCDE Rank:191 Rating:2156+37->2193 A.Oath of t ...
- Linux添加系统调用的两种方法
前言 系统调用的基本原理 系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态.在内核中通过软中断0X80, ...