ITPub博客

首页 > 数据库 > NoSQL > redis经典模式3节点哨兵配置的一些坑

redis经典模式3节点哨兵配置的一些坑

原创 NoSQL 作者:e71hao 时间:2020-07-24 19:23:10 0 删除 编辑

一、故障描述

          redis版本:redis_version:4.0.10

        操心系统:centos7.5

        redis拓扑结构:三个主机,每个主机一个redis和sentinel.redis是主从模式。

          故障描述:假如redis主节点宕机,剩余2个从节点不能正常进行故障转移。

           哨兵日志错误:failover-abort-slave-timeout  ,failover-abort-no-good-slave

二、 结论

            (1) redis_version:4.0.10 版本,使用了rename命令进行了更改config命令, 假如其中主机节点宕机,会发生 failover-abort-slave-timeout错误,sentinel不能成功进行故障转移。

        (2) 3节点哨兵模式下,sentinel 配置为 sentinel monitor <master-name> <ip> <port> <quorum> ,其中quorum配置为1,假如其中主机节点宕机,会发生脑裂,sentinel不能进行成功选主。

三、模拟故障1

      本机三个主机节点192.168.1.134,192.168.3.141,192.168.3.142,每个节点一个哨兵,一个redis, redis配置加上下面命令:

# security
rename-command BGREWRITEAOF "CHAOSBGREWRITEAOF"
rename-command BGSAVE "CHAOSBGSAVE"
rename-command CONFIG "CHAOSCONFIG"

    

     模拟故障主节点宕机,剩余2个sentinel应该要进行故障转移,把剩余的其中一个redis节点提升为主节点。

 拿下sentinel日志来查看下

可以看到sentinel已经发现主机节点192.168.3.134已经宕机不可达,已经进行选主,然后进行切换,最终切换不成功。 +failover-state-sen-slaveof-noone”: Leader向slave发送“slaveof no one”指令,此时slave已经完成角色转换,此slave即为master,看关键字failover-abort-slave-timeout. 原因已经查询出来:为了安全的原因,改写了命令,本来redis的命令是CONFIG,被改为CHAOSCONFIG。

# security
#rename-command BGREWRITEAOF "CHAOSBGREWRITEAOF"
#rename-command BGSAVE "CHAOSBGSAVE"
#rename-command CONFIG "CHAOSCONFIG"

    把这个命令注销掉就不会发生 failover-abort-slave-timeout错误了。


四、模拟故障2

      本机三个主机节点192.168.1.134,192.168.3.141,192.168.3.142,每个节点一个哨兵,一个redis。注意一下哨兵配置如下:

[root@elk1 ~]# cat /opt/redis_lifekh/sentinel/sentinel.conf 
bind 192.168.3.134
protected-mode yes
port 7111
dir "/opt/redis_lifekh/sentinel"
daemonize yes
logfile "/log/redis_lifekh/6379/sentinel-7111.log"
sentinel myid fe521155a801ac9199f3a8e9d27301edc7d2aab8
sentinel monitor mymaster 192.168.3.142 6379 1

     注意配置1  sentinel monitor <master-name> <ip> <port> <quorum>, <quorum> 代表要判定主节点最终不可达所需要的票数。也就是说只有1票,sentinel发现redis没有心跳,就会从主观下线sdown变成客观下线odown,接着sentinel就可以进行sentinel的选主。

sentinel monitor mymaster 192.168.3.142 6379 1

    

redis配置如下

[root@elk1 ~]# cat /opt/redis_lifekh/sentinel/redis.conf 
bind 192.168.3.134
protected-mode yes
port 6379
tcp-backlog 511
timeout 60
tcp-keepalive 300
daemonize yes
supervised no
pidfile "/data/redis_lifekh/6379/redis-6379.pid"
loglevel notice
logfile "/log/redis_lifekh/6379/redis-6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
slaveof  192.168.3.134

   把环境搭建好模拟主节点宕机,看到并没有进行正常故障转移,日志如下:

看关键日志failover-abort-no-good-slave

五、总结

        以上2个故障可以重现。注意的哨兵的 quorum配置不正确,会导致脑裂发生,导致不能正常进行选主。3 个sentinel,quorum配置为2,5个sentinel, quorum配置为3。


参考: https://www.cnblogs.com/myd620/p/7811156.html 

Raft协议实战之Redis Sentinel的选举Leader源码解析


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30393770/viewspace-2706857/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-08-05

  • 博文量
    122
  • 访问量
    170829