redis高可用集群一般有两种方式:哨兵模式、cluster高可用集群。

哨兵模式

微信图片_20210127153655.png
在redis3.0以前,要实现redis的高可用集群一般要借助哨兵sentinel来监控mater节点的状态,如果master节点异动,则会进行主从切换,将某一台slave节点作为master节点。

cluster高可用集群

微信图片_20210128090926.png
redis集群是一个由多个主从节点组成的分布式服务器集群,redis集群需要至少三个master主节点,这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机器一主一从,搭建集群的步骤如下:

  1. 第一步:在第一台机器的/usr/local下创建文件夹rediscluster,然后在其下面分别创建2个文件夾如下
  2. 1mkdir p /usr/local/rediscluster
  3. 2mkdir 8001 8004
  4. 第一步:把之前的redis.conf配置文件copy8001下,修改如下内容:
  5. 1daemonize yes
  6. 2port 8001(分别对每个机器的端口号进行设置)
  7. 3pidfile /var/run/redis_8001.pid # 把pid进程号写入pidfile配置的文件
  8. 4dir /usr/local/rediscluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会 丢失数据)
  9. 5clusterenabled yes(启动集群模式)
  10. 6clusterconfigfile nodes8001.conf(集群节点信息文件,这里800x最好和port对应上)
  11. 7clusternodetimeout 10000
  12. (8)# bind 127.0.0.1bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通 过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
  13. (9)protectedmode no (关闭保护模式)
  14. (10)appendonly yes
  15. 如果要设置密码需要增加如下配置:
  16. (11)requirepass test (设置redis访问密码)
  17. (12)masterauth test (设置集群节点间访问密码,跟上面一致)
  18. 第三步:把修改后的配置文件,copy8004,修改第2346项里的端口号,可以用批量替换:
  19. :%s/源字符串/目的字符串/g
  20. 第四步:另外两台机器也需要做上面几步操作,第二台机器用80028005,第三台机器用80038006
  21. 第五步:分别启动6redis实例,然后检查是否启动成功
  22. 1)/usr/local/redis5.0.3/src/redisserver /usr/local/rediscluster/800*/redis.conf
  23. 2ps ef | grep redis 查看是否启动成功
  24. 第六步:用rediscli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redistrib.rb实现)
  25. # 下面命令里的1代表为每个创建的主服务器节点创建一个从服务器节点
  26. # 执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不 关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)
  27. # 关闭防火墙
  28. # systemctl stop firewalld # 临时关闭防火墙
  29. # systemctl disable firewalld # 禁止开机启动
  30. # 注意:下面这条创建集群的命令大家不要直接复制,里面的空格编码可能有问题导致创建集群不成功
  31. 1)/usr/local/redis5.0.3/src/rediscli a zhuge ‐‐cluster create ‐‐clusterreplicas 1 1 92.168.0.61:8001 192.168.0.62:8002 192.168.0.63:8003 192.168.0.61:8004 192.168.0.62:8005 192. 168.0.63:8006
  32. 第七步:验证集群:
  33. 1)连接任意一个客户端即可:./rediscli c h p (‐a访问服务端密码,‐c表示集群模式,指定ip地址 和端口号)
  34. 如:/usr/local/redis5.0.3/src/rediscli a zhuge c h 192.168.0.61 p 800*
  35. 2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)
  36. 3)进行数据操作验证
  37. 4)关闭集群则需要逐个进行关闭,使用命令:
  38. /usr/local/redis5.0.3/src/rediscli a zhuge c h 192.168.0.60 p 800* shutdown

redis集群原理

redis cluster将所有数据分为16384(2^14)个slots(槽位),每个节点负责其中一部分槽位,槽位的信息存储于每个节点中。
当redis cluster客户端来连接集群时,它会得到一份集群的槽位配置信息并将其缓存保存在客户端本地。这样当客户端要查找某个key时,可以直接定位到某个节点。同时因为槽位的信息可能会存在客户端与服务端不一致的情况,还需要纠正机制来实现槽位信息的校验调整。

槽位定位算法

cluster默认会对key使用crc16算法进行hash得到一个整数,然后用这个整数对16384取模来得到具体的槽位。

HASH_SLOT = CRC16(key) mod 16384

跳转重定向

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

redis集群选举

当3个小集群的某个master节点变为FAIL状态时,

  1. 其中的slave节点将自己记录的currentEpoch加1,
  2. 并广播FAILOVER_AUTH_REQUEST信息给其他集群节点,
  3. 其他节点收到该信息,只有master节点响应,判断请求的合法性,并发送一个FAILOVER_AUTH_ACK,对每一个epcho只发送一个ack,
  4. slave收到超过半数master的ack后变成新的master(这里解释了集群为什么至少需要三个主节点,如果只有两

个,当其中一个挂了,只剩一个主节点是不能选举成功的)

  1. slave变成master节点后广播信息给其他集群节点,不用再选举了。

微信图片_20210208142250.png