redis-cluster集群

2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂度大大降低。

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

Codis   +redis

Redis数据分区

Redis cluster 采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:Slot=CRC16(key)&16384。每个节点负责维护一部分槽以及槽所映射的键值数据。

redis群集中的每个节点都负责哈希槽的子集,例如,您可能拥有一个包含3个节点的群集,其中:

节点A包含从0到5500的散列槽。

节点B包含从5501到11000的散列槽。

节点C包含从11001到16383的散列槽。

Redis-cluster搭建

Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,三主三从。

集群选举原理分析(ping-pong机制)

选举流程:

当slave发现自己的master变为FAIL状态时,便尝试发起选举,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

1.slave发现自己的master变为FAIL(失败)

2.将自己记录的集群currentEpoch(选举轮次标记)加1,并广播信息给集群中其他节点

3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送结果

4.尝试选举的slave收集master返回的结果,收到超过半数master的同意后变成新Master

 5.广播Pong消息通知其他集群节点。

如果这次选举不成功,比如三个小的主从A,B,C组成的集群,A的master挂了,A的两个小弟发起选举,结果B的master投给A的小弟A1,C的master投给了A的小弟A2,这样就会发起第二次选举,选举轮次标记+1继续上面的流程。

跳转重定位
当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。

当redis-cluster集群,其中一台主挂掉,并不影响客户端的查询和写入情况

Redis-cluster集群最多可以挂多少台主机?

不能多于集群中的redis服务半数主机

伪集群搭建

实验环境

主机

IP

角色

端口

centos1

192.168.100.208

Master

6379

centos1

192.168.100.208

Slave

6380

centos2

192.168.100.209

Master

6379

centos2

192.168.100.209

Slave

6380

centos3

192.168.100.210

Master

6379

centos3

192.168.100.210

Slave

6380

案例实施

Centos1配置

Redis单节点搭建及语法结构

[root@centos1 ~]# vim /etc/hosts  #添加IP与主机名映射

192.168.100.208 centos1

192.168.100.209 centos2

192.168.100.210 centos3

创建cluster工作目录

[root@centos1 ~]# mkdir  -p /etc/redis/cluster/{6379,6380}

[root@centos1 ~]# ll /etc/redis/cluster/

总用量 0

drwxr-xr-x 2 root root 6 10月 19 20:44 6379

drwxr-xr-x 2 root root 6 10月 19 20:44 6380

创建数据存储目录

[root@centos1 ~]#  mkdir -p /data/redis/data/{6379,6380}

[root@centos1 ~]# ll /data/redis/data/

总用量 0

drwxr-xr-x 2 root root 6 10月 19 20:45 6379

drwxr-xr-x 2 root root 6 10月 19 20:45 6380

生成配置文件

[root@centos1 ~]# cp /usr/src/redis-5.0.4/redis.conf /etc/redis/cluster/6379/

[root@centos1 ~]# cp /usr/src/redis-5.0.4/redis.conf /etc/redis/cluster/6380/

修改配置文件

[root@centos1 ~]# vim /etc/redis/cluster/6379/redis.conf

daemonize   yes                   //redis后台运行

bind 192.168.100.208                  //监听地址

pidfile  /var/run/redis_6379.pid       //pidfile文件对应端口

port  6379                        //端口

logfile "/var/log/redis/redis_6379.log"  //修改log日志路径

dir "/data/redis/data/6379"           //配置redis rdb数据保存位置

cluster-enabled  yes                //开启集群  把注释#去掉

cluster-config-file  nodes_6379.conf   //集群的配置,配置文件首次启动自动生成

cluster-node-timeout  15000      //请求超时15s

appendonly  yes              //aof日志开启,有需要就开启,它会每次写操作都记录一条日志

[root@centos1 ~]# vim /etc/redis/cluster/6380/redis.conf

daemonize   yes                   //redis后台运行

bind 192.168.100.208

pidfile "/var/run/redis_6380.pid"

port  6380 

dir "/data/redis/data/6380"

logfile "/var/log/redis/redis_6380.log"  //修改log日志路径

cluster-enabled  yes                //开启集群  把注释#去掉

