在CenOS 6.7 linux环境下搭建Redis 集群环境
1、下载最新的Redis版本
本人下载的Redis版本是3.2.1版本,下载之后,解压,编译(make); 具体操作可以参考我的博文:Redis 学习笔记1:CentOS 6.7下安装Redis
编译后的redis目录在 /usr/local/redis-3.2.1
2、新建6个目录
将
/usr/local/redis-3.2.1
目录下的redis文件依次复制到7000~ 7005 目录当中。
新建一个文件,命名为redis.conf ,内容如下:
将该配置文件覆盖到到6个目录当中,粘贴覆盖时注意修改port端口,即7000目录下的是7000,7001下的port=7001,以此类推.....
cluster-node-timeout 是集群中各节点相互通讯时,允许"失联"的最大毫秒数,上面的配置为5秒,如果超过5秒某个节点没向其它节点汇报成功,认为该节点挂了。
4、依次启动各个Redis服务
到各个目录下的src目录下,依次执行命令:
./redis-serve r ../redis.conf
以上是7000的启动,可以看到连接的端口是7000,其余目录的redis 服务连接的端口也是各自配置文件配置的端口.
5、安装Redis 集群需要的 Ruby 工具
虽然步骤4把6个redis server启动成功了,但是彼此之间是完全独立的,需要借助其它工具将其加入cluster,而这个工具就是redis提供的一个名为redis-trib.rb的ruby脚本, 否则接下来的创建cluster将失败。
在联网状态下安装Ruby ,依次执行如下命令即可:
6、创建Redis cluster集群
仍然保持在每个目录的src子目录下,运行下面这段shell脚本,cluster就创建成功了,replicas 1的意思,就是每个节点创建1个副本(即:slave),所以最终的结果,就是后面的127.0.0.1:7000~127.0.0.1:7005中,会有3个会指定成master,而其它3个会指定成slave。
注:利用redis-trib创建cluster的操作,只需要一次即可,假设系统关机,把所有6个节点全关闭后,下次重启后,即自动进入cluster模式,不用再次redis-trib.rb create。
用ps查看redis进程,可以看见每个进程后面添加了cluster字样
如果想知道哪些端口的节点是master,哪些端口的节点是slave,可以用下面的命令:
输出结果如下:
从上面的输出,可以看出7002、70001、7003 是master,而7000、7004、 7005 是slave ,除了check参数,还有一个常用的参数info.
若想了解更多redis-trib的使用,可以使用如下参数:
上面多次出现slot这个词,下面略做解释下:
如上图,redis-cluster把整个集群的存储空间划分为16384个slot(译为:插槽?),当6个节点分为3主3从时,相当于整个cluster中有3组HA的节点,3个master会平均分摊所有slot,每次向cluster中的key做操作时(比如:读取/写入缓存),redis会对key值做CRC32算法处理,得到一个数值,然后再对16384取模,通过余数判断该缓存项应该落在哪个slot上,
7、redis-cli 客户端操作
-c 参数,表示进入cluster集群模式,随便添加一个缓存试试。
注意
先用redis-cli查看当前的主从情况
9、cluster扩容
业务规模扩大后,集群需要扩容.下面演示如何再添加两个节点 。跟原先一样,新建两个目录7006,7007,将下载的redis文件各复制一份到这两个目录当中.
并更改其中的redis-conf文件.
做完这些后,启动7006,7007这两个redis节点,此时这两个新节点与cluster没有任何关系,可以用下面的命令将7006作为master添加到cluster中。
check 一下:
10、reshared 重新划分slot.
增减新的节点之后,问题就来了,16384个slot已经被其它3组节点分完了,新节点没有slot,没办法存放缓存,所以需要将slot重新分布.
reshard后面的IP:port,只要是在cluster中的有效节点即可。
注:
第一个交互询问,填写多少slot移动时,要好好想想,如果填成16384,则将所有slot都移动到一个固定节点上,会导致更加不均衡!建议每次移动500~1000,这样对线上的影响比较小。
reshard可以多次操作,直到达到期望的分布为止(注:个人觉得redis的reshard这里有点麻烦,要移动多少slot需要人工计算,如果能提供一个参数之类,让16384个slot自动平均分配就好了),调整完成后,可以再看看分布情况:
reshard可以多次操作,直到达到期望的分布为止(注:个人觉得redis的reshard这里有点麻烦,要移动多少slot需要人工计算,如果能提供一个参数之类,让16384个slot自动平均分配就好了),调整完成后,可以再看看分布情况:
有扩容,就有删除,删除节点的命令如下:
del-node后面的ip:port只要是cluster中有效节点即可,最后一个参数为目标节点的id
注:只有slave节点和空的master节点可以删除,如果master非空,先用reshard把上面的slot移动到其它node后再删除,如果有一组master-slave节点,将master上所有slot移到其它节点,然后将master删除,剩下的slave会另寻他主,变成其它master的slave。
master非空的话,删除报如下错误:
如下是删除slave 节点7007 ,输出如下:
删除节点后,也会关闭对应的redis服务.