zoukankan      html  css  js  c++  java
  • Redis之哨兵模式

    一:简介

    Redis-sentinel是Redis提供的高可用方案,在redis主从模式中,当master宕机,redis本身(包括slave)都没有自动切换的机制

    redis-sentinel是一个独立的进程,其可以监控多个redis集群,当master宕机的时候,可以自动进行切换

     Sentinel是一个监视器,其可以根据被监视实例的身份和状态来执行何种动作

    二:Redis-Sentinel功能

    监控(Monitoring

    Sentinel会不断检测你的主服务器和从服务器是状态是否正常

    提醒(Notification)

    当监控发现某个Redis实例出现问题,其可以通过某个API告知管理员

    自动故障迁移(Automatic Failover)

    当检测到主服务器宕机的时候,Sentinel会从所属失效主服务器的从服务器选举新的主服务器,并且通告失效主服务器所属其余的从服务器新的主服务器,当客户端视图连接失效主服务器的时候,集群也会通告新的主服务器的地址,使得新的主服务器可以代替失效主服务器

    三:服务器连接

    一:发现并连接主服务器

    Sentinel 通过用户给定的配置文件来发现主服务器。

     Sentinel会与被监视的主服务器创建两个网络连接

    1:命令连接用于向主服务器发送命令

    2:订阅连接用于订阅指定的频道,从而发现监视同一主服务器的其他 Sentinel。

    二:Sentinel发现并连接从服务器

    1:Sentinel通过向主服务器发送INFO命令来自动获得所有从服务器的IP地址

    2:Sentinel会与每个从服务器创建命令连接以及订阅连接

     三:发现其余Sentinel

    Sentinel会通过命令向被监视的主机发送Hello消息,改信息包含Sentinel的IP PORT ID等内容以此向其余Sentinel主机宣告自己的存在,与此同时其会通过订阅连接接受其余Sentinel的Hello信息,以此来发现监视同一主服务器其余的Sentinel

     PS:Sentinel1通过发送Hello消息宣告自己的存在,通过订阅命令发现其余的Sentinel 其余Sentinel的操作与Sentinel1一样

    四:Sentinel连接

    多个Sentinel之间只会创建命令连接用于进行通信,因为有主从服务器通过Hello信息宣告自己的存在,因此不需要再次进行订阅连接

     四:实例状态监测

    一:监测方式

    Sentinel会通过ping命令来监测实例状态,如果实例在指定状态没有回复信息,或者回复的信息错误,则认为该实例下线

     二:Sentinel下线区别

    主观下线(SDOWN):单个Sentinel实例对服务器做出下线判断

    客观下线(ODOWN):指的是多个Sentinel实例对同一个服务器做出SDOWN判断,并且通告Sentinel is-master-down-by-addr相互交流之后做出服务器下线判断(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线),如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内,对向他发送ping命令的Sentinel发出有效回应,那么Sentinel实例就会认为该服务器下线

     五:故障转移

    一次故障转移操作由以下步骤组成:

    '''
    1.   发现主服务器已经进入客观下线状态。
    
    2.   基于Raft leader election 协议 , 进行投票选举
    
    3.   如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。 如果当选成功, 那么执行以下步骤。
    
    4.   选出一个从服务器,并将它升级为主服务器。
    
    5.   向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
    
    6.   通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel ,其他 Sentinel 对它们自己的配置进行更新。
    
    7.   向已下线主服务器的从服务器发送 SLAVEOF 命令,让它们去复制新的主服务器。
    
    8.   当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。
    '''

    六:配置Sentinel

    创建程序目录

    cd /application
    mkdir 26380
    cp /usr/local/redis/src/redis-sentinel ./26380/
    cd  26380

      编辑配置文件

    vim sentinel.conf
    port 26380
    dir "/tmp"
    sentinel monitor mymaster 127.0.0.1 6380 2
    sentinel down-after-milliseconds mymaster 60000
    sentinel config-epoch mymaster 0

    启动sentinel

    ./redis-sentinel ./sentinel.conf

    配置文件说明

    # 指定监控master
    sentinel monitor mymaster 127.0.0.1 6370 2 
    # {2表示多少个sentinel同意}
    # 安全信息
    sentinel auth-pass mymaster root
    # 超过15000毫秒后认为主机宕机
    sentinel down-after-milliseconds mymaster 15000 
    # 当主从切换多久后认为主从切换失败
    sentinel failover-timeout mymaster 900000
    # 这两个配置后面的数量主从机需要一样,epoch为master的版本
    sentinel leader-epoch mymaster 1
    sentinel config-epoch mymaster 1

    Sentinel命令操作

     七:发布订阅消息

    1:客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。

    2:一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

    通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。

    3:以下列出的是客户端可以通过订阅来获得的频道和信息的格式

     第一个英文单词是频道/事件的名字,其余的是数据的格式。

    注意, 当格式中包含 instance details 字样时, 表示频道所返回的信息中包

    4:含了以下用于识别目标实例的内容

    <instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
    @ 字符之后的内容用于指定主服务器, 这些内容是可选的, 它们仅在 @ 字符之前的内容指定的实例不是主服务器时使用。

    八:Python配置Redis-Sentinel

    import redis
    from redis.sentinel import Sentinel
    
    # 连接哨兵服务器(主机名也可以用域名)
    sentinel = Sentinel([('172.31.0.2', 5001),
                         ('172.31.0.3', 5001),
                         ('172.31.0.4', 5001),
                         ('172.31.0.5', 5001)
                         ],
                        socket_timeout=0.5)
    
    
    
    # 获取主服务器地址
    master = sentinel.discover_master('mymaster')
    print(master)
    # 输出:('172.31.0.2', 5001)
    
    
    # 获取从服务器地址
    slave = sentinel.discover_slaves('mymaster')
    print(slave)
    # 输出:[('172.31.3', 5001), ('172.31.0.4', 5001), ('172.31.0.5', 5001)]
    
    
    
    # 获取主服务器进行写入
    master = sentinel.master_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
    w_ret = master.set('foo', 'bar')
    # 输出:True
    
    
    # # 获取从服务器进行读取(默认是round-roubin)
    slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
    r_ret = slave.get('foo')
    print(r_ret)
  • 相关阅读:
    SQL Server中的sysobjects
    SQL:事务(1)
    继续探究HTML与CSS:图像映射
    SQL:事务(2)
    找工作?该复习了!(转)
    继续探究HTML与CSS:!important 和 @import 规则
    JAVA数据结构:二叉树
    SQL:Like 通配符及特殊用法Escape
    JavaScript高级程序设计:在HTML中使用JavaScript
    一个有趣的时钟
  • 原文地址:https://www.cnblogs.com/SR-Program/p/12451647.html
Copyright © 2011-2022 走看看