Redis 配置高可用和搭建集群

    

Redsi 5.0 之后用 replica 替代了 slave 单词,功能都是一样的,也向下兼容,所以,看到 replica 和 slave 不要疑惑。 

一、Redis 配置高可用

“高可用性”(High Availability,缩写为 HA):指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。从而减少停工时间,而保持其服务的高度可用性。

持久化和主从复制,可以解决数据冗余备份的问题,但是,如果没有人工的干预,Redis服务器宕机后,是不能自动恢复的。所以,单纯的主从复制和持久化技术不具备高可用的特性。

Redis 要实现高可用就需要哨兵和主从复制:

  • 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能。
  • 主从复制(Replication):则是负责让一个Redis主服务器可以配备多个备份的从服务器。

利用这两个功能就可以构建具备容错能力的Redis服务,从而来来保证 Redis 的高可用。

(一)基础概念

1、哨兵(sentinal)

哨兵是 Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。

原理:当主节点出现故障时,由 Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

1)Redis哨兵主要功能:

(1)集群监控:负责监控 Redis master和 slave进程是否正常工作

(2)消息通知:如果某个 Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员

(3)故障转移:如果 master node挂掉了,会自动转移到slave node上

(4)配置中心:如果故障转移发生了,通知 client客户端新的master地址

2)sentinel.conf 配置文件的一些配置信息

# 哨兵 sentinel实例运行的端口 默认26379
port 26379

# Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no )
daemonize yes

# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
pidfile "/var/run/redis-sentinel.pid"

# 日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给指定的文件
logfile "/usr/local/redis/log/sentinel_26379.log"

# 哨兵sentinel监控的redis主节点的 ip port 
#     master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
#     quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.198.5 6379 2

# sentinel会向master发送心跳PING来确认master是否存活
# 在指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>

# 故障转移/主备切换的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

(二)Redis 配置高可用

     

1、配置主从复制

    和上篇博客(Redis 持久化与主从复制配置)一样,这里,3台服务器在 redis.conf 文件中多配置一个 Redis 服务的保存日志文件 redis_6379.log(需要创建好文件)。(注意: bind 不要加127.0.0.1,写真是ip就行,后面测试出错有说明)

[root@centos7 redis]# mkdir log
[root@centos7 redis]# ll
总用量 64
drwxr-xr-x 2 root root   134 4月  27 21:24 bin
drwxr-xr-x 2 root root    28 5月   7 22:52 log
-rw-r--r-- 1 root root 61809 5月   5 09:42 redis.conf
[root@centos7 redis]# ll ./log
总用量 0
-rw-r--r-- 1 root root 0 5月   7 22:52 redis_6379.log

    

2、配置哨兵

1)在三台服务器上分别把源码包里的 sentinel.conf 配置文件复制到安装目录中。

     三台服务器的哨兵的日志文件 sentinel_26379.log(需要创建好)

[root@centos7 redis]# cp /root/redis-5.0.5/sentinel.conf ./
[root@centos7 redis]# ll
总用量 76
drwxr-xr-x 2 root root   134 4月  27 21:24 bin
drwxr-xr-x 2 root root    28 5月   7 22:52 log
-rw-r--r-- 1 root root 61844 5月   7 22:57 redis.conf
-rw-r--r-- 1 root root  9710 5月   7 23:01 sentinel.conf
[root@centos7 redis]# touch ./log/sentinel_26379.log
[root@centos7 redis]# ll ./log
总用量 0
-rw-r--r-- 1 root root 0 5月   7 22:52 redis_6379.log
-rw-r--r-- 1 root root 0 5月   7 23:07 sentinel_26379.log

2)在 sentinel.conf 配置文件中配置哨兵信息

 这里 哨兵监控的都是主服务器(192.168.198.5),所以 三台服务器的哨兵配置如下,其他的默认。

    

3)启动 redis服务和哨兵命令(3台服务器都启动,查看信息)

[root@centos7 redis]# ./bin/redis-server ./redis.conf 
[root@centos7 redis]# ./bin/redis-sentinel ./sentinel.conf