cluster-config-file  nodes_6380.conf  //集群的配置,配置文件首次启动自动生成

cluster-node-timeout  15000      //请求超时15s

appendonly  yes              //aof日志开启,有需要就开启,它会每次写操作都记录一条日志

拷贝redis-server  redis-cli  到/usr/local/redis

mkdir -p /usr/local/redis

mkdir -p /var/log/redis

[root@centos1 ~]# cp /usr/src/redis-5.0.4/src/redis-server /usr/local/redis/

[root@centos1 ~]# cp /usr/src/redis-5.0.4/src/redis-cli /usr/local/redis/

ln -s /usr/local/redis/* /usr/local/bin/

关闭之前的redis(如果没有请忽略)

[root@centos1 ~]# ps -ef | grep redis

[root@centos1 ~]# kill -9 989

[root@centos1 ~]# kill -9 1013

[root@centos1 ~]# kill -9 1034

[root@centos1 ~]# kill -9 1079

#杀死之前启动的redis进程,根据自己的进程号杀死

启动redis服务

[root@centos1 ~]# redis-server /etc/redis/cluster/6379/redis.conf

[root@centos1 ~]# redis-server /etc/redis/cluster/6380/redis.conf

查看端口

[root@centos1 ~]# netstat -antup | grep 63

添加开机自启动

[root@centos2 ~]# echo "redis-server /etc/redis/cluster/6379/redis.conf" >> /etc/rc.local

[root@centos2 ~]# echo "redis-server /etc/redis/cluster/6380/redis.conf" >> /etc/rc.local

Centos3配置

先修改hosts

[root@centos3 ~]# vim /etc/hosts  #添加IP与主机名映射

192.168.100.208 centos1

192.168.100.209 centos2

192.168.100.210 centos3

添加path环境变量

[root@centos3 ~]#  ln -s /usr/local/redis/* /usr/local/bin/

创建工作目录

[root@centos3 ~]# mkdir -p /data/redis/data/{6379,6380}

[root@centos3 ~]# mkdir /var/log/redis

修改配置文件

[root@cong13 ~]# vim /etc/redis/cluster/6379/redis.conf #修改端口和IP

daemonize   yes                   //redis后台运行

bind 192.168.100.210               //监听地址

pidfile  /var/run/redis_6379.pid       //pidfile文件对应端口

port  6379                       //端口

dir "/data/redis/data/6379"           //配置redis rdb数据保存位置

logfile "/var/log/redis/redis_6379.log"  //修改log日志路径

cluster-enabled  yes                //开启集群  把注释#去掉

cluster-config-file  nodes_6379.conf   //集群的配置,配置文件首次启动自动生成

cluster-node-timeout  15000      //请求超时15s

appendonly  yes              //aof日志开启,有需要就开启,它会每次写操作都记录一条日志

[root@cong13 ~]# vim /etc/redis/cluster/6380/redis.conf #修改端口和IP

daemonize   yes                   //redis后台运行

bind 192.168.100.210                 //监听地址

pidfile  /var/run/redis_6380.pid       //pidfile文件对应端口

port  6380                        //端口

dir "/data/redis/data/6380"           //配置redis rdb数据保存位置

logfile "/var/log/redis/redis_6380.log"  //修改log日志路径

cluster-enabled  yes                //开启集群  把注释#去掉

cluster-config-file  nodes_6380.conf  //集群的配置,配置文件首次启动自动生成

cluster-node-timeout  15000      //请求超时15s

appendonly  yes              //aof日志开启,有需要就开启,它会每次写操作都记录一条日志

启动redis服务

[root@centos3 ~]# redis-server /etc/redis/cluster/6379/redis.conf

[root@centos3 ~]#  redis-server /etc/redis/cluster/6380/redis.conf

查看端口

[root@centos3 ~]# netstat -anput | grep 63

 

添加开机自启动

[root@centos3 ~]# echo "redis-server /etc/redis/cluster/6379/redis.conf" >> /etc/rc.local

[root@centos3 ~]# echo "redis-server /etc/redis/cluster/6380/redis.conf" >> /etc/rc.local

查看进程

[root@centos3 ~]# ps -ef | grep redis  #可以看到是以cluster启动

创建cluster集群

 redis5.0开始不再使用ruby搭建集群

使用命令 redis-cli

Ruby添加集群

redis-trib.rb环境准备(该文件存在于redis-4.0.1/src/目录中)    //只需要在其中一台上执行此步骤!!

安装ruby

yum -y install ruby rubygems

[root@centos1 ~]# ruby -v

ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

[root@centos1 ~]# gem install -l redis-3.3.0.gem

[root@centos1 ~]# cd redis-4.0.1/src/

[root@centos1 src]# ./redis-trib.rb create --replicas 1 192.168.100.206:6379 192.168.100.207:6379 192.168.100.208:6379 192.168.100.206:6380 192.168.100.207:6380 192.168.100.208:6380

--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1,每个主节点只有一个从节点。

Redis5.0版本 用以下方式

redis-cli --cluster create --cluster-replicas 1  192.168.100.217:6379 192.168.100.218:6379 192.168.100.219:6379 192.168.100.217:6380 192.168.100.218:6380 192.168.100.219:6380

测试:

[root@centos1 ~]# redis-cli -h 192.168.100.208 -p 6379 -c  #-c表示激活集群模式

查看集群状态

[root@centos1 src]# ./redis-trib.rb check 192.168.100.208:6379

5.0之后想要查看集群的状态:

redis-cli --cluster check 192.168.100.208:6379

集群测试

[root@centos1 ~]#          #-c表示集群模式,同学们可以测试一下不添加-c会有什么区别。

192.168.100.208:6379> set hehe haha

OK

192.168.100.209:6379> get hehe

"haha"

去其他主机上查看和创建。

192.168.100.210:6379> get hehe

-> Redirected to slot [4618] located at 192.168.100.208:6379   #会提示数据在192.168.100.208:6379上,并且自动给转换到192.168.100.208:6379主机上。

"haha"

扩展redis-cluster

  1. 先将192.168.100.211:6379加入集群

redis-cli --cluster add-node 192.168.100.211:6379 192.168.100.208:6379

  1. 查看集群的状态,209:6379添加成功,但是没有槽slots

2、为209:6379Master主节点分配数据Slots,分配0方法是从集群中知道任何一个主节点(因为只有Master主节点才有数据slots),然后对其进行重新分片工作。

redis-cli --cluster reshard 192.168.100.208:6379

 

查看集群的状态

  1. 给100.211:6379添加从节点

redis-cli --cluster add-node 192.168.100.211:6380 192.168.100.208:6379

  1. 查看集群的状态发现添加成功,但是并不是100.211:6379的从

  1. 指定100.217:6380节点作为100.217:6379的从节点,实现主从的配置。

  1. 再查看集群的状态

缩容

删除的顺序是先删除Slave从节点,然后在删除Master主节点

动态删除Master主服务器100.211:6379节点

要想删除Master主节点,可能要繁琐一些。因为在Master主节点上有数据槽(slots),为了保证数据的不丢失,必须把这些数据槽迁移到其他Master主节点上,然后在删除主节点。

  1. 重新分片,把要删除的Master主节点的数据槽移动到其他Master主节点上,以免数据丢失。
redis-cli --cluster reshard 192.168.100.211:6379 --cluster-from ef5c1a86f1b075d2216640c5c36a950a4cd81669 --cluster-to e6ee59a3e8f58d782388e7a6c423506e16811277 --cluster-slots 1365 --cluster-yes
 
 
 
 

--cluster-from要移走哈希槽的节点ID
--cluster-to要移入哈希槽的节点ID
--cluster-slots要移动的哈希槽数

如果槽数3000个,208  209  210   一人1000

  1. 删除100.211:6379主节点,提供要删除节点的IP地址和Port端口,当然还有要删除的节点的ID名称。

redis-cli --cluster  del-node 192.168.100.211:6379 1876b8cd1153e44e62a1164395a041770a97e03f

槽位不均衡,可以使用以下方法解决

redis-cli --cluster rebalance --cluster-use-empty-masters 192.168.100.208:6379

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值