Redis 高可用--主从复制

 

第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{ 

      [email protected] 

      } 

      [email protected] 

      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{ 

      [email protected] 

      } 

      [email protected] 

      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进程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章