(三)模拟故障测试哨兵高可用

1、设置主服务器的从服务器的必须上线的数量

 

min-replicas-to-write 设置要求:主服务器必须至少1个从服务器,才能写入就生效了。

将主服务器上的 min-replicas-to-write 设置为1,然后关闭两个从服务器,尝试向主服务器上写入东西是写不进去的,然后开启一个从服务器,就可以写。

    

2、手动触发故障迁移/主从切换

3台服务器都启动 redis服务和哨兵命令,在从服务器(192.168.198.10)上手动触发主从切换:sentinel failover Mymaster

[root@centos7 redis]# ./bin/redis-cli -a 123456 -p 26379 sentinel failover mymaster
(error) NOGOODSLAVE No suitable slave to promote

报错了不要慌,把 redis.conf 中的bind 中的127.0.0.1 去掉ok了,用真是ip来连接redis。重启之后,先查一下信息:

     

再来一次手动触发主从切换:ok

[root@centos7 redis]# ./bin/redis-cli -h 192.168.198.10 -a 123456 -p 26379 sentinel failover mymaster 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK

 然后看一下信息:

   查看新老主服务器的redis配置文件:

    新主服务器没有slaveof的配置

    老主服务器多了 REPLIACOF hostname port 会将当前服务器转变为某一服务器的副本服务器

    

 

简单分析试验的内部执行过程:

    1、由于故障迁移是手动执行的,所以执行迁移操作之前,不需要寻求其他哨兵的同意,也不需要进行投票决定服务器(192.168.198.10)哨兵为leader

    2、sentinel就按照上面1中的决定,把leader哨兵从从服务器切换为主服务器

    3、sentinel向leader哨兵发出一条命令:slaveof no one(5.0以后:replicaof no one),正式变为主服务器

    4、服务器(192.168.198.10)重新分配其他哨兵,让它们从新的主服务器上复制数据

    5、最后,sentinel更新主服务器的信息,并通过频道__sentinel__:hello向其他哨兵广播这些信息,从而让所有客户端获取新主服务器的信息。配置文件redis.conf和sentinel.conf也会相应的进行更新,以匹配新主服务器的角色

 

3、快照还原到哨兵配置好,再模拟主服务器下线

    把主服务器(192.168.198.5)上的 ridis关掉,并查看哨兵日志 下图截取了一点

[root@centos7 redis]# ./bin/redis-cli -h 192.168.198.5 -a 123456 SHUTDOWN
[root@centos7 redis]# cat ./log/sentinel_26379.log

  

 

    查看剩下的两个从服务器中的一个中查看信息:

    

原来的主服务器信息:

     

简单分析试验内部的执行过程:

     1、每个哨兵都是定期的向主服务器发送ping命令,如果ping命令超时,对应的服务器被视为下线,注意这里只是主观下线。这里主服务器会被哨兵标注+sdown(主观下线的标记)。    

      2、为了避免虚假警报,标记了+sdown的哨兵,标记后会向其他哨兵发送请求,要求他们检查对应服务器状态,只有大于sentinel monitor命令中的最后的那个配置的数字的时候,才会触发故障迁移,这时服务器被称为客观下线(+odown)

      3、哨兵也将把主服务器标记+sdown和+odown,就开始选举leader,且如果某哨兵被选择为leader的话,就开始执行主从切换的步骤。    

另外,哨兵leader的选举过程是这样的:

    当一个哨兵标记+odown后,投票开始:哨兵会开始向其他哨兵拉票,每个哨兵都只有一票,当另一个哨兵的拉票请求发来时,如果它以前没有投过票,则响应请求的哨兵,如果已经投给别人了,它会回复“已经把票给了xxx哨兵了”,在这个过程中如果某个哨兵率先获得了(哨兵数/2 + 1)票,那么这个哨兵就是新的leader,如果没有leader当选,上述过程重复。

关于各种突发情况,redis的应对策略还有很多,具体的可以去看看官方文档!

 

二、Redis 搭建集群

