#如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。#如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,
#此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。
#假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。
#注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,
#在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。
cluster-replica-validity-factor 10
master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。#不建议设置为0
#想禁用可以设置一个非常大的值
#如果小于0则启动失败
cluster-migration-barrier 1
表示当负责-个插槽的主库下线且没有相应的从库进行故障恢复时,是否整个集群不可用?
cluster-require-fill-coverage yes
故障转移
cluster-replica-no-failover no
linux 命令 将文件中的7000 批量修改为7001 并生成一个新的文件
sed ‘s/7000/7001/g’ redis7000/redis.conf > redis7001/redis.conf
如果是以集群方式启动的redis 的话,是不能以客户端命令方式直接插入数据的会提示
(error) CLUSTERDOWN Hash slot not served 意思是提示 集群还没有设置插槽,前面说过 redis cluster 方式启动的话,必须设置插槽
redis meet 命令 让本机上的redis相互建立联系
cluster meet ip port
redis 官方提供的集群操作相关命令查看
usr/local/bin/redis-cli --cluster help
使用1条命令完成 redis集群搭建的3步骤
/usr/local/bin/redis-cli --cluster create 192.168.204.188:7000 192.168.204.188:7001 192.168.204.188:7002 192.168.204.188:7003 192.168.204.188:7004 192.168.204.188:7005 --cluster replicas 1
运行上述命令后。
使用命令
/usr/local/bin redis-cli -h 192.168.204.188 -P 7000
链接一个redis的客户端
使用命令
cluster nodes 查看已有的所有redis集群
第一部分的uuid 表示的是这个redis的节点信息
redis cli 客户端提供的 cluster 集群搭建的命令 真正使用的时候,命名不能换行,linux否则识别不出来
它包含了3个步骤
1, meet 命令 cluster meet ip port 上述cluster create 命令 里面包含了各个IP+端口的redis ,所以他完成了让redis之间相互通信的功能
2,分配主从
–cluster replicas 1
命令中的这部分表示的意思是 主从分配的比列是1:1 ,且前面3个IP为主节点,后面3个IP为从节点。如果是参数是 2 那么主从比列就是2:4 当前配置的redis就无法搭建成功。因为redis主数据库必须3台以上。
3, /usr/local/bin/ redis-cli -h 192.168.204.188 -p 7000 使用命令随意连接一个redis 客户端,使用命令 cluster nodes 查看节点信息
出现以下信息
前面的字符串为redis的节点id 每一个redis 都有一个唯一的节点ID 后面的是IP+端口号,表示的是对应的redis . slave或者master 表示的是当前redis是主节点还是从节点 。当节点信息为slave 的时候,后面的字符串表示的是对应的主节点的 节点信息。当值为master的时候,最后面的connected 0-5460 等信息是创建时自动分配的槽点信息。一般是平均分配
myself 表示的连接的是当前的节点信息
16383 槽位长度。
至此,集群搭建已经完成了。
现在在当前的redis 客户端 直接set 数据 会提示一个异常信息
错误原因。因为这个存储的值的地址所属的槽位是 12706 是第三个集群(7002)的槽位集中点。和当前的客户端不一致.所以保存失败。
重新使用命令连接客户端7000 。在后面加一个 -c 启动的结果就是在存储值的时候,自动切换到被存储的服务器内
如上图,连接的是7000 但是存储值的时候存储到7002 ,直接切换到7002 的。取值的时候也是同理。连接的7000 ,但是所取的值,是存在7002 的时候,自动切换到7002的。
启动参数后面加 -c 的功能是redis -cli 客户端独有的功能。jedis (java 的redis 客户端)不提供这个功能
redis 集群的扩容
redis集群扩容,首先搭建两个新的redis 服务,7006 ,7007 使用redis-server 加上某某配置文件的命令,启动reids 实列 ,然后借助redis-cli --cluster 集群中的 add-node 命令 根据命令要求提示,进行参数拼接。
existing_host 已存在的IP, 连接集群中的任何一个IP都是连接整个集群。因为一个集群是一个整体。
执行完命令以后,连接7006 的客户端 ,使用 cluster node 命令查看当前的集群的节点,就能看见7006 已经加入了集群,并且身份是master
参数和前面的命令类似,只是要添加两个参数 --cluster-slave --cluster-master-id master 的redis 节点信息的字符串
注意。需要退出客户端信息执行命令
此时虽然搭建主从节点成功,但是新的主从redis节点没有槽位,意味着新的主从节点无法存储信息
需要用到的命令如下 redis-cli --cluster reshard ip+端口
然后是命令提示,输入需要分配出来的槽位。
然后是输入需要分配的新的主从节点。
然后是分配方式。all 现有的有槽位的redis主从节点平均分配槽位数出来。done ,指定 分配槽位数的redis 节点信息。
运行中会出现提示
Do you want to proceed with the proposed reshard plan (yes/no) ? yes
是否继续执行槽位分配计划。yes
分配槽位后,原来的数据是否会被迁移。当然。比如原来的的数据是855,存在的redis 主从节点是0-5460
节点redis 端口为7000 ,现在槽位被重新分配,那么数据就被转移到端口位7006 槽位为0-999的节点中了。
集群节点的删除
删除redis集群节点的时候,不能直接删除。需要将槽点进行迁移回去后,再进行删除
使用命令 redis-cli --cluster reshard ip+端口 – cluster -from 被分配的节点ID --cluster-to 接收的节点ID --cluster-slots 被分配的槽位数
也可以使用前面的分配槽位的方法,两种都可以对槽位进行分配
将槽位清空后。对节点进行删除,先删除从节点
–cluster del-node 节点的删除命令。
/usr/local/bin/ redis-cli --cluster del-node 192.168.204.188: 7000 ca1b52573a69b9d07a24dc616b1c5bc86c618a85
当redis 发生主从节点宕机的情况
当主节点宕机的时候,所有的从节点会产生一个投票机制,选择出新的从节点变成主节点,原分配的主节点的槽位也会继承到从节点中。宕机时间根据实际的服务器的实际性能和配置而定。假设宕机时间是1分钟,那么对存储key 取余后任然是当前宕机的redis的节点的话,那么存储会失败~。等到从节点变成主节点之后,才会继续生效。在redis中也有配置,如果当前节点没有主从节点了,集群不可用。就是当前槽位的主节点和从节点全部都宕机了,如果配置为yes ,那么全部的redis节点就会失效。如果配置为no ,那么对key值取余后的槽位如果是当前宕机的redis服务器的话,就会失效,其他的则会存储成功。