Redis6 高可用系列,主从+Sentinel哨兵监控

左手的ㄟ右手 2023-10-10 14:11 152阅读 0赞

普通的主从结构,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,人工干预费事费力,还会造成一段时间内服务不可用。

一、哨兵模式介绍

  • Redis提供了哨兵的命令,是一个独立的进程
  • 哨兵通过发送命令给多个节点,等待Redis服务器响应,从而监控运行的多个Redis实例的运行情况
  • 当哨兵监测到master宕机,会自动将slave切换成master,通过通知其他的从服务器,修改配置文件切换主机

Sentinel 三大工作任务

  • 监控(Monitoring)

    • Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
  • 提醒(Notification)

    • 当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
  • 自动故障迁移(Automatic failover)

    • 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器
    • 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器

哨兵模式容易出现的问题

  • 一个哨兵进程对Redis服务器进行监控,可能会出现问题
  • 一般是使用多个哨兵进行监控,各个哨兵之间还会进行监控,形成多哨兵模式

多哨兵模式下线概念名称介绍

  • 主观下线(Subjectively Down, 简称 SDOWN)

    • 单个 Sentinel 实例对服务器做出的下线判断,比如网络问题接收不到通知等
    • 一个服务器没有在 down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线
  • 客观下线(Objectively Down, 简称 ODOWN)

    • 指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断
    • 一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线
    • 客观下线条件只适用于主服务器
  • 仲裁 qurum

    • Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了【足够数量】的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线
    • 这个【足够数量】就是配置文件里面的值,一般是Sentinel个数的一半加1,比如3个Sentinel则就设置为2
    • down-after-milliseconds 是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用
    • 当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover

二、哨兵模式搭建环境准备

  • 哨兵模式工作基本流程

    • 每秒ping,超过时间不响应,则认为主观下线
    • 满足多个,则认为是客观下线
    • 投票选择主节点
    • 如果没有足够的节点同意master下线,则状态会被移除

环境准备

  • 配置3个哨兵,每个哨兵的配置都是一样的
  • 启动顺序:先启动主再启动从最后启动3个哨兵
  • 开放哨兵端口 26379

配置文件

Redis配置文件

Redis主节点的配置文件 redis.conf

  1. bind 0.0.0.0
  2. port 6379
  3. daemonize yes
  4. requirepass "1qazXSW@"
  5. logfile "/usr/local/redis/log/redis.log"
  6. dbfilename "xdclass.rdb"
  7. dir "/usr/local/redis/data"
  8. appendonly yes
  9. appendfilename "appendonly.aof"
  10. masterauth "1qazXSW@"

其余两个从节点的配置文件redis.conf

这里,比主节点的配置多了一行,从节点设置了“是哪个主节点的副本” 写的是主节点的IP和端口

  1. bind 0.0.0.0
  2. port 6379
  3. daemonize yes
  4. requirepass "1qazXSW@"
  5. logfile "/usr/local/redis/log/redis.log"
  6. dbfilename "xdclass.rdb"
  7. dir "/usr/local/redis/data"
  8. appendonly yes
  9. appendfilename "appendonly.aof"
  10. # 注意这里,比主节点的配置多了一行,从节点设置了“是哪个主节点的副本” 写的是主节点的IP和端口
  11. replicaof 192.168.75.147 6379
  12. masterauth "1qazXSW@"

Sentinel配置文件,三个节点一致

在 /usr/local/redis/conf 目录中创建 sentinel.conf配置文件,内容如下

  1. # 端口号
  2. port 26379
  3. # 不限制ip
  4. bind 0.0.0.0
  5. # 让sentinel服务后台运行
  6. daemonize yes
  7. pidfile "/var/run/redis-sentinel.pid"
  8. # 这个文件夹需要手动创建
  9. logfile "/var/log/redis/sentinel.log"
  10. dir "/tmp"
  11. # 配置监听的主服务器,mymaster代表服务器的名称,是自定义的;192.168.75.147 6379 代表监控的主服务器和端口
  12. # 2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作
  13. sentinel monitor mymaster 192.168.75.147 6379 2
  14. # 超过5秒master还没有连接上,则认为master已经停止
  15. sentinel down-after-milliseconds mymaster 5000
  16. # sentinel auth-pass定义服务的密码,mymaster是服务名称,1qazXSW@是Redis主服务器密码
  17. sentinel auth-pass mymaster 1qazXSW@
  18. # 如果该时间内没完成failover操作,则认为本次failover失败
  19. sentinel failover-timeout mymaster 30000

三、启动哨兵集群

先启动三个redis节点,再启动三个sentinel哨兵

  1. [root@localhost bin]# ./redis-server ../conf/redis.conf

进入 /usr/local/redis/bin 目录,执行命令,启动三个sentinel哨兵

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

可以登录某一节点的客户端 ./redis-cli -a 1qazXSW@ 输入 info replication 命令,查看节点信息

主节点

  1. 主节点 rolemaster
  2. 127.0.0.1:6379> info replication
  3. # Replication
  4. role:master
  5. connected_slaves:2
  6. slave0:ip=192.168.75.147,port=6379,state=online,offset=49930,lag=1
  7. slave1:ip=192.168.75.150,port=6379,state=online,offset=50075,lag=0
  8. master_failover_state:no-failover
  9. master_replid:c3fda7b64168dff3811b46b5938196f510697021
  10. master_replid2:0000000000000000000000000000000000000000
  11. master_repl_offset:50075
  12. second_repl_offset:-1
  13. repl_backlog_active:1
  14. repl_backlog_size:1048576
  15. repl_backlog_first_byte_offset:1
  16. repl_backlog_histlen:50075

