第1章 环境说明:

1.1系统版本:

cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

1.2redis主从:

       10.3.7.22:7001-主
       10.3.7.25:7001-从
       10.3.7.28:7001-从


1.3哨兵:

       10.3.7.22:6800
       10.3.7.25:6800
       10.3.7.28:6800

1.4VIP

 10.3.11.11

第2章 搭建redis主从模式

yum安装redis后修改下配置文件即可,这里redis主从的搭建就不粘贴了

第3章 配置redis-sentinel模式

三个节点的配置,只要保证sentinel myid不同即可,按照这个配置文件应该是可以的,哨兵的配置文件比较坑,网上看了好多资料,结果启动都是报错,我贴的这个可以试试,应该不会,如果报错logsfile不存在的话记得touch一下

cat /etc/redis-sentinel.conf
port 6800
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 82aab24bc703376697a7893302d6096e60766483
sentinel monitor mymaster 10.3.7.22 7001 2
sentinel down-after-milliseconds mymaster 5000
 
sentinel failover-timeout mymaster 15000
sentinel client-reconfig-script mymaster /opt/notify_master6800.sh
sentinel auth-pass mymaster kkQZ4_JkjcZN

第4章 配置vip自动漂移的执行脚本:

4.1下面的LOCAL_IP改成每个节点自己的ip

cat /opt/notify_master6800.sh
#!/bin/bash
 
MASTER_IP=$6
LOCAL_IP='10.3.7.22'
NETMASK='24'
INTERFACE='eth0'
VIP='10.3.11.11'
 
if [ ${MASTER_IP} = ${LOCAL_IP} ];then
    ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    arping -c 1 -I ${INTERFACE} -U ${VIP}
    exit 0
else
    ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
    exit 0
fi
exit 1

4.2遇到问题

脚本配置好以后应该检查下是否可以正常执行,因为我在第一次模拟故障的时候发现vip没有飘逸,手动执行脚本后发现以下报错:

-bash: $'\302\240ip': command not found

由于之前的脚本是我在网上复制下来的,怀疑字符集有问题,于是删除脚本,干脆手敲了一遍,再次模拟故障,vip切换成功

4.3脚本参数说明:

client-reconfig-script:这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递6个参数<master-name><role><state><from-ip><from-port><to-ip> <to-port>,其中<to-ip>是新主redisIP地址,可以在这个脚本里做VIP漂移操作,脚本编写好以后,可以自己加上以上六个参数执行脚本,检查是否有问题

第5章 查看所有节点哨兵状态

每个节点均看到以下输出即可

# redis-cli -h 10.3.7.22 -p 6800  info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:8
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.3.7.22:7001,slaves=2,sentinels=3

第6章 绑定vipredis主服务器

6.1我的vip是腾讯上买的,因为服务器是腾讯云的服务器

手动将vip绑定到主服务器上,因为是第一次绑定,后面故障的话回自动进行切换

ip addr add 10.3.11.11/24 dev eth0

arp抑制

/usr/sbin/arping -c 1 -I eth0 -U 10.3.11.11

配置好vip以后,需要查看redis服务绑定的端口是否为0.0.0.0,即redis配置文件中bind是否为全部绑定

第7章 通过vip连接进行测试

查看redis集群状态

redis-cli -h 10.3.11.11 -p 7001 -a kkQZ4_JkjcZN info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.3.7.25,port=7001,state=online,offset=84533,lag=0
slave1:ip=10.3.7.28,port=7001,state=online,offset=84533,lag=0
master_repl_offset:84533
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84532

查看sentinel状态

redis-cli -h 10.3.11.11 -p 6800  info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.3.7.22:7001,slaves=2,sentinels=3

第8章 故障测试:

8.1kill掉主机点的redis模拟故障

[root@test-ops-redis-mha-1 opt]# ps -ef |grep redis
redis    9758     1  0 17:21 ?        00:00:00 /bin/redis-server 0.0.0.0:7001
root     9925 24205  0 17:23 pts/0    00:00:00 grep --color=auto redis
root    28539     1  0 14:47 ?        00:00:11 redis-sentinel 0.0.0.0:6800 [sentinel]
[root@test-ops-redis-mha-1 opt]# kill -9 9758

8.2vip已经漂移过去了

[root@test-ops-redis-mha-2 opt]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
   link/ether 52:54:00:bb:87:ec brd ff:ff:ff:ff:ff:ff
    inet 10.3.7.25/24 brd 10.3.7.255 scope global eth0
      valid_lft forever preferred_lft forever
    inet 10.3.11.11/24 scope global eth0
      valid_lft forever preferred_lft forever

8.3连接vip测试

[root@test-ops-redis-mha-1 opt]# redis-cli -h 10.3.11.11 -p 7001 -a kkQZ4_JkjcZN info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.3.7.28,port=7001,state=online,offset=5628,lag=0
master_repl_offset:5764
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5763