Redis Sentinel 容灾演练

本文主要介绍基于redis高可用的集群搭建,并做相应的高可用的容灾演练过程,熟悉一下redis高可用的方案配置;

简单的redis 系列教程可以查看之前的文章 http://www.dczou.com/viemall/tag/redis

首先的知道redis Sentinel 主从原理机制:

image.pngimage.png

image.pngimage.png


安装搭建Sentinel 集群:

分别有3个Sentinel节点,1个主节点,1个从节点组成一个简单的高可用方案;

role

IP

port

master

192.168.1.104

6379

slave

192.168.1.105

6379

Sentinel1

192.168.1.104

5000

Sentinel2

192.168.1.105

5000

Sentinel3

192.168.1.106

5000

安装redis 和部署redis 的主从方式,本章不阐述

配置sentinel.conf

哨兵默认用26379端口,默认不能跟其他机器在指定端口连通,只能在本地访问

192.168.1.104机器实例:

将sentinel.conf 复制 /usr/local/redis/etc

cp /opt/program/tools/redis-4.0.10/sentinel.conf  /usr/local/redis/etc

配置如下:

port 5000

bind 192.168.1.104

dir /tmp

sentinel monitor mymaster 192.168.1.104 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 60000

sentinel parallel-syncs mymaster 1

daemonize yes

logfile /usr/local/redis/logs/sentinel_5000_log.log

192.168.1.105机器实例:

port 5000
bind 192.168.1.105
dir /tmp
sentinel monitor mymaster 192.168.1.104 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
daemonize yes
logfile /usr/local/redis/logs/sentinel_5000_log.log

192.168.1.106机器实例:

port 5000
bind 192.168.1.106
dir /tmp
sentinel monitor mymaster 192.168.1.104 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
daemonize yes
logfile /usr/local/redis/logs/sentinel_5000_log.log

Sentinel 配置文件解析:

http://www.mamicode.com/info-detail-1898706.html

检查设置:

启动哨兵进程

在192.168.1.104、192.168.1.105、192.168.1.106三台机器上,分别启动三个哨兵进程,组成一个集群,观察一下日志的输出

启动哨兵:

   方式一:redis-sentinel /path/to/sentinel.conf(推荐,这种方式启动和redis实例没有任何关系)

  方式二:redis-server /path/to/sentinel.conf –sentinel

  image.png

  日志里会显示出来,每个哨兵都能去监控到对应的redis master,并能够自动发现对应的slave

  哨兵之间,互相会自动进行发现,用的就是之前说的pub/sub,消息发布和订阅channel消息系统和机制


检查哨兵状态

redis-cli -h 192.168.1.104 -p 5000

sentinel master mymaster

SENTINEL slaves mymaster

SENTINEL sentinels mymaster

SENTINEL get-master-addr-by-name mymaster


检查各个redis状态查看

104、105主从状态查看命令

image.png

image.png


演练步骤:

哨兵节点的增加和删除:

    增加sentinal,会自动发现

   删除sentinal的步骤:

    (1)停止sentinal进程

    (2)SENTINEL RESET *,在所有sentinal上执行,清理所有的master状态

    (3)SENTINEL MASTER mymaster,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致


slave的永久下线

   让master摘除某个已经下线的slave:SENTINEL RESET mastername,在所有的哨兵上面执行

    slave-priority,值越小优先级越高

容灾演练:

  master redis主节点宕机,看是否slave会选举成新的master节点;

  通过哨兵看一下当前的master:SENTINEL get-master-addr-by-name mymaster

  image.png

  image.png

   已经切换成功了;

    可以看到log信息

    image.png

    查看sentinal的日志,是否出现+sdown字样,识别出了master的宕机问题; 然后出现+odown字样,就是指定的quorum哨兵数量,都认为master宕机了

故障恢复

再将旧的master重新启动,查看是否被哨兵自动切换成slave节点

image.png

经过以上步骤,基本的sentinel下的高可用一主一从redis高可用就配置完成了。

java测试代码:

public static void main(String[] args) {

        Set<String> sentinels = new HashSet<String>();

        sentinels.add(new HostAndPort("192.168.1.104", 500).toString());

        sentinels.add(new HostAndPort("192.168.1.105", 500).toString());

        sentinels.add(new HostAndPort("192.168.1.106", 500).toString());

        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);

        System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());

    }