(一)知识点

1、Redis Cluster(Redis集群)简介

redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;

redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;

redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;

为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;

那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;

那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。

综上所述,每个Redis集群理论上最多可以有16384个节点。

2、redis.conf 中配置集群的部分信息说明

#开启集群
cluster-enabled yes   

#每个加入集群的redis服务器都会自动生成一个节点配置文件,名称自定义   
cluster-config-file nodes-6379.conf  

#节点互联超时时间
#超过这个设置的时间,redis会触发故障迁移,把某台从服务器提升为主服务器     
cluster-node-timeout 10000    

# 在进行故障转移的时候全部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(定义心跳(PING)间隔。)是10秒,即如果超过310秒slave将不会尝试进行故障转移。默认是10
cluster-slave-validity-factor < factor>:  

# master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数被设为2,那么只有当一个主节点拥有2个可工作的从节点时,它的一个从节点才会尝试迁移。
cluster-migration-barrier 1 

# 设置为yes,集群全部的slot有节点负责,集群状态才为ok并提供服务。
# 设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。取值yes(默认值),no 
cluster-require-full-coverage yes
 
# 在主节点失效期间,从节点不允许对master失效转移,取值yes,no(默认值)                                   
cluster-slave-no-failover/cluster-replica-no-failover no 

(二)集群搭建需要的环境

Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

本地安装的一个服务器(192.168.198.5)快照还原到安装好redis的状态,在redis.conf中做如下配置

1、Redis 服务简单配置

69 bind 192.168.198.5

136 daemonize yes

171 logfile "/usr/local/redis/log/redis_6379.log"

507 requirepass "123456"

699 appendonly yes

注意:bind 不要用127.0.0.1。日志文件我提前创建好的,数据库没有任何数据

2、Redis Cluster(Redis集群)配置:

832 cluster-enabled yes

840 cluster-config-file nodes-6379.conf

846 cluster-node-timeout 15000

891 cluster-replica-validity-factor 10

910 cluster-migration-barrier 1

923 cluster-require-full-coverage yes

933 cluster-replica-no-failover no

3、最后我这边虚拟机克隆出5台虚拟机,共6台服务器来实验。

     注意:修改克隆出来服务器的 ip 和 bind ip

 

(三),以上条件都准备好,接下来正式开启搭建集群

redis 5.0以后集群创建方式改为了C编写的redis-cli创建(之前的版本自行百度)。

注意:

    1. 创建集群时,每个redis服务器里必须没有数据!

    2. 创建Redis集群时,还会需要一个Redis集群总线的端口(Redis的端口 + 10000)提供服务。我这里Redis的端口是6379,所以Redis集群总线的端口是16379,记得要打开端口。

    3. 我这里防火墙是关闭的,所以端口不能访问时不存在的。

1、创建集群:--cluster-replicas 1 指定从库数量为1。至于哪个是主,哪个是从,redis会自己确定,后期我们也可以修改主从。

(1)开始 redis 服务(6台都开启)

    

(2)创建集群命令(我在192.168.198.5上执行的):

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster create 192.168.198.5:6379 192.168.198.10:6379 192.168.198.11:6379 192.168.198.12:6379 192.168.198.12:6379 192.168.198.13:6379 192.168.198.14:6379 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 7 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.198.13:6379 to 192.168.198.5:6379
Adding replica 192.168.198.14:6379 to 192.168.198.10:6379
Adding replica 192.168.198.12:6379 to 192.168.198.11:6379
Adding extra replicas...
Adding replica 192.168.198.12:6379 to 192.168.198.5:6379
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-5460] (5461 slots) master
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[5461-10922] (5462 slots) master
M: 9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379
   slots:[10923-16383] (5461 slots) master
S: 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
S: 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379
   replicates 9eb4070bbd0380358d6d926a36a9c15a64c95616
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 192.168.198.5:6379)
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   slots: (0 slots) slave
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   slots: (0 slots) slave
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
S: 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379
   slots: (0 slots) slave
   replicates 9eb4070bbd0380358d6d926a36a9c15a64c95616
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  集群就创建好了。随意连接一个服务器都是集群,每次重启,主从节点可能不一样。

