`

[转载] Cassandra 负载不均衡 与 解决方法

 
阅读更多

源:http://hi.baidu.com/higkoo/blog/item/070ce226b751f0048b82a103.html

 

最近在看Cassandra,但自打配起一个集群后,负载就不均衡了。

Address         Status State   Load            Owns    Token                                       
                                                       134154547520101788379756316570162344774     
10.20.223.115   Up     Normal  138.43 KB       32.81%  19836060994110698319501384270720800576      
10.20.223.116   Up     Normal  143.39 KB       7.93%   33327637713098975372896733928855304024      
10.20.223.113   Up     Normal  143.46 KB       28.38%  81617185997645741434910225007556485361      
10.20.223.114   Up     Normal  133.3 KB        3.01%   86736862331839877952832406350985306765      
10.20.223.117   Up     Normal  138.43 KB       5.90%   96770512718388865179675126530244922092      
10.20.223.112   Up     Normal  138.52 KB       21.97%  134154547520101788379756316570162344774  

    将 auto_bootstrap 设为 true后,只有一个节点的Token发生了变化。整体均衡度没有明显变化。

     由于是初次接触Cassandra,怀疑是否有做过错误的配置而未被发现。

     于是尝试重新搭建环境、增、删节点,均以失败告终。

      也有朋友怀疑是数据量少或运行时间少导致的。但我看官方的数据,仅1G数据3个节点都是均衡的,我认为还是配置问题,而且官方介绍负载均衡的算法与Token有关。于是按官方说明手动计算Token

def tokens(nodes):
    for x in xrange(nodes):
        print 2 ** 127 / nodes * x

     然后手动指定(conf/cassandra.yaml) initial_token值,启动后发现Token值并非读取这个配置。应该是头一次启动计算后写入到了System空间里了。

    然后手动更新所有节点的Token值:bin/nodetool -host 10.20.10.31 -port 8080 move 88888888888888888888888888888888888888

    注意:Move过程会按新环移动现有数据,完成之后再查看节点信息。神了!虽然当前没有数据,但我已经感觉到问题被解决了:

 

 Address         Status State   Load            Owns    Token                                       
                                                       170141183460469231731687303715884105726    

10.20.223.111   Up     Normal  169.96 KB       14.29%  24305883351495604533098186245126300818      
10.20.223.112   Up     Normal  175.13 KB       14.29%  48611766702991209066196372490252601636      
10.20.223.113   Up     Normal  175.13 KB       14.29%  72917650054486813599294558735378902454      
10.20.223.114   Up     Normal  180.48 KB       14.29%  97223533405982418132392744980505203272      
10.20.223.115   Up     Normal  169.93 KB       14.29%  121529416757478022665490931225631504090     
10.20.223.116   Up     Normal  175.07 KB       14.29%  145835300108973627198589117470757804908     
10.20.223.117   Up     Normal  169.96 KB       14.29%  170141183460469231731687303715884105726 

    OK,加些数据看看是否均衡吧:

Address         Status State   Load            Owns    Token                                       
                                                       170141183460469231731687303715884105726     
10.20.223.111   Up     Normal  1.26 GB         14.29%  24305883351495604533098186245126300818      
10.20.223.112   Up     Normal  1.26 GB         14.29%  48611766702991209066196372490252601636      
10.20.223.113   Up     Normal  1.26 GB         14.29%  72917650054486813599294558735378902454      
10.20.223.114   Up     Normal  1.26 GB         14.29%  97223533405982418132392744980505203272      
10.20.223.115   Up     Normal  1.26 GB         14.29%  121529416757478022665490931225631504090     
10.20.223.116   Up     Normal  1.26 GB         14.29%  145835300108973627198589117470757804908     
10.20.223.117   Up     Normal  1.26 GB         14.29%  170141183460469231731687303715884105726  

     实在是太均衡了,原来就是Token惹的祸!

 

 

另外的一篇文章:

Cassandra之Token

 

http://www.ningoo.net/html/2010/cassandra_token.html

 

有一个多月没有更新过blog了,有点惭愧。不管何种理由,不管工作生活有何种变动,有一些我们内心真正追求的东西,不能放弃。昨天晚上,世界杯大幕拉开,在等待揭幕战的过程中,看了一段Cassandra关于dht部分的源代码。要在生产系统中运维,则数据如何分布不得不做周详细致的考虑。

将Cassandra用于实际的生成环境,一个必须要考虑的关键问题是Token的选择。Token决定了每个节点存储的数据的分布范围,每个节点保存的数据的key在(前一个节点Token,本节点Token]的半开半闭区间内,所有的节点形成一个首尾相接的环,所以第一个节点保存的是大于最大Token小于等于最小Token之间的数据。

根据采用的分区策略的不同,Token的类型和设置原则也有所不同。 Cassandra (0.6版本)本身支持三种分区策略:

RandomPartitioner:随机分区是一种hash分区策略,使用的Token是大整数型(BigInteger),范围为0~2^127,因此极端情况下,一个采用随机分区策略的Cassandra集群的节点可以达到2^127+1个节点。嗯,为什么是2^127?因为Cassandra采用了MD5作为hash函数,其结果是128位的整数值(其中一位是符号位,Token取绝对值为结果)。采用随机分区策略的集群无法支持针对Key的范围查询。假如集群有N个节点,每个节点的hash空间采取平均分布的话,那么第i个节点的Token可以设置为:

 i * ( 2 ^ 127 / N )

下面的测试程序是从org.apache.cassandra.utils.FBUtilities类抽取出来的计算MD5值的函数,输入任何字符都可以得到其对应的MD5的整数值,利用该值和节点的Token对比即可知道该Key对应的数据归属于哪个节点:

 

OrderPreservingPartitioner:如果要支持针对Key的范围查询,那么可以选择这种有序分区策略。该策略采用的是字符串类型的Token。每个节点的具体选择需要根据Key的情况来确定。如果没有指定InitialToken,则系统会使用一个长度为16的随机字符串作为Token,字符串包含大小写字符和数字。

CollatingOrderPreservingPartitioner:和OrderPreservingPartitioner一样是有序分区策略。只是排序的方式不一样,采用的是字节型Token,支持设置不同语言环境的排序方式,代码中默认是en_US。

分区策略和每个节点的Token(Initial Token)都可以在storage-conf.xml配置文件中设置:

<Partitioner>org.apache.cassandra.dht.RandomPartitioner</Partitioner>
<InitialToken>10633823966279300000000000000000000000</InitialToken>

节点初始化完成以后,Token值做为元数据会保留在system keyspace中,每次启动会以该值为准,即使再改动配置文件中的InitialToken也不会产生任何影响。

Saved Token found: 10633823966279300000000000000000000000

通过nodetool的ring命令,可以查看集群各个节点的Token,这些Token值最好备份下来,当出现节点彻底顺坏时,可以重新设置同样的Token,确保数据分布可以不受节点损坏的影响。

 nodetool -h test ring
Address       Status     Load          Range                                      Ring
                                       85070591730234600000000000000000000000
192.168.0.1 Up         0 bytes       10633823966279300000000000000000000000     |<--|
192.168.0.2 Up         0 bytes       85070591730234600000000000000000000000     |-->|

PS: 在我的0.6.2的一个测试集群中,使用nodetool时不小心连到了9160端口,结果每次都会把节点搞挂,百试百灵。而且直接telnet到9160端口,随便发送个字符,也会把节点搞崩溃。不知道是我的测试环境的原因,还是Thrift有bug,这样节点的健壮性就有问题了,这个端口只能接受协议格式内的信息。对Java和Thrift都不太了解,把这个问题抛出来,希望有大牛能帮忙找到原因。

Update:之前贴的nodetool错连9160端口的报错可能有点误导大家,因为jmx用的默认的8080端口,连9160端口jmx报错是正常的,问题是节点不应该崩溃的。看了/var/log/cassandra/system.log中记录的节点错误信息,报的是OOM,Cassandra的java进程都消失了。调整了一下jvm参数,将heap的最小内存从默认的256MB设置到1G(-Xms1G),还是有同样的问题。另外,我的java环境是jre1.6.0_18。

分享到:
评论

相关推荐

    Cassandra技术详解 操作与测试报告

    - Cassandra自动实现了负载均衡,能够将请求均匀地分配到不同的节点上,确保没有单个节点成为瓶颈。 5. **安全性** - Cassandra支持用户认证和权限管理,可以通过配置来控制用户对特定数据的访问权限,从而保障...

    Cassandra分布式模型与源代码分析

    - **高伸缩性**:扩展 Cassandra 集群只需添加新的节点,系统会自动进行负载均衡和数据分布。 3. **与其他数据库比较** - **模式灵活性**:相比传统的关系型数据库,Cassandra 提供更灵活的数据模型,允许运行时...

    Cassandra在Windows上安装及使用方法

    ### Cassandra在Windows上的安装与使用方法详解 Cassandra是一款分布式NoSQL数据库系统,因其高可扩展性和容错性而受到广泛欢迎。对于那些在Windows环境下希望部署和使用Cassandra的用户,本文将详细介绍如何在...

    Cassandra实战.pdf

    在深入探讨《Cassandra实战.pdf》这一资源时,我们聚焦于Apache Cassandra数据库系统的全面解析与实践应用,这是一份详尽的...无论是对于初学者还是资深技术人员,这份资料都是深入了解Cassandra不可或缺的宝贵资源。

    cassandra-3.11.3下载

    再者,Cassandra使用Gossip协议进行节点间的通信,这种协议允许节点间快速传播状态信息,从而实现故障检测和负载均衡。在3.11.3中,Gossip协议的性能和稳定性得到了提升,能够更快地发现并应对节点故障,保证服务的...

    Cassandra-架构讲解

    Cassandra则是所有节点地位等同,相互之间没有主从关系,能够分担读写请求,实现分布式负载均衡。 Cassandra中的节点通过Gossip协议来交换信息,这是一种基于P2P(Peer-to-Peer)的通信方式,节点们通过这种方式来...

    ycsb cassandra 压力测试工具

    将 YCSB 与 Cassandra 结合,我们可以对 Cassandra 数据库进行压力测试,了解其在不同工作负载下的性能表现。 ### YCSB 简介 YCSB 的设计目标是提供一个通用的框架,以便于对比和分析不同云存储系统的性能。它提供...

    Cassandra在饿了么的应用

    这些内容将会涵盖Cassandra的技术原理、实际应用问题的解决方法,以及如何在大数据处理中发挥其作用。在实际应用中,饿了么可能遇到了诸多挑战,如数据一致性、系统扩展性、以及故障恢复等问题,通过使用Cassandra,...

    Cassandra分布式架构与源代码分析

    Cassandra分布式架构与源代码分析 Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。本文档对Cassandra源代码作了详细的分析,可以了解整个集群的运作细节。 1. Cassandra的...

    spring boot与cassandra集成,使用JPA方式。

    在本文中,我们将深入探讨如何将Spring Boot框架与Cassandra数据库集成,并利用Java Persistence API (JPA) 进行数据操作。Spring Boot以其简洁的配置和开箱即用的特性,已经成为Java开发中的首选框架之一。而...

    Cassandra权威指南【中文版】

    一致性哈希解决了在大规模分布式系统中数据分片和负载均衡的问题,确保了数据分布的均匀性。分布式存储则允许Cassandra跨多台服务器存放数据,提供高可用性和水平扩展性。故障容忍机制通过数据复制确保了即使在节点...

    cassandra-operator,apache-cassandra的kubernetes算子.zip

    它利用Go语言重构,以更好地与Kubernetes生态系统集成,提供了一套全面的解决方案,使得在云环境中运行Cassandra变得更加高效和可靠。对于希望在容器化环境中运行Cassandra的团队来说,这是一个值得研究和采用的项目...

    Cassandra查询分析器

    - **分区和复制**:数据按照分区键进行分布,每个分区可以在多个节点上复制,以提供容错和负载均衡。 了解 Cassandra 查询分析器的工作原理有助于开发者编写更高效、更合理的查询,充分利用 Cassandra 的分布式特性...

    Cassandra应用和改进

    为了解决这个问题,360团队采取了包括数据同步与检查机制、辅助表作为缓冲队列、节点主动式同步等方法来简化运维过程。此外,通过对数据节点的负载进行优化,合理分配带宽资源,降低了运维的复杂度。 成本考量也是...

    Mastering Apache Cassandra

    ### Apache Cassandra 掌控指南 ...无论你是刚刚接触 Apache Cassandra 的新手还是有一定经验的开发者,本书都能够帮助你深入了解这一强大的分布式数据库系统,从而更好地利用其优势解决实际问题。

    cassandra-driver-3.11.0.tar.gz

    6. **负载均衡**:驱动包能够自动检测和处理Cassandra集群中的节点变化,如节点加入或离开,动态调整连接,实现负载均衡。 7. **容错机制**:如果某个节点故障,驱动程序会自动重定向请求到其他健康的节点,确保...

Global site tag (gtag.js) - Google Analytics