这里,我们开始搭建一个cassandra集群。

一、了解token

token是cassandra里相当重要的一个概念,它是cassandra用来平衡集群内各节点负载的一个属性。cassandra里有不同的token分配策略,推荐采用默认的RandomPartitioner分区策略。在这个策略下,token是一个0~2的127次方之间的一个整数(这也意味着理论上cassandra可以支持2的127次方个节点)。之所以是2的127次方,是因为MD5HASH固定输出128位的数,去掉一位符号位,剩下127位。

cassandra会将你插入数据时的key进行md5HASH,得到一个127位的数,然后将这个数与各节点的token比较来决定存储到哪个节点上。它根据以下规则进行节点选择:

1.数据将存储到拥有最近的比key的hash值大的token的节点上;

2.若key的hash值比最大的token大,那将被存储到具有最小token的节点上。

在配置文件cassandra.yaml里,有一个配置是initial_token,这里就是配置该节点的token值。该值留空时,cassandra会自动给该节点分配一个token,依据以下规则:

1.若该节点已经被配置好准备加入集群,则cassandra会根据集群现有的token来分配一个最平衡的token给该节点。很明显,分配一个token给新加入的节点,会让现有的某个节点减少一半的负载。若集群里有多个token都是一样平衡,则它会选择一个可以分担目前存储了最多数据的节点的token。

2.若该节点还未准备好加入集群,则cassandra会认为这个节点是引导节点,并分配一个固定值给它。所以若你分别单独配置两台节点,然后再尝试将它们集群,则会报告token重复。最好的方法应该是先单独配置第一台节点作为引导节点,然后后面的节点配置时应该也同时配置加入集群(后文说明),这样它们会自动获得一个平衡的token。

配置文件里的token仅在系统第一次启动时被使用,然后该值被写入system文件,以后系统启动将不再从配置文件读取token。因此若你发现两台节点的token重复,你无法通过改变配置文件里的token来改变节点的token。正确的修改方法是删除自定义data文件夹里的所有文件,重新启动服务。

token会直接影响集群里节点所承受的负载,我们应该尽量保证每个节点所负责的token范围是平衡的。若你发现节点的负载不平衡,你可以手动改变它们的token来让它们平衡。先计算出每台节点的token(平均分配),然后使用nodetool工具改变它。下面给出一个java里计算token的方法,参数是节点数。

public static void calToken(int nodesNum)
{
DecimalFormat df = new DecimalFormat(".");
for(int i = 0;i < nodesNum;i++)
{
System.out.println(df.format((i * Math.pow(2, 127) / nodesNum)));
}
}

得到token后,使用nodetool来手动分配,比如我要将地址为192.168.20.1的节点的token改变为56713727820156410000000000000000000000:

nodetool.bat-h192.168.20.1move56713727820156410000000000000000000000

二、修改配置文件

讲完了token,现在来说一下集群应该怎么配置。配置文件的修改依然集中在cassandra.yaml文件里,主要修改以下属性:

cluster_name:集群名,所有集群里的节点,这个配置必须相同。

seeds:这是种子节点。cassandra是一个p2p式的分布式数据库,没有所谓的中心节点。但为了保证节点能找到集群,你必须告诉它至少一台已经在集群内的节点IP。这样通过这个节点,它能找到集群内的所有节点。

listen_address:其它节点与自己通信的IP,这里必须设置为自己的主机IP。若设置为localhost或127.0.0.1,则可能其它节点无法与自己通信。

rpc_address:这里设置其它节点上的客户端能否与自己的服务端通信。设置为0.0.0.0表示任何节点上的客户端都可以与自己通信,否则只允许本机客户端与自己通信。

这里以两台机器A和B示例,它们的IP分别为192.168.20.1和192.168.20.2。

A的配置如下:

cluster_name:'FirstCluster'

seeds:"192.168.20.1,192.168.20.2"

listen_address:192.168.20.1

rpc_address:0.0.0.0

B的配置如下:

cluster_name:'FirstCluster'

seeds:"192.168.20.2,192.168.20.1"

listen_address:192.168.20.2

rpc_address:0.0.0.0

其实A和B的seeds配置没必要都一样,只要有其中一个配置了对方的IP,保证他们可以互相通信就可以了。因此若我们想再加入一台节点C,则我们只需要在C的seeds里加上A或B的IP就可以了,A和B的seeds不需要变。但官网推荐seeds都配置成一样的,因为这样会更健壮。假如C只写了A的IP,那么若A断了,则B和C也断了。因此可以的话,尽量将集群里所有节点的seeds配置成一样的。