从节点

  1. 从节点 roleslave
  2. 127.0.0.1:6379> info replication
  3. # Replication
  4. role:slave
  5. master_host:192.168.75.149
  6. master_port:6379
  7. master_link_status:up
  8. master_last_io_seconds_ago:0
  9. master_sync_in_progress:0
  10. slave_repl_offset:84229
  11. slave_priority:100
  12. slave_read_only:1
  13. connected_slaves:0
  14. master_failover_state:no-failover
  15. master_replid:c3fda7b64168dff3811b46b5938196f510697021
  16. master_replid2:0000000000000000000000000000000000000000
  17. master_repl_offset:84229
  18. second_repl_offset:-1
  19. repl_backlog_active:1
  20. repl_backlog_size:1048576
  21. repl_backlog_first_byte_offset:1
  22. repl_backlog_histlen:84229

四、哨兵集群验证

三个主从节点、三个哨兵集群全部启动之后,可以进行验证,当主节点失效后,通过更改配置文件,将从节点提拔为主节点。

关闭主节点,查看配置文件,或者是log,**下面是配置文件和Log的截图**

1、配置文件:

被关闭的主节点配置文件

  1. bind 0.0.0.0
  2. port 6379
  3. daemonize yes
  4. requirepass "1qazXSW@"
  5. logfile "/usr/local/redis/log/redis.log"
  6. dbfilename "xdclass.rdb"
  7. dir "/usr/local/redis/data"
  8. appendonly yes
  9. appendfilename "appendonly.aof"
  10. masterauth "1qazXSW@"
  11. # Generated by CONFIG REWRITE
  12. pidfile "/var/run/redis.pid"
  13. save 3600 1
  14. save 300 100
  15. save 60 10000
  16. user default on sanitize-payload #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all
  17. replicaof 192.168.75.149 6379

# Generated by CONFIG REWRITE 下面的都是sentinel哨兵自动生成的配置文件,仔细看会发现最下方多了一行 replicaof 192.168.75.149 6379 ,因为主节点(IP是 192.168.75.147 6379)被关闭了,已经没有了主节点的身份,再次上线时就会成为新选举的主节点的从节点。

并且,其中多了几个save,说明sentinel自动开启了RDB持久化

被选为主节点的从节点(192.168.75.149 6379)配置文件

  1. bind 0.0.0.0
  2. port 6379
  3. daemonize yes
  4. requirepass "1qazXSW@"
  5. logfile "/usr/local/redis/log/redis.log"
  6. dbfilename "xdclass.rdb"
  7. dir "/usr/local/redis/data"
  8. appendonly yes
  9. appendfilename "appendonly.aof"
  10. masterauth "1qazXSW@"
  11. # Generated by CONFIG REWRITE
  12. pidfile "/var/run/redis.pid"
  13. save 3600 1
  14. save 300 100
  15. save 60 10000
  16. user default on sanitize-payload #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all

可以看到中间有个空行,说明他(192.168.75.149 6379)变成了主节点

看另一个从节点

  1. bind 0.0.0.0
  2. port 6379
  3. daemonize yes
  4. requirepass "1qazXSW@"
  5. logfile "/usr/local/redis/log/redis.log"
  6. dbfilename "xdclass.rdb"
  7. dir "/usr/local/redis/data"
  8. appendonly yes
  9. appendfilename "appendonly.aof"
  10. replicaof 192.168.75.149 6379
  11. masterauth "1qazXSW@"
  12. # Generated by CONFIG REWRITE
  13. pidfile "/var/run/redis.pid"
  14. save 3600 1
  15. save 300 100
  16. save 60 10000
  17. user default on #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all

另一个没有被选为主节点的从节点的配置文件中,replicaof 已经从 192.168.75.147 6379 变为192.168.75.149 6379,因为主从结构的主节点已经改变。

2、主从节点的Log redis的log 和 sentinel的log

2.1、redis的log

三节点都在启动后,tail -f redis.log 命令,查看三个节点的log

主节点的log redis的log

1849f1cd4e134a75b6bdb35e60d765b7.jpeg

子节点的log redis的log

0ebc304c652b4328addba8d333b4688d.png 只有同步AOF,rewrite混合模式默认开启,数据恢复时,先找aof文件,找到了就开始持久化。找不到aof文件才开始找rdb文件。

此时,关闭主节点,查看log状态 这里查看的是 redis的log

关闭主节点

  1. [root@localhost bin]# ./redis-cli -a 1qazXSW@
  2. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  3. 127.0.0.1:6379> shutdown
  4. not connected>

主节的点log redis的log

31e527f36a6a4cac98271252a9e2e456.png

被选为slave的子节点的log redis的log

8e07639817b846b8a7f8dc2c2822f8d7.png

被选为master的子节点的log redis的log

872260b16b3e4e32839976a835e1ec18.png

2.2、sentinel的log

cd 进入给定的sentinel的log目录 cd /var/log/redis/sentinel.log

主节点的log sentinel的log

1061a5e393754db3a97d8dbdef287515.png

被选为master的从节点的log sentinel的log

37d3e09873c7450dab267271df09777c.png

3、Sentinel哨兵集群优缺点

  • 优点

    • 主从可以自动切换,可用性更高
  • 缺点

    • 主从切换会丢失短暂数据
    • 主节点的写能力和存储能力受限

五、Spring整合Redis主从+Sentinel哨兵

  • 注释掉 host和port

dc6d88238187416c8ba9b3414e130b2d.png

  • 新增配置

    sentinel:
    master: mymaster
    nodes: 8.129.113.233:26379,8.129.113.233:26380,8.129.113.233:26381

发表评论

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

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

相关阅读