查看下 nodes-6379.conf文件:主节点有 hash slot,从节点没有

[root@centos7 redis]# ll
总用量 68
-rw-r--r-- 1 root root     0 5月   9 21:30 appendonly.aof
drwxr-xr-x 2 root root   134 4月  27 21:24 bin
drwxr-xr-x 2 root root    28 5月   9 09:26 log
-rw-r--r-- 1 root root   810 5月   9 21:39 nodes-6379.conf
-rw-r--r-- 1 root root 61872 5月   9 16:26 redis.conf
[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589031575000 7 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589031577188 2 connected 5461-10922
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589031577000 1 connected 0-5460
9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379@16379 master - 0 1589031575164 3 connected 10923-16383
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589031578195 6 connected
735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379@16379 slave 9eb4070bbd0380358d6d926a36a9c15a64c95616 0 1589031577000 4 connected
vars currentEpoch 7 lastVoteEpoch 0

2、客户端连接集群(用主节点连接)

客户端连接集群是需要加 -c 选项。    # redis-cli -c

客户端连接加-c选项的时候,存储和提取key的时候不断在服务器之间跳转,这个称为客户端重定向。

之所以发生客户端重定向,是因为Redis Cluster中的每个Master节点都会负责一部分的槽(slot),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot)上,如果映射的槽(slot)正好是当前Master节点负责则直接存取,否则就跳转到其他Master节点负责的槽(slot)中存取,这个过程对客户端是透明的。

    

[root@centos7 redis]# ./bin/redis-cli -h 192.168.198.5 -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.198.5:6379> set k11 v11
(error) MOVED 15180 192.168.198.11:6379
192.168.198.5:6379> quit
[root@centos7 redis]# ./bin/redis-cli -c -h 192.168.198.5 -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.198.5:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.198.11:6379
OK
192.168.198.11:6379> get k1
"v1"
192.168.198.11:6379> 

3、查看集群信息与集群节点信息

    查看集群信息:>cluster info

192.168.198.11:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:3
cluster_stats_messages_ping_sent:513
cluster_stats_messages_pong_sent:540
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:1058
cluster_stats_messages_ping_received:540
cluster_stats_messages_pong_received:518
cluster_stats_messages_received:1058

    查看节点信息(和nodes-6379.conf文件信息一样):>cluster nodes    

192.168.198.11:6379> cluster nodes
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589032188000 2 connected 5461-10922
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 master - 0 1589032187670 1 connected 0-5460
735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379@16379 slave 9eb4070bbd0380358d6d926a36a9c15a64c95616 0 1589032188680 4 connected
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589032185653 7 connected
9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379@16379 myself,master - 0 1589032187000 3 connected 10923-16383
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589032186000 6 connected

    如查看指定节点6379端口号的集群信息:  

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster check 192.168.198.13:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.198.5:6379 (9e8ace6e...) -> 0 keys | 5461 slots | 1 slaves.
192.168.198.10:6379 (ac2121d2...) -> 0 keys | 5462 slots | 1 slaves.
192.168.198.11:6379 (9eb4070b...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.198.13:6379)
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   slots: (0 slots) slave
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
S: 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379
   slots: (0 slots) slave
   replicates 9eb4070bbd0380358d6d926a36a9c15a64c95616
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   slots: (0 slots) slave
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

(四)集群中主从节点的操作

1、删除节点

1)删除主节点是,哈希槽必须是空的,不然丢数据

  上面主节点(192.168.198.11)存了数据 k1-v1,接下来我们就在其他主节点服务器上删除它,不要再它上面删除它自己,没意义。

    首先要把主节点(192.168.198.11)中的哈希槽个数转移到其他主节点(192.168.198.10)中,在线迁移 hash slot槽

    

 

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster reshard 192.168.198.5:6379                 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.198.5:6379)
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   slots: (0 slots) slave
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   slots: (0 slots) slave
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
S: 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379
   slots: (0 slots) slave
   replicates 9eb4070bbd0380358d6d926a36a9c15a64c95616
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 5461
What is the receiving node ID? ac2121d2490834460e204f6cf0ff04be2357466a
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 9eb4070bbd0380358d6d926a36a9c15a64c95616
Source node #2: done
...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
...

 上面这个执行结束,就转移完成,这也意味着数据转移走了,查看下 节点文件

  

