一、Redis Cluster集群简介

Redis的sentinel哨兵模式虽然可以一定程度实现Redis的高可用,但是还存在单节点写入压力过大的问题,因为客户端写入数据只能在Master节点,当写入量特别大的时候主节点压力就会很大。Redis 3.x开始提供了Cluster集群模式,可以实现对数据分布式写入。由于分布式集群的性能会相对较低,也不能支持Redis的所有操作,跨节点操作需要改进(flush、mget、keys等命令不能跨节点使用),客户端的维护也更复杂,所以业务能在哨兵下满足需求尽量用哨兵模式。

二、Redis Cluster工作条件与原理

1、Redis Cluster至少需要三个主节点才能工作

2、Redis Cluster采用了数据分片机制,使用16384个(0-16383)Slot虚拟槽来平均存储数据。也可以根据每个节点的内存情况手动分配,手动分配时需要把16384个分配完,否则集群无法正常工作

3、Redis Cluster每一个节点都可以作为客户端的连接入口并写入数据。Redis cluster的分片机制让每个节点都存放了一部分数据,比如1W个key分布在5个节点,每个节点可能只存储了2000个key,但是每一个节点都有一个类似index索引记录了所有key的分布情况

5、每一个节点还应该有一个Slave节点作为备份节点(比如用3台机器部署成Redis cluster,还应该为这三台Redis做主从部署,所以一共要6台机器),当master节点故障时slave节点会选举提升为master节点

6、Redis Cluster集群默认监听在16379端口。集群中所有Master都参与选举,当半数以上的master节点与故障节点通信超时将触发故障转移。任意master挂掉且该master没有slave节点,集群将进入fail状态,这也是为什么还要为他们准备Slave节点的原因。如果master有slave节点,但是有半数以上master挂掉,集群也将进入fail状态。当集群fail时,所有对集群的操作都不可用,会出现clusterdown the cluster is down的错误

三、Redis Cluster配置文件

redis-cluster的配置信息包含在了redis.conf中,要修改的主要有6个选项(每一个节点都需要做这些配置):

cluster-enabled yes  #开启集群
cluster-config-file nodes-6379.conf  #集群配置信息文件,由Redis自行更新,不用手动配置。每个节点都有一个集群配置文件用于持久化保存集群信息,需确保与运行中实例的配置文件名    不冲突。
cluster-node-timeout 15000  #节点互连超时时间,毫秒为单位
cluster-slave-validity-factor 10  #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor)+ repl-ping-slave-period如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
cluster-migration-barrier 1  #master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数被设为2,那么只有当一个主节点拥有2个可工作的从节点时,它的一个从节点才会尝试迁移。
cluster-require-full-coverage yes  #集群所有节点状态为ok才提供服务。建议设置为no,可以在slot没有全部分配的时候提供服务。

四、启动redis cluster服务(集群至少需要三个主节点,考虑主从的话还需要额外准备三个从节点)

1、每个主从节点均需要启动cluster服务,启动后查看下端口,可以看到端口后面多了[cluster]这样的信息

redis-server redis.conf

2、单单启动cluster后还没有正式组成集群,还需要用到redis-trib.rb命令来创建集群,由于redis-trib.rb命令是一个ruby脚本,会对ruby环境有一些依赖,在执行前需要安装以下软件包(Redis 5开始可以使用redis-cli --cluster来创建集群,命令语法和redis-trib.rb脚本一样,省去了配置ruby环境的步骤) 

yum install ruby rubygems  #安装ruby和ruby软件仓库
gem source -l  #安装完成后可以查看当前ruby源
gem sources --remove https://rubygems.org/  #去掉官方源
gem sources --remove http://rubygems.org/  #去掉官方源
gem sources -a https://ruby.taobao.org/  #新增国内源
gem install redis --version 3.2.0  #安装redis与ruby连接接口

ruby环境配置完毕后,只用在一台机器上执行即可,命令默认位于redis的src目录下 

redis-trib.rb  create  --replicas 1  192.168.1.101:6379  192.168.1.102:6379   192.168.1.103:6379   192.168.1.104:6379   192.168.1.105:6379   192.168.1.106:6379   
#create 创建集群
#replicas  代表每个主节点有几个从节点
#后面跟上的IP和端口是所有master和slave的节点信息

3、执行完毕后会看到如下信息,显示了master和slave的信息等,这些主从是自动分配出来的,通过ID号可以看出对应的主从关系。如果确认没有问题输入“yes”回车确定 

4、如果提示有ERR Slot xxxxx is already busy这样的报错说明是有slot被使用,只需要删除cluster-config-file选项所指定的配置文件,然后重新启动Redis执行redis-trib.rb命令即可。

5、集群增加主节点方法

redis-trib.rb add-node 192.168.0.110:6379  192.168.0.111:6379  #第一个ip是新节点,第二个ip是已存在的节点
redis-trib.rb reshard 192.168.0.111:6379  #重新分片

6、删除集群节点方法 

redis-trib.rb reshard 127.0.0.1:6379  #将需要删除的节点的slot移走,需要填写接受slot的节点ID,需要把分区均匀分给其他分区
redis-trib.rb del-node 127.0.0.1:6379  a67c3636h79e36k346ho68963b  #删除节点和它的id

五、测试集群工作

1、集群一旦搭建好了后必须使用redis-cli -c 选项以集群模式进行操作。集群模式下只有0号数据库可用,无法再通过select来切换数据库。登录后创建一些key用于测试,可以看到输出信息显示这个key是被存到了其他机器上。使用get获取key的时候也可以看到该key是被分配到了哪个节点

2、查看redis cluster节点状态

cluster nodes命令可以看到自己和其他节点的状态,集群模式下有主节点挂掉的话可以在这里观察到切换情况;cluste info命令可以看到集群的详细状态,包括集群状态、分配槽信息

3、手动切换redis cluster的主从关系:

redis cluster发生主从切换后,即使之前的主节点恢复了也不会变回主节点,而是作为从节点在工作,这一点和sentine模式是一样的。如果想要它变回主节点,只需要在该节点执行命令cluster failover

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