一、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
原文链接:https://blog.csdn.net/weixin_42073629/article/details/117170279
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/16447