zoukankan      html  css  js  c++  java
  • Redis系统学习之哨兵模式

    Redis哨兵模式(来自小姐姐的面试题72)

    • 自动选举老大的模式
    • 哨兵模式:sentinel,哨兵是redis中非常重要的组件
      • 集群控制:负责监控redis的master和slave进程是否正常工作
      • 消息通知:某个redis实例故障,哨兵负责发送消息作为报警通知给管理员
      • 故障转移:如果master node挂掉,自动转移到slave node上
      • 配置中心:如果故障转移发生,通知客户端新的master地址。

    哨兵用于实现redis集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作

      • 故障转移时,判断一个master是否宕机,需要大部分哨兵同意才行,涉及到分布式选举
      • 即使部分哨兵节点挂掉,哨兵集群只要还剩一个就还能正常工作
      • 哨兵通常需要3个实例,来保证自己的健壮性
      • 哨兵 + redis主从的部署结构,是不保证数据零丢失的,只保证redis集群的高可用性
      • 对于哨兵 + redis主从这种复杂的部署结构,尽量在测试环境和生产环境进行充足的测试和演练

    image.png

    • 这里的哨兵有两个作用
      • 通过发送命令,让redis服务器返回监控其运行状态,包括主服务器和从服务器
      • 当哨兵检测到Master宕机,会自动将Slave切换成Master,然后通过发布订阅模式通知其他 从服务器,修改配置文件,让他们切换主机
    • 然而一个哨兵进程,对Redis服务器进行监控,可能会出现问题,为此我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这就形成了多哨兵模式
    • image.png
    • 假设主服务器宕机,哨兵1先检查到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作,切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称之为客观下线
    • 其实主观就是自己认为,客观就是大多数人认为

    环境配置

    参考主从配置先搭建一主二从模式

    哨兵配置(单哨兵)

    还是采用A B C D四个窗口,来配置

    D:创建哨兵配置文件,并启动哨兵进程

    [root@localhost bin]# cd redisConfig/ 进入配置文件夹
    [root@localhost redisConfig]# vi sentinel.conf 创建名字为sentinel.conf的文件
    文件内容为:
    sentinel monitor mymaster 127.0.0.1 6379 1
    解释:sentinel monitor 主节点名字[随便起的] 主节点IP 主节点端口 哨兵投票的票数
    哨兵投票宕机是否确认死亡后决定故障转移的票数
    [root@localhost redisConfig]# ll
    总用量 260
    -rw-r--r--. 1 root root 63102 4月  24 19:39 redis-6379.conf
    -rw-r--r--. 1 root root 63102 4月  24 19:54 redis-6380.conf
    -rw-r--r--. 1 root root 63102 4月  24 19:56 redis-6381.conf
    -rw-r--r--. 1 root root 63089 4月  17 22:02 redis.conf
    -rw-r--r--. 1 root root    43 4月  24 23:17 sentinel.conf
    [root@localhost redisConfig]#
    
    启动:
    [root@localhost bin]# redis-sentinel redisConfig/sentinel.conf 启动命令
    9625:X 24 Apr 2021 23:25:06.639 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    9625:X 24 Apr 2021 23:25:06.639 # Redis version=5.0.12, bits=64, commit=00000000, modified=0, pid=9625, just started
    9625:X 24 Apr 2021 23:25:06.639 # Configuration loaded
    9625:X 24 Apr 2021 23:25:06.640 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                    _._
               _.-``__ ''-._
          _.-``    `.  `_.  ''-._           Redis 5.0.12 (00000000/0) 64 bit
      .-`` .-```.  ```/    _.,_ ''-._
     (    '      ,       .-`  | `,    )     Running in sentinel mode 运行一个哨兵
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379 端口号
     |    `-._   `._    /     _.-'    |     PID: 9625 pid
      `-._    `-._  `-./  _.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |           http://redis.io
      `-._    `-._`-.__.-'_.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |
      `-._    `-._`-.__.-'_.-'    _.-'
          `-._    `-.__.-'    _.-'
    `-._        _.-'
    `-.__.-'
    9625:X 24 Apr 2021 23:25:06.641 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    9625:X 24 Apr 2021 23:25:06.643 # Sentinel ID is bcedd6d917bb5ac16196b743632b8b7aa30c90ba
    9625:X 24 Apr 2021 23:25:06.643 # +monitor master mymaster 127.0.0.1 6379 quorum 1 主机为6379
    9625:X 24 Apr 2021 23:25:06.644 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379  丛机为6380
    9625:X 24 Apr 2021 23:25:06.645 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 从机为 6381

    测试,A将6379宕机,也就是关闭

    image.png

    等待一会看看哨兵的控制台

    master宕机了
    9625:X 24 Apr 2021 23:28:17.467 # +sdown master mymaster 127.0.0.1 6379
    哨兵1票通过
    9625:X 24 Apr 2021 23:28:17.467 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
    9625:X 24 Apr 2021 23:28:17.467 # +new-epoch 1
    开始进行故障转移
    9625:X 24 Apr 2021 23:28:17.467 # +try-failover master mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:17.476 # +vote-for-leader bcedd6d917bb5ac16196b743632b8b7aa30c90ba 1
    9625:X 24 Apr 2021 23:28:17.476 # +elected-leader master mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:17.476 # +failover-state-select-slave master mymaster 127.0.0.1 6379
    选择81为提升Master的节点
    9625:X 24 Apr 2021 23:28:17.529 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
    开始执行故障转移 81 执行 slaveof no one 提升为master
    9625:X 24 Apr 2021 23:28:17.529 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:17.584 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:18.154 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:18.154 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:18.202 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:19.170 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:19.170 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
    9625:X 24 Apr 2021 23:28:19.232 # +failover-end master mymaster 127.0.0.1 6379
    切换master 从79->81
    9625:X 24 Apr 2021 23:28:19.232 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381
    将80 的master 设置 为81
    9625:X 24 Apr 2021 23:28:19.232 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
    将79 的master 设置为81
    9625:X 24 Apr 2021 23:28:19.232 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
    9625:X 24 Apr 2021 23:28:49.237 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

    控制台输出完成后查看80 和 81

    B:查看80

    image.png

    master已经切换成为81

    C:查看81

    image.png

    已经提升成为master,并且有一个子节点80

    A:重新启动79

    image.png

    默认为主节点,没有从节点,等待一会等哨兵扫描到

    将6379 转化为slave,并将其master设置为 6381
    9687:X 24 Apr 2021 23:42:32.157 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

    A:再次查看

    image.png

    切换成功,单哨兵 完成

    哨兵配置(多哨兵)

    关闭刚才的单哨兵控制台

    D:ctrl+c

    网址:https://www.cnblogs.com/joeymary/p/11492791.html

    多哨兵就不写了,原理和单哨兵一样,就是多人选举决定是否宕机和slave升级票选,下面是配置参数

    #sentinel 配置
    
    #端口
    port 26379
    
    #目录
    dir /tmp
    
    #日志文件
    logfile /var/log/redis/redis-sentinel.log
    
    #是否在后台执行,yes:后台运行;no:不是后台运行
    daemonize yes
    
    #是否开启保护模式,默认开启。开启后,只能根据配置的bind地址和密码进行访问。
    protected-mode no
    
    #主节点信息,格式:sentinel <master-name> <ip> <redis-port> <quorum>;
    #<master-name> 自定义主节点名称;
    #<ip> <redis-port> 主节点的ip和端口;
    #<quorum> 多少个主节点检测到主节点有问题就进行故障转移
    sentinel monitor mymaster 127.0.0.1 6379 2
    
    #sentinel与master的心跳时间(毫秒),默认30秒。
    sentinel down-after-milliseconds mymaster 30000
    
    #故障转移时,最多可以有多少个slave同时对新的master进行数据同步,该值越小,完成故障转移的时间越长,但可用slave数量越多,该值越大,越多slave因为replication而不可用。建议设置为1。
    sentinel parallel-syncs mymaster 1
    
    #故障转移超时时间(毫秒),默认180秒。
    sentinel failover-timeout mymaster 180000
    
    #master和slaves密码。
    #sentinel auth-pass mymaster password
    
    #当sentinel有警告级别的事件发生时执行(也有的资料说failover时触发)的脚本。
    #sentinel notification-script <master-name> <script-path>
    
    #故障转移之后执行的脚本,并传递7个参数:<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>。
    #<master-name> 表示 master名字
    #<role> 表示的是 每个redis实力的角色,如leader、observer
    #<state> 表示状态
    #<from-ip> 原来的redis master
    #<from-port> 
    #<to-ip> 故障迁移后的redis master
    #<to-port>
    #sentinel client-reconfig-script <master-name> <script-path>

    作者:彼岸舞

    时间:202155

    内容关于:Redis

    本文属于作者原创,未经允许,禁止转发

  • 相关阅读:
    常见的web漏洞
    WEB前端性能优化常见方法
    前端多终端浏览器兼容
    vue中computer与watch区别
    Vue父子组件生命周期执行顺序
    Git配置文件的妙用
    Git的基本概念和操作
    对AUC计算公式和几何意义的理解(详细版)
    如何看文献
    Python函数 range()和arange()的区分
  • 原文地址:https://www.cnblogs.com/flower-dance/p/14731229.html
Copyright © 2011-2022 走看看