一,单实例模式linux
当系统中只有一台redis运行时,一旦该redis挂了,会致使整个系统没法运行。c++
二,主从模式redis
因为单台redis出现单点故障,就会致使整个系统不可用,因此想到的办法天然就是备份。当一台redis出现问题了,另外一台redis能够继续提供服务。vim
三,自动故障转移机制安全
四,redis的主从复制部署bash
4.1 环境描述服务器
这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。并发
redis-server测试 |
说明spa |
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}
修改一下配置文件内容:
redis-slave配置文件修改:
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.conf的最后追加如下四句话
(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能够持续高可用,能够继续测试。