zoukankan      html  css  js  c++  java
  • redis高可用之sentinel哨兵

    一,单实例模式

    当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行。

    二,主从模式

    由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份。当一台redis出现问题了,另一台redis可以继续提供服务。

    三,自动故障转移机制

    • 虽然上面redis做了备份,看上去很完美。但由于redis目前只支持主从复制备份(不支持主主复制),当主redis挂了,从redis只能提供读服务,无法提供写服务。所以,还得想办法,当主redis挂了,让从redis升级成为主redis。
    • 这就需要自动故障转移,redis sentinel带有这个功能,当一个主redis不能提供服务时,redis sentinel可以将一个从redis升级为主redis,并对其他从redis进行配置,让他们使用新的主redis进行复制备份。
    • Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。它的主要功能有以下几点
    • 实时地监控redis是否按照预期良好地运行;
    • 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
    • 能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其他的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

    四,redis的主从复制部署

    4.1 环境描述

    这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。

    redis-server

    说明

    redis-sentinel

    10.1.1.153:8000

    redis-master

     10.1.1.153: 6800

    10.1.1.154:8000

    redis-slaveA

     10.1.1.154: 6800

    10.1.1.155:8000

    redis-slaveB

     10.1.1.155: 6800

    部署环境,关闭防火墙和selinux

    4.2 redis-server端的部署

     三台服务器上都进行如下编译安装

    [root@redis-master ~]# yum -y install gcc gcc-c++ make automake autoconf
    [root@redis-master ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
    [root@redis-master ~]# cd /usr/src/redis-4.0.11/
    [root@redis-master redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install

    [root@redis-master redis-4.0.11]# mkdir -p /usr/local/redis/conf
    [root@redis-master redis-4.0.11]# cp redis.conf /usr/local/redis/conf/
    [root@redis-master redis-4.0.11]# cp sentinel.conf /usr/local/redis/conf/ 

    [root@redis-master conf]# ln -s /usr/local/redis/bin/* /usr/local/bin/

    4.3 redis.conf配置文件修改

    redis-master配置文件修改:(修改前可备份配置文件)

    [root@redis-master ~]# cd /usr/local/redis/conf/

    [root@redis-master conf]# ls
    redis.conf  sentinel.conf
    [root@redis-master conf]# cp redis.conf{,.bak}

    修改一下配置文件内容:

    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile "/var/log/redis-8000.log"

    redis-slave配置文件修改:

    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile "/var/log/redis-8000.log"
    6. slaveof 10.1.1.153 8000    #比redis主多这行

    4.4 redis-server的启动

    先启动redis-master再启动两个从(都放后台启动,为的是在前台能直接看到日志输出信息)

    [root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &

    通过命令查看主从复制情况

    [root@redis-master ~]# redis-cli -p 8000 info replication

    五,redis的高可用部署(redis-sentinel)

    1)修改sentinel.conf配置文件

     修改配置文件以下几行

    修改成如下内容

     [root@redis-master conf]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'

    注意:现在这个sentinel.conf是可以scp的(没启动sentinel之前),但是当启动了sentinel后就不可以再scp了,启动了sentinel,它会在配置文件里加很多东西,它会往里面写许多数据,行号就和之前的行号不一样了,其中就会有sentinel的myid号,启动之后再复制,会导致所有sentinel的myid号都一样,它们之间都会认为是自己,就找不着对方了。

    配置文件说明:

    • sentinel monitor master8000 10.1.1.153 8000 2 
      • master8000:监控的主节点名字(随便写)
      • 10.1.1.153 8000 :主节点的IP和端口
      • 2:将这个主实例判断为失效至少需要2个 sentinel进程的同意,只要同意sentinel的数量不达标,自动failover就不会执行
    • sentinel down-after-milliseconds master8000 5000(5秒) 
      • 当master8000节点宕机后多久进行检查
    • sentinel parallel-syncs master8000 1 
      • 设定sentinel并发还是串行,1代表每次只能复制一个,可以减轻master压力
    • sentinel failover-timeout master8000 15000(15秒) 
      • 表示故障转移的超时时间

    再在sentinel.conf的最后追加以下四句话

    1. daemonize yes   #守护进程模式
    2. logfile "/var/log/sentinel.log"
    3. pidfile "/var/run/sentinel.pid"
    4. protected-mode no  

    2)启动redis-sentinel(先启动master)

    [root@redis-master ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &(后台启动)

    虽然用redis客户端连接sentinel 6800端口可以连接,但是往里面输入命令是没用的,sentinel是看info的

    6800端口是sentinel之间互相访问的,sentinel的使用是主从突然发生切换,可以通过访问任何一台机器的sentinel,就会知道把谁切换成主了(没实现VIP漂移之前就是这么查看)

    启动以后,查看sentinel信息

    启动完sentinel之后,查看它的配置文件多了哪些东西

    再启动redis-slaveA的sentinel

    [root@redis-slaveA ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &

    启动以后,查看sentinel信息

    再启动redis-slaveB的sentinel

    [root@redis-slaveB~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &

    启动以后,查看sentinel信息

    3)进行redis-master的宕机测试

    我们宕掉redis-master的redis-server服务,然后查看sentinel信息

     [root@redis-master conf]# redis-cli -p 8000 shutdown

    查看redis-sentinel日志

     [root@redis-master conf]# cat /var/log/sentinel.log
    日志信息略,能看懂就行,看不懂百度翻译

    再把主的服务启动,然后查看主的info信息

    [root@redis-master conf]# redis-server /usr/local/redis/conf/redis.conf &

    连续切换,试一下

    [root@redis-slaveB conf]# redis-server /usr/local/redis/conf/redis.conf &

    六,redis-sentinel的VIP漂移

    假如在redis上,我们也建立一个VIP机制,一旦redis-master宕机,那么本来在master上的VIP就会漂移到新的master上。 
    如此一来开发在连接redis的时候,即便redis-master发生切换,那么开发也不需要修改代码了。 
    这里我们可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递7个参数<master-name>,<role>,<state>,<from-ip>,<from-port>,<to-ip>,<to-port>,其中<to-ip>是新主redis的IP地址,可以在这个脚本里做VIP漂移操作

    在sentinel.conf里增加一句话

    sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh  增加漂移脚本路径

    写一个漂移脚本

     [root@redis-master redis]# pwd
    /usr/local/redis
    [root@redis-master redis]# vim notify_master6800.sh
    [root@redis-master redis]# cat notify_master6800.sh
    #!/bin/bash

    MASTER_IP=$6     #第六个参数就是sentinel传入进行来的新master的IP

    LOCAL_IP="10.1.1.153"     #脚本所在服务器的本地IP(每个服务器都不同)

    VIP="10.1.1.244"

    NETMASK="24"

    INTERFACE="ens32"

    if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
        /usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
        /usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
        exit 0
    else
        /usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
        exit 0
    fi
    exit 1

    改一下服务器的IP

    给脚本加x权限

     [root@redis-master redis]# chmod +x notify_master6800.sh

     重新启动所有的redis-sentinel进程

    [root@redis-master redis]# pkill redis-sentinel
    [root@redis-master redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf

     第一次时手动给master添加VIP

     [root@redis-master redis]# ip addr add 10.1.1.244/24 dev ens32

    让ip地址即刻生效

    [root@redis-master redis]# arping -q -c 3 -A 10.1.1.244 -I ens32

    接下来进行ip漂移测试

    查看VIP所在服务器

    查看redis-master所属服务器

    停止153服务器的redis-server服务

    [root@redis-master ~]# redis-cli -p 8000 shutdown
    查看redis-master的所属服务器

    在154服务器上查看VIP及主从复制情况

    再开启153的redis-server服务

    [root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &

    查看主从复制情况

    关掉154的服务,并查看154所属服务器

    [root@redis-slaveA conf]# redis-cli -p 8000 shutdown

    在主服务器153上查看VIP及主从复制情况

    将154服务开启,再看主从复制情况

    至此redis-sentinel的VIP漂移测试成功。redis-sentinel可以持续高可用,可以继续测试。

     

     

  • 相关阅读:
    Android内存泄漏检测利器:LeakCanary
    android webview js交互 第一节 (java和js交互)
    Android Studio JNI/NDK 编程(二) Windows 下环境搭建 demo 开发
    Android Volley 框架的使用(一)
    Android 6.0动态添加权限
    Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
    Dom对象的研究
    js 数据类型具体分析
    js 1.变量提升 2.条件语句 3.循环语句 4.加号+的使用
    js 的运算
  • 原文地址:https://www.cnblogs.com/wsnbba/p/10251604.html
Copyright © 2011-2022 走看看