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

    一、sentinel介绍

    Sentinel作用: 
    1):Master状态检测 
    2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 
    3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 

    Sentinel工作方式: 
    1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令 
    2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。 
    3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。 
    4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 
    5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 
    6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 
    7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 
    8):若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

    主观下线和客观下线 
    主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。 
    客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.

    通俗来讲就是: 
    redis的sentinel系统用来管理多个redis服务器,可以实现一个功能上实现HA的集群。该系统主要执行三个任务: 
    ①监控( Monitoring ): Redis Sentinel实时监控主服务器和从服务器运行状态。 
    ②提醒(notification): 当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知 
    一个简单的主从结构加sentinel集群的架构图如下: 

     上图是一主两从节点,sentinel集群之间会互相通信,沟通交流redis节点的状态,做出相应的判断并进行处理,这里的主观下线状态和客观下线状态是比较重要的状态,它们决定了是否进行故障转移 可以 通过订阅指定的频道信息,当服务器出现故障得时候通知管理员 客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。 

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

    二、搭建redis-sentinel 集群环境

    1、下载redis编译安装包:redis-2.8.19.tar.gz,然后解压缩进行编译安装。将redis安装到/opt/redis目录下。

    1 [root@idxs21-108 redis]# mkdir bin              #redis脚本文件 
    2 [root@idxs21-108 redis]# mkdir conf             #redis配置文件 
    3 [root@idxs21-108 redis]# mkdir data             #redis的本地数据存放 
    4 [root@idxs21-108 redis]# mkdir logs             #redis日志文件 
    5 [root@idxs21-108 redis]# tar zxvf redis-2.8.19.tar.gz cd redis-2.8.19 
    6 [root@idxs21-108 redis]# make PREFIX=/opt/redis install cp *.conf /opt/redis/conf  #把安装源文件中的.conf配置文件拷贝一份到安装目录下的conf目录中。 
    7 [root@idxs21-108 redis]# cd /opt/redis/conf cp redis.cof redis.conf.bak cp sentinel.conf sentinel.conf.bak   

    2.在安装redis成功后,可以在/opt/redis/bin目录下看到以下内容:

    1 [root@idxs21-108 bin]# ll
    2 total 15220
    3 -rwxr-xr-x 1 root root 4586251 Mar 10  2015 redis-benchmark
    4 -rwxr-xr-x 1 root root   22177 Mar 10  2015 redis-check-aof
    5 -rwxr-xr-x 1 root root   45387 Mar 10  2015 redis-check-dump
    6 -rwxr-xr-x 1 root root 4679739 Mar 10  2015 redis-cli
    7 lrwxrwxrwx 1 root root      27 Jun 20 15:59 redis-sentinel -> /opt/redis/bin/redis-server
    8 -rwxr-xr-x 1 root root 6241748 Mar 10  2015 redis-server

    3、修改master机器配置文件(这里直接使用的sed命令做的替换):

     1 # -- redis.conf                                                   #修改redis.conf
     2 sed -i 's/daemonize no/daemonize yes/g' redis.conf            #使用后台方式运行         
     3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf  #配置日志路径
     4 # no AOF and RDB for master                                #配置数据同步策略,master节点注释关闭掉dump数据同步
     5 sed -i 's/save 900 1/# save 900 1/g' redis.conf
     6 sed -i 's/save 300 10/# save 300 10/g' redis.conf
     7 sed -i 's/save 60 10000/# save 60 10000/g' redis.conf
     8 sed -i 's/appendonly no/appendonly yes/g' redis.conf          #打开aof同步
     9 sed -i 's/dir .//dir "/opt/redis/data/"/g' redis.conf       #配置数据文件存放路径
    10 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf
    11 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf
    12  
    13 # -- sentinel.conf                                                #修改sentinel.conf文件
    14 echo 'daemonize yes' >> sentinel.conf                        #后台方式运行sentinel
    15 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf
    16 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf  #配置哨兵模式 

    4、修改slave机器配置文件,两台slave配置一样:

     1 # -- redis.conf
     2 sed -i 's/daemonize no/daemonize yes/g' redis.conf      
     3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf     
     4 sed -i 's/# save ""/save ""/g' redis.conf         
     5 sed -i 's/appendonly no/appendonly yes/g' redis.conf      
     6 sed -i 's/dir .//dir "/opt/redis/data/"/g'redis.conf          
     7 
     8 # SLOWLOG GET or SLOWLOG GET number
     9 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf
    10 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf
    12 echo "slaveof 10.135.40.118 6379" >> redis.conf                        #指定master节点
    13 
    14 # -- sentinel.conf
    15 echo 'daemonize yes' >> sentinel.conf        
    16 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf
    17 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf      

    5、配置文件修改完成之后启动redis服务,从master开始启动,所有节点的启动方式和命令都是一样的。

    1 启动redis服务和sentinel服务:
    2 [root@idxs21-108 redis]# /opt/redis/bin/redis-server /opt/redis/conf/redis.conf
    3 [root@idxs21-108 redis]# /opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf
    4 查看服务进程状态:
    5 [root@idxs21-108 redis]# ps -ef | grep redis
    6 root      10024   9807  0 17:14 pts/0    00:00:00 grep redis
    7 root      68378      1  0 Jul28 ?        01:30:09 /opt/redis/bin/redis-sentinel *:26379                      
    8 root      68379      1  0 Jul28 ?        00:35:16 /opt/redis/bin/redis-server *:6379 

    6、测试

    1>.测试数据同步

     1 主redis写入数据:
     2 [root@idxs40-118 redis]# redis-cli -p 6379
     3 127.0.0.1:6379> set name abc
     4 OK
     5 127.0.0.1:6379> get name
     6 "abc"
     7 127.0.0.1:6379>
     8 从redis读取数据:
     9 [root@idxs40-117 redis]# redis-cli -p 6379
    10 127.0.0.1:6379> get name
    11 "abc"
    12 127.0.0.1:6379>
    13 从redis读取数据:
    14 [root@idxs40-119 redis]# redis-cli -p 6379
    15 127.0.0.1:6379> get name
    16 "abc"
    17 127.0.0.1:6379>

    2>.redis默认是读写分离的,只有master能写,slave只能读:

    1 [root@idxs40-117 ~]# redis-cli -p 6379
    2 127.0.0.1:6579> set name 123
    3 (error) READONLY You can't write against a read only slave.

    这里可看到,slave节点默认只有读的权限,无法进行写入操作。

    7、sentinel一些命令介绍 要使用sentinel的命令,我们需要用redis-cli命令进入到sentinel:

    [root@idxs21-108 redis]# redis-cli -h 10.135.40.118 -p 26379
    ①INFO  sentinel的基本状态信息 
    ②SENTINEL masters  列出所有被监视的主服务器,以及这些主服务器的当前状态 
    ③SENTINEL slaves  列出给定主服务器的所有从服务器,以及这些从服务器的当前状态 
    ④SENTINEL get-master-addr-by-name  返回给定名字的主服务器的 IP 地址和端口号 
    ⑤SENTINEL reset  重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。 
    ⑥SENTINEL failover  当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

    8、如果master节点宕机,会从两台slave中自动选举出一台机器接替master角色。后期如果老的master节点重新恢复,重新加入集群中,也只能是salve节点。

  • 相关阅读:
    C++中数字与字符串之间的转换
    关于安卓启动eclipse错误:找不到元素‘d:devices'的声明
    linux相关解压命令
    泛型
    CRUD工程师---番外篇---反射
    CRUD工程师---设计模式
    AOP切面日志
    CRUD工程师---InnoDB存储引擎
    CRUD工程师---InnoDB存储引擎2
    CRUD工程师---InnoDB存储引擎4(表)
  • 原文地址:https://www.cnblogs.com/qiyuanchang/p/7390182.html
Copyright © 2011-2022 走看看