redis之哨兵集群

太过爱你忘了你带给我的痛 2021-11-05 09:46 468阅读 0赞

一、主从复制背景问题

Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:

  • 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。
  • 扩展主节点的读能力,分担主节点读压力。

但是问题是:

  • 一旦主节点宕机,从节点上位,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点

那么这个问题,redis-sentinel就可以解决了

二、Redis-Sentinel

  1. Redis-Sentinelredis官方推荐的高可用性解决方案,
  2. 当用redismaster-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。
  3. redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群,
  4. 自动发现master宕机,进行自动切换slave > master

三、Sentinel工作方式

ContractedBlock.gif ExpandedBlockStart.gif

  1. 每个Sentinel以每秒钟一次的频率向它所知的MasterSlave以及其他 Sentinel 实例发送一个 PING 命令
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
  3. 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  4. 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, Master会被标记为客观下线
  5. 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有MasterSlave发送 INFO 命令
  6. Master Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
  7. 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
  8. Master 重新向 Sentinel PING 命令返回有效回复, Master 的主观下线状态就会被移除。
  9. 主观下线和客观下线
  10. 主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
  11. 客观下线:Objectively Down 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
  12. SDOWN适合于MasterSlave,只要一个 Sentinel 发现Master进入了ODOWN 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对下线的主服务器执行自动故障迁移操作。
  13. ODOWN只适用于Master,对于Slave Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商, 所以Slave Sentinel 永远不会达到ODOWN

四、主从复制架构

1403368-20190705161718721-452147716.png

1403368-20190705161809551-1108021192.png

五、Redis Sentinel架构

Sentinel是redis的一个进程,但是不存储数据,只是监控redis

1403368-20190705161943032-1902814161.png

1403368-20190705162025616-506363380.png

1403368-20190705162040121-329677380.png

1403368-20190705162056886-1875765583.png

六、redis命令

  1. 官网地址:http://redisdoc.com/
  2. redis-cli info #查看redis数据库信息
  3. redis-cli info replication #查看redis的复制授权信息
  4. redis-cli info sentinel #查看redis的哨兵信息

七、环境配置

redis的哨兵,自动的主从故障切换

  1. # 准备3个redis数据库实例
  2. 主库:端口6379
  3. 从库:端口6380
  4. 从库:端口6381
  5. # 准备3个redis-sentinel哨兵
  6. redis-server redis-6379.conf
  7. redis-server redis-6380.conf
  8. redis-server redis-6381.conf
  9. # 三个哨兵同时监测主库6379的运行状况,宕机后三个哨兵根据算法选择从库中的一个切换成主库

redis数据库实例

生成数据文件夹

  1. mkdir -p /var/redis/data/{6379,6380,6381}

主库6379配置文件redis-6379.conf

  1. port 6379
  2. daemonize yes
  3. logfile "6379.log"
  4. dbfilename "dump-6379.rdb"
  5. dir "/var/redis/data/6379"

从库6380配置文件redis-6380.conf

  1. port 6380
  2. daemonize yes
  3. logfile "6380.log"
  4. dbfilename "dump-6380.rdb"
  5. dir "/var/redis/data/6380"
  6. slaveof 127.0.0.1 6379

从库6381配置文件redis-6381.conf

  1. port 6381
  2. daemonize yes
  3. logfile "6380.log"
  4. dbfilename "dump-6380.rdb"
  5. dir "/var/redis/data/6381"
  6. slaveof 127.0.0.1 6379

分别启动三个redis数据库实例

  1. redis-server redis-6379.conf
  2. redis-server redis-6380.conf
  3. redis-server redis-6381.conf

准备三个redis-sentinel哨兵的配置文件

创建配置文件

  1. touch redis-sentinel-26379.conf
  2. touch redis-sentinel-26380.conf
  3. touch redis-sentinel-26381.conf

参数详解

ContractedBlock.gif ExpandedBlockStart.gif

  1. port 26379
  2. dir /var/redis/data/26379
  3. logfile "26379.log"
  4. // 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
  5. // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
  6. // mymaster是主节点的别名
  7. sentinel monitor s20master 127.0.0.1 6379 2
  8. //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
  9. sentinel down-after-milliseconds s20master 30000
  10. //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
  11. 原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
  12. sentinel parallel-syncs s20master 1
  13. //故障转移超时时间为180000毫秒
  14. sentinel failover-timeout s20master 180000
  15. //让哨兵在后台运行
  16. daemonize yes

注意

如果主库中设置了密码,我们需要在哨兵配置文件中加上下面的参数:

  1. protected-mode no
  2. sentinel auth-pass

1403368-20190705170945682-1706064574.png

redis-sentinel-26379.conf

  1. port 26379
  2. dir /var/redis/data/26379
  3. logfile "26379.log"
  4. sentinel monitor s20master 127.0.0.1 6379 2
  5. sentinel down-after-milliseconds s20master 30000
  6. sentinel parallel-syncs s20master 1
  7. sentinel failover-timeout s20master 180000
  8. daemonize yes

