第1章 Redis-HA简介
设计原理:
当Master与Slave均运作正常时, Master负责服务,Slave负责Standby;
当Master挂掉,Slave正常时, Slave接管服务,同时关闭主从复制功能;
当Master恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。
然后依次循环。
需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失
第2章 搭建Redis-HA
Redis-HA环境拓扑如下:
Redis-VIP:192.168.xxx.200
Redis-master:192.168.xxx.11
Redis-slave:192.168.xxx.12
2.1 Redis master-slave配置
redis支持master-slave的主从配置,配置方法是在从机的配置文件中指定slaveof参数为主机的ip和port既可以。
从机修改内容
slaveof 192.168.3.67 6379 (是主机的ip地址)
masterauth 888888 如何有密码新增
修改如下内容(主从都要修改):
daemonize no 改为 yes # 是否后台运行
分别启动两个Redis服务
sh startredis.sh
启动之后使用命令查看redis的启动情况
ps -ef|grep redis
测试主从复制:
分别登录Redis-master和slave进行读写,查看数据同步情况
2.2 keepalived安装配置
2.2.1 keepalived安装
在两台机器安装:
方法一:yum安装<本地源>:yum install -y keepalived
方法二:编译安装
#tar zxvf keepalived-1.1.20.tar.gz
#cd keepalived-1.1.20
#./configure --prefix=/usr/local/keepalived--with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686
#make && make install
此处使用的yum安装
2.2.2配置虚拟vip
在两台机器配置,外网访问mysql的vip
ifconfig lo:1 192.168.xxx.200 netmask255.255.255.255 broadcast 192.168.223.100
查看
2.2.3 keepalived配置
在192.168.xxx.11机器,新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件
#mkdir /etc/keepalived
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email{
}
smtp_server127.0.0.1
smtp_connect_timeout30
router_id Redis-ha
}
vrrp_script chk_redis {
script"/etc/keepalived/scripts/redis_check.sh"
weight -20
interval 2
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP
interface eth0
virtual_router_id51
priority 100 #优先级,另一台改为90
advert_int 1
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
track_script {
chk_redis
}
virtual_ipaddress {
192.168.xxx.200
}
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
}
编写检测服务down后所要执行的脚本
#vi/usr/local/mysql/mysql.sh
#!/bin/sh
pkill keepalived
#chmod +x/usr/local/mysql/mysql.sh
注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkillkeepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP
192.168.xxx.12上keepalived配置
这台配置和上面基本一样,但有三个地方不同:优先级为90、无抢占设置、real_server为本机IP
#mkdir /etc/keepalived
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email{
}
smtp_server127.0.0.1
smtp_connect_timeout30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP
interface eth0
virtual_router_id51
priority 90 #优先级,另一台改为90
advert_int 1
track_script {
chk_redis
}
virtual_ipaddress {
192.168.xxx.200
}
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
}
配置中所涉及的shell脚本参照2.2.5
2.2.4启动keepalived
由于设置了nopreempt,那么在启动keepalived的时候就有启动的顺序问题了,我们把redis的master和keepalived的master(虽然配置文件中都是backup,但是我们是想让11这台做master的)默认设置在同一台机器上,由于在keepalived的master上面设置了nopreempt参数,所以在启动keepalived服务的时候,一定要先启动redis master的那台,因为在设置了nopreempt了,keepalived在启动后都是先进入backup状态,而脚本又设置了进入backup状态后,会连接新的对方进行数据同步,所以,在启动keepalived之前还有一个条件就是redis的master和slave中的数据必须一致。这样先启动redis的master那台的keepalived,虽然redis master会连接到redis slave同步数据,但是两边数据在刚开始的时候是一致的,并不会产生什么问题。
1 先启动master和slave上的redis服务,配置slave从master上面同步数据,同步完毕后,取消slave的同步机制。
这个就是在slave的redis上面执行slaveof192.168.xxx.11 6379,等待数据同步完毕后再执行slaveos on one,让master和slave的redis都保持master状态
2 接着启动master的keepalived,不要启动slave的keepalived,在master和slave上面各开启三个终端,观察自定义日志和系统日志状态
#service keepalived start
待master的各项进程都ok后,我们开始启动slave上面的keepalived服务
2.2.5 配置所需脚本
Master节点
新建/etc/keepalived/scripts/和/etc/keepalived/log/目录
以下脚本在放/etc/keepalived/scripts/目录,并赋予执行的权限
redis服务状态检测脚本redis_check.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_check.sh
ALIVE=`/usr/bin/redis-cli PING`
if [ "$ALIVE" == "PONG"]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
keepalived进入master状态时的检测脚本redis_master.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_master.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]" >> $LOGFILE
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 192.168.223.xxx.126379" >> $LOGFILE
$REDISCLI SLAVEOF 192.168.223.xxx.126379 >> $LOGFILE 2>&1
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from oldmaster" >> $LOGFILE
sleep 10
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok...">> $LOGFILE
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,closemaster/slave" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE2>&1
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect....">> $LOGFILE
keepalived进入backup/stop/fault时的检测脚本,由于内容都一致,所以只写出redis_backup.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_backup.sh
REDISCLI="redis-cli"
LOGFILE="/etc/keepalived/log/redis-state.log"
pid=$$
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >>$LOGFILE 2>&1
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from oldmaster" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]data rsync from old mater ok..." >> $LOGFILE
echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 192.168.223.xxx.126379'" >> $LOGFILE
$REDISCLI SLAVEOF 10.20.112.27 6379>> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]slave connect to 192.168.223.xxx.12 ok...">> $LOGFILE
slave节点
将配置文件中的ip地址改为master节点ip即可
2.3 Redis-HA测试
1. kill掉26的redis进程,保持keepalived进程。
2. kill掉26的keepalived进程,保持redis进程。