Redis通过sentinel实现高可用架构简单配置说明

.环境准备

版本信息:

System version: Red Hat Enterprise Linux Server release 6.4 (Santiago) 2.6.32-358.el6.x86_64

Redis version: redis-2.8.21

 

主机信息:

ip地址

安装软件

角色

192.168.199.127

redis

Redis master

192.168.199.128

redis

Redis slave

VIP:192.168.199.162

 

拓扑图:

图片1.png


.安装配置redis

192.168.199.127 master、192.168.199.128 slave都按以下部署redis
#安装
/etc/init.d/iptables stop
setenforce 0
yum install -y gcc
tar zxf redis-2.8.21.tar.gz 
cd redis-2.8.21
make MALLOC=jemalloc
make PREFIX=/usr/local/redis-2.8.21 install
echo "vm.overcommit_memory=1" >>/etc/sysctl.conf
tail -1 /etc/sysctl.conf
sysctl -p
 
#配置
ln -s /usr/local/redis-2.8.21 /usr/local/redis
mkdir /usr/local/redis/{conf,dbdir,logs,scripts} -p   #创建4个目录,分别放置配置文件,缓存落地数据文件,日志,脚本
cp redis.conf sentinel.conf  /usr/local/redis/conf/
ll /usr/local/redis/conf/
sed -i '/daemonize no/s#no#yes#g' /usr/local/redis/conf/redis.conf  #修改daemon模式启动
sed  -i  '/logfile ""/s#""#/usr/local/redis/logs/redis.log#g' /usr/local/redis/conf/redis.conf    #修改redis日志路径
sed -i '/dir .\//s#./#/usr/local/redis/dbdir#g' /usr/local/redis/conf/redis.conf   #设置持久化数据的存放路径
sed -i '/# maxmemory <bytes>/s#\# maxmemory <bytes>#maxmemory 2g#g' /usr/local/redis/conf/redis.conf   #设置最大内存
 
#环境变量设置
echo 'PATH=/usr/local/redis/bin:$PATH' >>/etc/profile
tail -1 /etc/profile
source /etc/profile
which redis-cli
 
#启动redis
/usr/local/redis/bin/redis-server  /usr/local/redis/conf/redis.conf 
ps -ef |grep redis
 
#测试
redis-cli
27.0.0.1:6379> set no001 'liyiliang'
OK
127.0.0.1:6379> get no001
"liyiliang"
127.0.0.1:6379> save
[2586] 25 Jul 15:55:59.869 * DB saved on disk
OK
127.0.0.1:6379> 
[root@localhost conf]# ll /usr/local/redis/dbdir/
total 4
-rw-r--r--. 1 root root 37 Jul 25 15:55 dump.rdb

.配置主从

#192.168.199.128 slave配置
redis-cli -p 6379 shutdown  #关闭redis
vim redis.conf
slaveof 192.168.199.127 6379
 
#启动redis slave
/usr/local/redis/bin/redis-server  /usr/local/redis/conf/redis.conf 
 
#查看redis master日志
[2419] 25 Jul 16:27:19.350 * DB loaded from disk: 0.000 seconds
[2419] 25 Jul 16:27:19.351 * The server is now ready to accept connections on port 6379
[2419] 25 Jul 16:57:34.864 * Slave 192.168.199.128:6379 asks for synchronization
[2419] 25 Jul 16:57:34.864 * Full resync requested by slave 192.168.199.128:6379
[2419] 25 Jul 16:57:34.864 * Starting BGSAVE for SYNC with target: disk
[2419] 25 Jul 16:57:34.865 * Background saving started by pid 2497
[2497] 25 Jul 16:57:34.876 * DB saved on disk
[2497] 25 Jul 16:57:34.876 * RDB: 6 MB of memory used by copy-on-write
[2419] 25 Jul 16:57:34.941 * Background saving terminated with success
[2419] 25 Jul 16:57:34.941 * Synchronization with slave 192.168.199.128:6379 succeeded
 
#查看redis slave日志
2753] 25 Jul 16:57:34.060 * Connecting to MASTER 192.168.199.127:6379
[2753] 25 Jul 16:57:34.060 * MASTER <-> SLAVE sync started
[2753] 25 Jul 16:57:34.060 * Non blocking connect for SYNC fired the event.
[2753] 25 Jul 16:57:34.061 * Master replied to PING, replication can continue...
[2753] 25 Jul 16:57:34.061 * Partial resynchronization not possible (no cached master)
[2753] 25 Jul 16:57:34.062 * Full resync from master: ae3af225d2897ed084ac97bd722c804b3d93b269:1
[2753] 25 Jul 16:57:34.138 * MASTER <-> SLAVE sync: receiving 18 bytes from master
[2753] 25 Jul 16:57:34.139 * MASTER <-> SLAVE sync: Flushing old data
[2753] 25 Jul 16:57:34.139 * MASTER <-> SLAVE sync: Loading DB in memory
[2753] 25 Jul 16:57:34.139 * MASTER <-> SLAVE sync: Finished with success
 