redis-sentinel-26380.conf

  1. port 26380
  2. dir /var/redis/data/26380
  3. logfile "26380.log"
  4. sentinel monitor s20master 127.0.0.1 6379 2
  5. sentinel down-after-milliseconds s20master 30000
  6. sentinel parallel-syncs s20master 1
  7. sentinel failover-timeout s20master 180000
  8. daemonize yes

redis-sentinel-26380.conf

  1. port 26381
  2. dir /var/redis/data/26381
  3. logfile "26381.log"
  4. sentinel monitor s20master 127.0.0.1 6379 2
  5. sentinel down-after-milliseconds s20master 30000
  6. sentinel parallel-syncs s20master 1
  7. sentinel failover-timeout s20master 180000
  8. daemonize yes

分别运行三个哨兵进程

  1. redis-sentinel redis-26379.conf
  2. redis-sentinel redis-26380.conf
  3. redis-sentinel redis-26381.conf
  4. # 保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容会发生变化,这是个坑!!!!

检查redis的哨兵状态

  1. redis-cli -p 26379 info sentinel
  2. redis-cli -p 26380 info sentinel
  3. redis-cli -p 26381 info sentinel
  4. sentinel_masters:1
  5. sentinel_tilt:0
  6. sentinel_running_scripts:0
  7. sentinel_scripts_queue_length:0
  8. sentinel_simulate_failure_flags:0
  9. # 看到最后一条信息正确即成功了哨兵,哨兵主节点名字叫做s20master,状态ok,监控地址是127.0.0.0:6379,有两个从节点,3个哨兵
  10. master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

八、redis高可用故障实验

大致思路

  • 杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
  • 重新恢复旧的“master”节点,查看此时的redis身份

首先查看三个redis的进程状态

1403368-20190705171847148-117696069.png

检查三个节点的复制身份状态

  1. redis-cli -p 端口 info replication

【6379】

  1. [root@szx / 17:18:24]#redis-cli -p 6379 info replication
  2. # Replication
  3. role:master
  4. connected_slaves:2 # 两个从库
  5. slave0:ip=127.0.0.1,port=6380,state=online,offset=837877,lag=1
  6. slave1:ip=127.0.0.1,port=6381,state=online,offset=838011,lag=0
  7. master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4
  8. master_replid2:0000000000000000000000000000000000000000
  9. master_repl_offset:838011
  10. second_repl_offset:-1
  11. repl_backlog_active:1
  12. repl_backlog_size:1048576
  13. repl_backlog_first_byte_offset:1
  14. repl_backlog_histlen:838011

【6380】

  1. [root@szx / 17:19:14]#redis-cli -p 6380 info replication
  2. # Replication
  3. role:slave
  4. master_host:127.0.0.1 # 主库ip
  5. master_port:6379 # 主库端口
  6. master_link_status:up # 状态正常
  7. master_last_io_seconds_ago:1
  8. master_sync_in_progress:0
  9. slave_repl_offset:852447
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4
  14. master_replid2:0000000000000000000000000000000000000000
  15. master_repl_offset:852447
  16. second_repl_offset:-1
  17. repl_backlog_active:1
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:1
  20. repl_backlog_histlen:852447

【6381】

  1. [root@szx / 17:20:27]#redis-cli -p 6381 info replication
  2. # Replication
  3. role:slave
  4. master_host:127.0.0.1
  5. master_port:6379
  6. master_link_status:up
  7. master_last_io_seconds_ago:0
  8. master_sync_in_progress:0
  9. slave_repl_offset:874725
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4
  14. master_replid2:0000000000000000000000000000000000000000
  15. master_repl_offset:874725
  16. second_repl_offset:-1
  17. repl_backlog_active:1
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:15
  20. repl_backlog_histlen:874711

此时,干掉master!!!然后等待其他两个节点是否能自动被哨兵sentienl,切换为master节点

1403368-20190705172501248-2109760903.png

查看剩余的6380和6381的节点身份

1403368-20190705172818933-1979129675.png

注意:重新启动6379redis服务

1403368-20190705173518343-851107479.png

转载于:https://www.cnblogs.com/songzhixue/p/11139713.html

发表评论

表情:
评论列表 (有 0 条评论,468人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis-哨兵

    哨兵: 哨兵(sentinel),是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的mas

    相关 Redis哨兵

    上一篇讲解了主从架构,同时也说到了该架构只适用于读多写少的情形,主要原因是因为从节点只允许读,一旦主节点崩溃了或者网络故障,那么主节点就不能对外提供写的操作。因此Redis在主

    相关 redis(21):哨兵

    > 在一个典型的一主多从的Redis系统中,从数据库在整个系统中起到了数据冗余备份和读写分离的作用。当主数据库遇到异常中断服务 后,开发者可以通过手动的方式选择一个从数据库来升