此文是翻译了网上的博客http://abcve.com/redis-keepalived/
一:环境介绍
Master: 192.168.0.29
Slave: 192.168.0.28
Virtural IP Address (VIP): 192.168.0.30
二:设计思路:
当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;
当 Master 挂掉,Slave 正常时, Slave接管服务,有写权限,同时关闭主从复制功能;
当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,同时Slave等待Master同步数据完成之后,恢复Slave身份。
三:安装配置前准备工作
在主服务器 192.168.0.29 上面做下面操作
echo 172.16.206.29 osb29 >> /etc/hosts
echo 172.16.206.28 osb28 >> /etc/hosts
在从服务器 192.168.0.28上面做下面操作
echo 192.168.0.29 osb29 >> /etc/hosts
echo 192.168.0.28 osb28 >> /etc/hosts
四:主服务器配置redis
1.下载Redis 版本2.8.19
wget http://download.redis.io/releases/redis-2.8.19.tar.gz
2.解压 tar -zxvf redis-2.8.19.tar.gz
3.cd redis-2.8.19
4.make && make install
5.cp redis.conf /etc/redis.conf
cd src/
cp redis-server redis-cli redis-benchmark redis-check-aofredis-check-dump /usr/local/bin
6.修改 /etc/redis.conf里面可以把daemonize no 修改为daemonize yes
目的是可以在后台执行redis-server。
7.init.d 启动脚本
vi /etc/init.d/redis-server
chmod o+x /etc/init.d/redis-server
chkconfig –add redis-server
service redis-server start
五:从服务器配置redis
从服务器,配置一样,只不过 修改/etc/redis.conf 中
slaveof <masterip> <masterport>修改为
slaveof 192.168.0.29 6379 #master 的ip
然后开启从服务器的redis服务。
service redis-server start
六:进行redis主从测试
#主服务器
redis-cli -p 6379 set hello world
#从服务器
redis-cli -p 6379 get hello
“world”
#主服务器
redis-cli -p 6379 set hello2 world2
#从服务器
redis-cli -p 6379 get hello2
“world2”
redis-cli -p 6379 set hello world
(error) READONLY You can’t write against a read only slave.
成功配置主从redis服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。
七:安装和配置keepalived
1. wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz
tar -zxvf keepalived-1.2.15.tar.gz
cd keepalived-1.2.15
2. 安装openssl-devel和kernel-devel
yum install openssl-devel
yum install kernel-devel
ln -s /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/Linux
3. 配置编译安装
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/linux --enable-sha1
make && make install
4. 复制keepalived相关文件
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/samples/keepalived.conf.virtualhost
/etc/keepalived/keepalived.conf
八:修改配置文件和相关脚本
1. 在Master上创建配置文件
vi /etc/keepalived/keepalived.conf
2.在Slave上创建如下配置文件
vim /etc/keepalived/keepalived.conf
3.在Master和Slave上创建监控Redis的脚本
$ mkdir /etc/keepalived/scripts
$ vim /etc/keepalived/scripts/redis_check.sh
4.编写关键脚本
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_backup.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
因为Keepalived在转换状态时会依照状态来执行脚本:
当进入Master状态时会呼叫notify_master
当进入Backup状态时会呼叫notify_backup
当发现异常情况时进入Fault状态呼叫notify_fault
当程序终止时则呼叫notify_stop
首先,在Redis Master上创建notity_master与notify_backup脚本:
vi /etc/keepalived/scripts/redis_master.sh
vi /etc/keepalived/scripts/redis_backup.sh
在Redis Slave上创建notity_master与notify_backup脚本:
vi /etc/keepalived/scripts/redis_master.sh
vi /etc/keepalived/scripts/redis_backup.sh
然后在Master与Slave创建如下相同的脚本:
vi /etc/keepalived/scripts/redis_fault.sh
日志文件会自动创建
vi /etc/keepalived/scripts/redis_stop.sh
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
在主从服务器上面给脚本都加上可执行权限:
chmod +x /etc/keepalived/scripts/*.sh
九:相关功能测试
启动Master和slave上的Redis
service redis-server start
启动Master和slave上的Keepalived
/etc/init.d/keepalived start
尝试通过VIP连接Redis:
$ redis-cli -h 192.168.0.30 INFO
连接成功,可以看到主从机的信息,例如:
role:master
slave0:192.168.0.28,6379,online
尝试插入一些数据:
$ redis-cli -h 192.168.0.30 SET hello3 world3
OK
从VIP读取数据
$ redis-cli -h 192.168.0.30 GET hello3
“world3”
从Master读取数据
$ redis-cli -h 192.168.0.29 GET hello3
“world3”
从Slave读取数据
$ redis-cli -h 192.168.0.28 GET hello3
“world3”
将Master上的Redis进程杀死:
$ service redis-server stop
查看Master上的Keepalived日志
$ tail -f /var/log/keepalived-redis-state.log
[fault]
Mon Jan 5 14:06:22 CST 2017
同时Slave上的日志显示:
$ tail -f /var/log/keepalived-redis-state.log
[master]
Mon Jan 5 14:13:52 CST 2017
Being master….
Run SLAVEOF cmd …
OK Already connected to specified master
Run SLAVEOF NO ONE cmd …
OK
现在,Slave已经接管服务,并且拥有Master的角色
$ redis-cli -h 192.168.0.28 INFO
role:master
在插入一些数据
$ redis-cli -h 192.168.0.30 SEThello4 world4
OK
从VIP读取数据
$ redis-cli -h 192.168.0.30 GEThello4
“world4”
从slave读取数据
$ redis-cli -h 192.168.0.28 GET hello4
“world4”
此时master 是连接不上的 get不到hello4
然后恢复Master的Redis进程
$ service redis-server start
查看Master上的Keepalived日志
$ tail -f /var/log/keepalived-redis-state.log
[master]
2017年 04月 06日 星期四 15:28:08 CST
Being master….
Run SLAVEOF cmd …
OK
Run SLAVEOF NO ONE cmd …
OK
同时Slave上的日志显示:
$ tail -f /var/log/keepalived-redis-state.log
[backup]
Thu Apr 6 15:38:03 CST 2017
Being slave….
Run SLAVEOF cmd …
OK
Master已经再次恢复了Master角色
$ redis-cli -h 192.168.0.29 GET hello4
“world4”