如果出现以上这样的日志,那么主从已经配置完成,可以登录主设置个key,看从上有没有。

.配置Sentinel

#192.168.199.127配置
vim sentinel.conf
port 26379 
logfile /usr/local/redis/logs/sentinel.log
sentinel monitor server 192.168.199.127 6379 1
sentinel down-after-milliseconds server 3000
sentinel failover-timeout server 900000
sentinel client-reconfig-script server /usr/local/redis/scripts/failover.sh
sentinel config-epoch server 0
 
#192.168.199.128配置
vim sentinel.conf
port 26379 
logfile /usr/local/redis/logs/sentinel.log
sentinel monitor server 192.168.199.127 6379 1
sentinel down-after-milliseconds server 3000
sentinel failover-timeout server 900000
sentinel client-reconfig-script server /usr/local/redis/scripts/failover.sh
sentinel config-epoch server 0
 
#failover.sh  192.168.199.127
#!/bin/bash
MASTER_IP=${6}
MY_IP=192.168.199.127
VIP=192.168.199.162
NETMASK='24'
INTERFACE='eth0'
if [ $MASTER_IP = $MY_IP ];then
    ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
    ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} >/dev/null  2>&1
    exit 0
fi
exit 1
 
#failover.sh  192.168.199.128
#!/bin/bash
MASTER_IP=${6}
MY_IP=192.168.199.128
VIP=192.168.199.162
NETMASK='24'
INTERFACE='eth0'
if [ $MASTER_IP = $MY_IP ];then
    ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
    ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} >/dev/null  2>&1
    exit 0
fi
exit 1
 
#健康检查脚本health_check.sh,放在两台scripts目录下,跟failover.sh同级
#!/bin/sh
dst_ip='192.168.199.127'
gw_ip='192.168.199.1'
while true
do
time=`date +'%F %T'`
ping $dst_ip  -c 2 >/dev/null 2>&1
if [ $? -ne 0 ];then
    ping $gw_ip -c 2 >/dev/null 2>&1
    if [ $? -ne 0 ];then
        /usr/local/redis/bin/redis-cli -p 6379 shutdown
        echo "$time I am failover..." >>/tmp/redis_health_check.log
        exit 0
    else
        num=`ps -fe |grep 26379|grep -v grep|wc -l`
        if [ $num = 1 ];then 
            info=`echo 'SENTINEL failover server'|/usr/local/redis/bin/redis-cli -p 26379`
            if [ "$info" = 'OK' ];then
               echo "$time I will be redis master..." >>/tmp/redis_health_check.log
               exit 0
            else
               sleep 3
               continue
            fi
        fi
    fi 
fi
sleep 3
done
 
#修改failover.sh为700权限
chmod 700 failover.sh

五.启动sentinel服务

#启动redis Sentinel
注意:首先在redis master上手动添加vip
ip addr add 192.168.199.162/24 dev eth0
 
-------------------------------------------------------------------------------------------------------
#健康检查脚本是为了解决主机宕机,如果网络不稳定,就会有新的问题-脑裂,慎用,如果缓存的数据价值不高,可以不用这功能。
192.168.199.127上启动健康检查脚本
sh health_check.sh &
 
192.168.199.128上启动健康检查脚本
sh health_check.sh &
-------------------------------------------------------------------------------------------------------
 
192.168.199.127上启动sentinel
redis-sentinel /usr/local/redis/conf/sentinel.conf &
 
192.168.199.128上启动sentinel
redis-sentinel /usr/local/redis/conf/sentinel.conf &
 
可以查看下日志,观察监控情况。
[28365] 30 Jul 11:14:31.070 # Sentinel runid is e0cfb6869411a71b386e5f59a0b134d96f3d253d
[28365] 30 Jul 11:14:31.071 # +monitor master server 192.168.199.127 6379 quorum 1
[28365] 30 Jul 11:14:32.072 * +slave slave 192.168.199.128:6379 192.168.199.128 6379 @ server 192.168.199.127 6379
[28365] 30 Jul 11:14:35.848 * +sentinel sentinel 192.168.199.128:26379 192.168.199.128 26379 @ server 192.168.199.127 6379

.测试高可用

1.主库不宕机,redis挂掉情况下

#master关闭redis
[root@localhost logs]# ps -fe |grep redis
root     28198     1  0 10:44 ?        00:00:01 /usr/local/redis/bin/redis-server *:6379                          
root     28365  1680  0 11:14 pts/0    00:00:00 redis-sentinel *:26379                            
root     28728  1680  0 11:25 pts/0    00:00:00 grep redis
[root@localhost logs]# kill -9 28198
 