然后删除主节点:redis-cli --cluster del-node [任意一个集群的 ip:端口 就行] <node-id>

[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589033900658 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589033899000 8 connected 5461-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589033897000 1 connected 0-5460
9eb4070bbd0380358d6d926a36a9c15a64c95616 192.168.198.11:6379@16379 master - 0 1589033900000 3 connected
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589033899000 6 connected
735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589033899000 8 connected
vars currentEpoch 8 lastVoteEpoch 0
[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster del-node 192.168.198.5:6379 9eb4070bbd0380358d6d926a36a9c15a64c95616
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 9eb4070bbd0380358d6d926a36a9c15a64c95616 from cluster 192.168.198.5:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

(2)删除从节点 :如果节点是从节点(192.168.198.12)的,直接使用删除节点的命令即可。

[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589034387000 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589034387000 8 connected 5461-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589034385000 1 connected 0-5460
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589034386000 6 connected
735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 192.168.198.12:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589034388296 8 connected
vars currentEpoch 8 lastVoteEpoch 0
[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster del-node 192.168.198.5:6379 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 735cfe9cd88f7ac7b0c97e6d1134df2b973f2bf6 from cluster 192.168.198.5:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

    删除后再次查看下最后的节点信息 

[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589034598000 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589034597121 8 connected 5461-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589034596000 1 connected 0-5460
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589034598130 6 connected
vars currentEpoch 8 lastVoteEpoch 0

 取一下数据ok:

[root@centos7 redis]# ./bin/redis-cli -c -h 192.168.198.5 -a 123456 -p 6379         
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.198.5:6379> get k1
-> Redirected to slot [12706] located at 192.168.198.10:6379
"v1"
192.168.198.10:6379>

 

2、手动故障转移

Redis集群使用 cluster failover 命令来进行故障转移,不过要在被转移的主节点的从节点上执行该命令  。

主要应用于在主节点没有任何问题的情况下需要修改配置信息时,可将主节点和从节点切换后,然后修改旧主节点的配置信息,然后在切换回去。

不推荐主节点和从节点切换后,然后删除节点操作,不正规。

在被转移的主节点(192.168.198.10)的从节点(192.168.198.14)上执行该命令并查看节点信息  :,没成功 !!!

[root@centos7 redis]# ./bin/redis-cli -c -h 192.168.198.14 -a 123456 -p 6379 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.198.14:6379> cluster failover
OK
192.168.198.14:6379> CLUSTER NODES
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 myself,slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589035253000 7 connected
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589035252000 6 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589035252734 8 connected 5461-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 master - 0 1589035253743 1 connected 0-5460

   

3、添加节点

    将刚才删除的服务器(192.168.198.11/12)添加到集群(其中r任意一个节点ip:端口就行)中。

11/12 删除多余文件,重新启动redis

[root@centos7 redis]# ll
总用量 64
drwxr-xr-x 2 root root   134 4月  27 21:24 bin
drwxr-xr-x 2 root root    28 5月   9 09:26 log
-rw-r--r-- 1 root root 61873 5月   9 16:28 redis.conf
[root@centos7 redis]# ./bin/redis-server ./redis.conf 
[root@centos7 redis]# ps -ef | grep redis
root       7205      1  1 22:58 ?        00:00:00 ./bin/redis-server 192.168.198.12:6379 [cluster]
root       7210   6964  0 22:58 pts/0    00:00:00 grep --color=auto redis

(1)添加主节点:服务器(192.168.198.11/12:6379)做主节点:

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster add-node 192.168.198.12:6379 192.168.198.5:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.198.12:6379 to cluster 192.168.198.5:6379
>>> Performing Cluster Check (using node 192.168.198.5:6379)
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   slots: (0 slots) slave
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[5461-16383] (10923 slots) master
   1 additional replica(s)
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   slots: (0 slots) slave
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.198.12:6379 to make it join the cluster.
[OK] New node added correctly.

    

还需要进行 在线迁移 hash slot槽 和 重新平衡 hash slot槽:

在线迁移 hash slot槽:

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster reshard 192.168.198.5:6379 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.198.5:6379)
M: 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379
   slots:[0-8191] (8192 slots) master
   1 additional replica(s)
S: daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379
   slots: (0 slots) slave
   replicates ac2121d2490834460e204f6cf0ff04be2357466a
M: ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379
   slots:[8192-16383] (8192 slots) master
   1 additional replica(s)
M: 078477e4175f51bd0b7da21d9ad71dd31557ab56 192.168.198.12:6379
   slots: (0 slots) master
S: 7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379
   slots: (0 slots) slave
   replicates 9e8ace6e31d5056d030bd61e75b3533a8d8237c2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 2731
What is the receiving node ID? 078477e4175f51bd0b7da21d9ad71dd31557ab56
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all
...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
...
[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589037203000 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589037204750 8 connected 9557-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589037203000 9 connected 1366-8191
078477e4175f51bd0b7da21d9ad71dd31557ab56 192.168.198.12:6379@16379 master - 0 1589037203000 10 connected 0-1365 8192-9556
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589037203747 9 connected
vars currentEpoch 10 lastVoteEpoch 0

重新平衡 hash slot槽:

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster rebalance --cluster-threshold 1 192.168.198.12:6379
[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589037277263 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589037275000 8 connected 10923-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589037276000 9 connected 2731-8191
078477e4175f51bd0b7da21d9ad71dd31557ab56 192.168.198.12:6379@16379 master - 0 1589037276262 10 connected 0-2730 8192-10922
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589037278265 9 connected
vars currentEpoch 10 lastVoteEpoch 0

  添加主节点ok 

(2)添加从节点:指定做那个主节点的从节点

     服务器(192.168.198.11:6379)做(192.168.198.12:6379)主节点的从节点:

[root@centos7 redis]# ./bin/redis-cli -a 123456 --cluster add-node 192.168.198.11:6379 192.168.198.5:6379 --cluster-slave --cluster-master-id 078477e4175f51bd0b7da21d9ad71dd31557ab56
[root@centos7 redis]# cat nodes-6379.conf 
daad33e7bf3c0d9444ec0d550952db153b19c961 192.168.198.14:6379@16379 slave ac2121d2490834460e204f6cf0ff04be2357466a 0 1589037519000 8 connected
ac2121d2490834460e204f6cf0ff04be2357466a 192.168.198.10:6379@16379 master - 0 1589037518000 8 connected 10923-16383
9e8ace6e31d5056d030bd61e75b3533a8d8237c2 192.168.198.5:6379@16379 myself,master - 0 1589037517000 9 connected 2731-8191
006577fa7d7bdde898d807c1110a5850ad674414 192.168.198.11:6379@16379 slave 078477e4175f51bd0b7da21d9ad71dd31557ab56 0 1589037517192 10 connected
078477e4175f51bd0b7da21d9ad71dd31557ab56 192.168.198.12:6379@16379 master - 0 1589037519301 10 connected 0-2730 8192-10922
7f6f243c1b701e7e1edf1f83dda2160799c4563a 192.168.198.13:6379@16379 slave 9e8ace6e31d5056d030bd61e75b3533a8d8237c2 0 1589037518000 9 connected
vars currentEpoch 10 lastVoteEpoch 0

添加从节点ok

 

    

上面图有点多,不过看起来更真实直观。简单搭建集群搞定。

 

参考文章:

Redis的高并发与高可用

Redis(十):sentinel.conf 配置文件说明

redis实战第四篇 手动容灾故障转移记录

 

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值