三、启动集群

将这几台机器启动后,若以上配置正确,它们会自动探测到对方并完成集群。为了查看是否正确集群,我们进入bin目录使用ring命令:

nodetool.bat-hlocalhostring

若集群完成,会输出集群内所有机器的信息。DC表示它们所在的数据中心,Status表示目前是否在线,State表示该节点的数据库是否正常,Load表示当前该节点所存储的数据的大小,Owns表示根据Token计算的预计数据负载。

四、一些常用的操作

集群里,数据会自动分布到对应的节点上,但我们可能想数据存储多个副本,那么可以设置replication_factor属性。replication_factor表示一个数据存放多少个副本,以前该属性可以在配置文件里修改,但最新的cassandra取消了这个做法,你需要启动客户端来修改。进入bin,打开客户端cassandra-cli:

connectlocalhost/9160;

useDEMO;

updatekeyspaceDEMOwithplacement_strategy= 'org.apache.cassandra.locator.SimpleStrategy'and strategy_options={replication_factor:3};

这条语句,首先将placement_strategy从默认的NetworkTopologyStrategy修改为SimpleStrategy,然后我们才能设置replication_factor属性。

修改完成后,数据将会自动存储多个副本在不同的节点上,第一个数据副本存储在最适合的token节点上,第二个副本的节点选择将按照第一个的token递增。

但这个同步并不是立刻完成的,若你想立刻看它们散布副本,可以对所有节点使用repair命令。

nodetool.bat-h<ip>repair

此时再使用ring命令,就会发现节点的Load应该都增多了。

若集群里有新节点加入,则它们会分掉一部分的token范围,但原来已经分配好的数据却可能不会随着新token而重新分布(这里说的是集群自动分配token,如果你使用了move命令手动重新分配了token,则数据也会随之重新分布)。若你想让它们重新分布,则在加入新节点后,使用repair命令,它们会自动去索引自己的数据。而此时老节点上又存在一些不属于自己的数据,我们可以使用cleanup命令来清除冗余数据:

nodetool.bat-h<ip>cleanup

注意,你最好确认新机器可以正常工作后再使用这个命令。

cassandra学习笔记二相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  6. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  7. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  8. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  9. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

最新文章

  1. 三句话不离开用户体验的seo专员到底如何做好用户体验优化?
  2. DOM中window的navigate()重新导航到制定网址
  3. ThreadLocal两个简单示例
  4. 良好的JavaScript编码风格(语法规则)
  5. 数据 格式化 format
  6. TP-Link路由器设置上网知识笔记
  7. leetcode252. 会议室
  8. 面向对象设计之CRC卡片
  9. canvas笔记-扩展canvas的context及画椭圆及浏览器兼容问题
  10. UML学习笔记(三):运用面向对象思想
  11. mysql与其他数据库的区别_mysql与其他数据库的区别
  12. 阿里云高级专家王林平:云数据库的运维体系构建
  13. 中国大陆省市区县三级、四级菜单数据整理
  14. 扣丁软件测试基础知识,总结钢筋工程266问,包你从入门到放弃,建议收藏
  15. Removing a detached instance--删除失败
  16. HTML超链接基本属性
  17. Visual Studio 2019 编译报错:错误 CS2012 无法打开 obj\Debug\xx.exe”进行写入 --“对路径xx.exe”的访问被拒绝)解决方法
  18. 线性代数------矩阵1
  19. QT项目负责人必须掌握的Ui设计师功能——Promote to !
  20. 显卡,就是一个男人对自己的交待

热门文章

  1. WindowsServices_无法拷贝文件到服务器
  2. 我需要完全理解这部分代码才能确保它能够正常工作,如果由我来修复代码中的问题,我是不会这么写的,因此希望你也不要这么来写(转)...
  3. (转载)tomcat5下jsp出现getOutputStream() has already been called for this
  4. CSS3j背景渐变,字体颜色渐变,以及兼容IE写法
  5. C- unsigned :1之位域分析
  6. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
  7. MySQL Replication主从复制环境下修改主库IP
  8. SQL Server 日期函数:EOMonth、DateFormat、Format、DatePart、DateName
  9. Playframework项目启动后自动停止问题记录
  10. 贪心算法——字典序最小问题