#192.168.199.128观察vip是否漂移
[root@localhost scripts]# ip addr|grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.199.128/24 brd 192.168.199.255 scope global eth0
    inet 192.168.199.162/24 scope global secondary eth0
 
#观察sentinel日志:
[28352] 30 Jul 11:26:03.715 # +new-epoch 1
[28352] 30 Jul 11:26:03.716 # +vote-for-leader e0cfb6869411a71b386e5f59a0b134d96f3d253d 1
[28352] 30 Jul 11:26:03.731 # +sdown master server 192.168.199.127 6379
[28352] 30 Jul 11:26:03.731 # +odown master server 192.168.199.127 6379 #quorum 1/1
[28352] 30 Jul 11:26:03.731 # Next failover delay: I will not start a failover before Thu Jul 30 11:56:04 2015
[28352] 30 Jul 11:26:04.890 # +config-update-from sentinel 192.168.199.127:26379 192.168.199.127 26379 @ server 192.168.199.127 6379
[28352] 30 Jul 11:26:04.890 # +switch-master server 192.168.199.127 6379 192.168.199.128 6379
[28352] 30 Jul 11:26:04.890 * +slave slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
[28352] 30 Jul 11:26:07.908 # +sdown slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
 
注:整个过程会在3秒内切换完成。
 
 
#redis恢复
redis恢复很简单,只要将此redis启动即可,数据会直接同步过来,这个之前的redis master会变成slave,之前的slave提升为master,中间过程不需要人工干预。

2.主库服务器宕机情况下

#由于上次切换,192.168.199.128已经提升为master,直接将192.168.199.128关机
[root@localhost scripts]# halt
 
Broadcast message from root@localhost.localdomain
        (/dev/pts/0) at 11:51 ...
 
The system is going down for halt NOW!
 
#观察sentinel日志:
[28365] 30 Jul 11:52:09.743 # +sdown sentinel 192.168.199.128:26379 192.168.199.128 26379 @ server 192.168.199.128 6379
[28365] 30 Jul 11:52:09.938 # +sdown master server 192.168.199.128 6379
[28365] 30 Jul 11:52:09.938 # +odown master server 192.168.199.128 6379 #quorum 1/1
[28365] 30 Jul 11:52:09.938 # +new-epoch 2
[28365] 30 Jul 11:52:09.939 # +try-failover master server 192.168.199.128 6379
[28365] 30 Jul 11:52:09.940 # +vote-for-leader e0cfb6869411a71b386e5f59a0b134d96f3d253d 2
[28365] 30 Jul 11:52:20.110 # -failover-abort-not-elected master server 192.168.199.128 6379
[28365] 30 Jul 11:52:20.186 # Next failover delay: I will not start a failover before Thu Jul 30 12:22:10 2015
[28365] 30 Jul 11:52:32.404 # Executing user requested FAILOVER of 'server'
[28365] 30 Jul 11:52:32.404 # +new-epoch 3
[28365] 30 Jul 11:52:32.404 # +try-failover master server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.420 # +vote-for-leader e0cfb6869411a71b386e5f59a0b134d96f3d253d 3
[28365] 30 Jul 11:52:32.421 # +elected-leader master server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.421 # +failover-state-select-slave master server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.473 # +selected-slave slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.473 * +failover-state-send-slaveof-noone slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.535 * +failover-state-wait-promotion slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.833 # +promoted-slave slave 192.168.199.127:6379 192.168.199.127 6379 @ server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.833 # +failover-state-reconf-slaves master server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.914 # +failover-end master server 192.168.199.128 6379
[28365] 30 Jul 11:52:32.915 # +switch-master server 192.168.199.128 6379 192.168.199.127 6379
[28365] 30 Jul 11:52:32.915 * +slave slave 192.168.199.128:6379 192.168.199.128 6379 @ server 192.168.199.127 6379
[28365] 30 Jul 11:52:35.972 # +sdown slave 192.168.199.128:6379 192.168.199.128 6379 @ server 192.168.199.127 6379
 
#192.168.199.127观察vip是否漂移
[root@localhost logs]# ip addr|grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.199.127/24 brd 192.168.199.255 scope global eth0
inet 192.168.199.162/24 scope global secondary eth0
 
注:整个过程会在30秒内切换完成。
 
 
#宕机机器恢复后操作
①开启redis服务
②修改sentinel.conf 配置,要与活着的sentinel配置相同,只要将# Generated by CONFIG REWRITE上面的配置覆盖过来即可。然后启动sentinel服务。
③启动health_check.sh脚本
④另外一台机器也需要启动health_check.sh脚本


Comments are closed.