Keepalived+Redis主从高可用部署

机器

A:192.168.252.105
B:192.168.252.106
VIP:192.168.252.101

A|B安装 keepalived-1.3.5.tar.gz

tar -zxvf keepalived-1.3.5.tar.gz
cd keepalived-1.3.5
./configure --prefix=/usr/local/keepalived && make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/
chmod 755 /etc/init.d/keepalived

## A|B keepalived开机启动

vim /usr/lib/systemd/system/keepalived.service

[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target

[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

A|B安装 redis-3.0.6.tar.gz

mkdir -p /app/tools/redis
mkdir -p /app/tools/keepalived/log
cd /app/tools/redis
mkdir bin conf data log run scripts
tar -zxvf redis-3.0.6
cd redis-3.0.6
make PREFIX=/app/tools/redis install #安装到指定目录中
cp ./redis.conf  /app/tools/redis/conf/

A-keepalived配置

vim /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_MASTER
}

vrrp_script monitor_redis {
  script "/app/tools/redis/scripts/redis_monitor.sh" #检查redis服务状态脚本;
  interval 3
}

vrrp_instance VI_1 {
  state MASTER
  interface ens33
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }

  track_script {
    monitor_redis      #检查redis服务状态脚本;
  }

  virtual_ipaddress {
    192.168.252.101/24    #virtual server
  }

  notify_backup /app/tools/redis/scripts/redis_backup.sh   #keepalived变为从节点(丢失VIP)后执行的脚本
  notify_master /app/tools/redis/scripts/redis_master.sh   #keepalived变为主节点(获得VIP)后执行的脚本
}

B-keepalived配置

vim /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_BACKUP
}

vrrp_script monitor_redis {
  script "/app/tools/redis/scripts/redis_monitor.sh" #检查redis服务状态脚本;
  interval 3
}

vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 51
  priority 99
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }

  track_script {
    monitor_redis      #检查redis服务状态脚本;
  }

  virtual_ipaddress {
    192.168.252.101/24    #virtual server
  }

  notify_backup /app/tools/redis/scripts/redis_backup.sh #keepalived变为从节点(丢失VIP)后执行的脚本
  notify_master /app/tools/redis/scripts/redis_master.sh #keepalived变为主节点(获得VIP)后执行的脚本
}

A|B-redis 主节点配置 redis.conf

修改 /app/tools/redis/conf/redis.conf 

daemonize yes     –进程后台启动
logfile /app/tools/redis/log/redis.log     –日志文件
syslog-enabled no    –日志不写进系统日志
dir /app/tools/redis//data  –数据文件存放
requirepass system  –认证密码
slave-serve-stale-data no   –同步未完成从机不能接收除slaveof和info之外的命令,相当重要

A|B-redis 从节点配置 redis_slave.conf

修改 /app/tools/redis/conf/redis.conf 

daemonize yes
logfile /app/tools/redis/log/redis.log 
syslog-enabled no
dir /app/tools/redis//data
slaveof 192.168.252.105 6379 –主服务器的IP(两台机器不同192.168.252.105\192.168.252.106)地址和端口
masterauth system   –主服务器上的认证密码
slave-serve-stale-data no  –同步未完成从机不能接收除slaveof和info之外的命令,相当重要

A-redis 启动脚本 redis_start.sh

vim /app/tools/redis/scripts/redis_start.sh

#!/bin/bash
CONFIGPATH=/app/tools/redis/conf/redis_slave.conf
REDISPATH=/app/tools/redis/bin
REDISPASS=redis
result=123
RESULT=0
VIP=192.168.252.101
SLAVEIP=192.168.252.106
LOCALHOST=192.168.252.105
killall -9 redis-server
echo "start redis-server with $CONFIGPATH"
nohup $REDISPATH/redis-server $CONFIGPATH  2>nohup.out
until [ "$result" = "$RESULT" ]
do
RESULT=`$REDISPATH/redis-cli -a $REDISPASS -h $LOCALHOST<<EOF
debug digest
EOF`
result=`$REDISPATH/redis-cli -a $REDISPASS -h $SLAVEIP<<EOF
debug digest
EOF`
done
echo "debug digest: $RESULT, sync success"
systemctl stop keepalived
sleep 5
echo "start keepalived"
systemctl start keepalived
sleep 10
echo "VIP get?"
ip a|sed -n '/inet addr/p'|grep $VIP
if [ "$?" == "0" ];then
	echo $(ip a)
fi
echo "set slaveof master"
$REDISPATH/redis-cli -a $REDISPASS -h $LOCALHOST<<EOF
slaveof no one
EOF
exit 0

A|B 监控脚本 redis_monitor.sh

vim /app/tools/redis/scripts/redis_monitor.sh

#/bin/bash
LOGFILE=/app/tools/keepalived/log/alive_state.log
LOCALHOST=192.168.252.105 #注意ip不同 192.168.252.105、192.168.252.106
ALIVE=$(/app/tools/redis/bin/redis-cli -a redis -h $LOCALHOST PING)
echo "ALIVE=$ALIVE" >>$LOGFILE
if [ "$ALIVE" = "PONG" ]; then
	echo $ALIVE
	exit 0
else
	echo "killall -9 keepalived">>$LOGFILE
	echo $ALIVE
	systemctl stop keepalived
	exit 1
fi

A|B 切换为主节点脚本 redis_master.sh

vim /app/tools/redis/scripts/redis_master.sh

#!/bin/bash
REDISPATH=/app/tools/redis/bin
REDISPASS=redis
LOGFILE="/app/tools/keepalived/log/alive_state.log"
LOCALHOST=192.168.252.105 #注意不同机器192.168.252.105、192.168.252.106
date >> $LOGFILE
echo "set master " >> $LOGFILE
echo "run slaveof no one cmd ..."
$REDISPATH/redis-cli -a $REDISPASS -h $LOCALHOST slaveof no one

A|B 切换为从节点脚本 redis_backup.sh

vim /app/tools/redis/scripts/redis_backup.sh

#!/bin/bash
REDISPATH=/app/tools/redis/bin
REDISPASS=redis
REDISMASTER="192.168.252.106 6379"   #redis主节点地址,A,B两服务器不同,注意区别
LOGFILE="/app/tools/keepalived/log/alive_state.log"
LOCALHOST=192.168.252.105 #注意IP不同192.168.252.105\192.168.252.106
date >> $LOGFILE
echo "set back up " >> $LOGFILE
echo "MASTER:$REDISMASTER">>$LOGFILE
echo "run slaveof cmd ..."
$REDISPATH/redis-cli -a $REDISPASS -h $LOCALHOST slaveof $REDISMASTER

测试

1. A机器启动redis和keepalived
	redis-server redis.conf
	systemctl start keepalived
2. B机器启动redis和keepalived
	redis-server redis_slave.conf
	systemctl start keepalived
3.  测试客户机与A\B连接
	redis-cli –h 192.168.252.105 
	redis:6379> auth redis
做增、删、改操作,看A-redis和B-redis是否数据同步
4. 测试A-redis(主节点)挂掉后客户机业务
	关掉redis主机,查看A-keepalived是否自动停止
	ps –ef|grep keep
	B机器是否获得VIP
	ip a s
	B-redis是否变为主机状态: info replication
	做增、删、改操作,看B-redis是否数据同步。
5. 测试A-redis重启后客户机业务
	用命令脚本启动A-redis主机  redis_start.sh
	查看A-redis是否将B-redis数据同步完全,分别在A,B redis运行
	keys * 看数量是否相等
	查看A机器是否或得VIP
	ip a s
	查看A-redis是否变为主节点(keepalived获得VIP会执行命令,将A-redis变为主节点),登陆A-redis,运行命令: info replication
	查看B-redis是否变为从节点(keepalived丢失VIP会执行命令,将B-redis变为从节点),登陆B-redis,运行命令: info replication
	客户机连接redis客户端,测试业务是否正常redis-cli –h 192.168.252.105 

猜你喜欢

转载自blog.csdn.net/weixin_38704176/article/details/84791739