首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis - Keepalived + redis 主备热备切换

Redis - Keepalived + redis 主备热备切换

作者头像
Aichen
发布2018-05-18 11:23:52
发布2018-05-18 11:23:52
4.6K0
举报
文章被收录于专栏:白驹过隙白驹过隙

1. 热备方案 硬件:server两台,分别用于master-redis及slave-redis 软件:redis、keepalived 实现目标:

  • 由keepalived对外提供虚拟IP(VIP)进行redis访问
  • 主从redis正常工作,主负责处理业务,从进行数据备份
  • 当主出现故障时,从切换为主,接替主的业务进行工作
  • 当主恢复后,拷贝从的数据,恢复主身份,从恢复从身份

数据采用aof方式进行持久化存储,秒级备份,当出现故障后,损失数据不超过1s

Keepalived提供以下服务:

  • 对用户提供VIP访问,屏蔽redis实际IP,当主机出现故障,仍可用VIP访问到从。
  • 对redis状态进行监控,将监控频率设置在1s。当主出现故障后能及时处理,切换从机提供业务。

2. 环境准备 利用虚拟机进行测试,安装ubuntu,安装完成后克隆ubuntu,利用两个虚拟机来构造服务器环境。 在两台虚拟机分别执行sudo apt-get redis-server和sudo apt-get keepalived安装redis和keepalived软件。 配置两个虚拟机的redis主从关系: 1. 保证两个虚拟机ip不一致且能互相ping通 2. 打开slave下/etc/redis/redis.conf文件 3. 找到slaveof配置项配置指定的master ip port,有密码则还需配置masterauth 4. Save “”取消注释,关闭RDB方式,配置appendonly项,配置为yes,持久化采用AOF方式 5. 主从执行service redis restart重启下redis服务。 6. redis-cli info查看主从redis信息。 Maste:

Slave:

测试主从环境: Master:

Slave:

查看默认db目录/var/lib/redis/  

3. keepalived配置 keepalived配置包含两部分,一部分是keepalived配置文件,另一部分是脚本。 主从/etc/keepalived/目录下新建keepalived.conf文件。 Keepalived配置文件 Master:

代码语言:javascript
复制
vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.py" ###监控脚本

interval 1 ###监控时间设置为1s

}

vrrp_instance VI_1 {

state MASTER ###设置为MASTER

interface ens33 ###监控网卡

virtual_router_id 51

priority 101 ###权重值

authentication {

auth_type PASS ###加密

auth_pass redis ###密码

}

track_script {

chk_redis ###调用上面定义的chk_redis

}

virtual_ipaddress {

192.168.133.188 ###对外的虚拟IP

}

notify_master /etc/keepalived/scripts/redis_master.py

notify_backup /etc/keepalived/scripts/redis_backup.py

notify_fault /etc/keepalived/scripts/redis_fault.py

notify_stop /etc/keepalived/scripts/redis_stop.py

}

Slave: 与master基本一致,修改以下两项即可

代码语言:javascript
复制
state MASTER ###设置为MASTER

state BACKUP ###设置为BACKUP

priority 101 ###权重值

priority 100 ###slave权重值比master小

监控脚本包含5个,主要关注redis_check.py 、redis_master.py和redis_backup.py。

  • redis_check.py用于监控redis运行状态,反馈redis是否运行正常信息。
  • redis_master.py将当前redis切换为master
  • redis_backup.py将当前redis切换为slave

keepalived根据配置的监控时间,执行redis_check.py查看redis运行状态,出现异常则主从依次调用脚本完成主从倒换。将这些脚本放在/etc/keepalived/scripts/目录下,并且给所有脚本加上执行权限chmod +x * redis_check.py主从内容一致:

代码语言:javascript
复制
#!/usr/bin/python

import os

import sys

import time

PING = 'redis-cli ping' #redis ping command, observe network state

os.chdir("/etc/redis/") #set log file path

fp = open("redis_dump.log",'a') #open log file with append mode

result = os.system(PING) #exec command

if 0 == result: #network state ok

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

fp.write("[check]" + logtime + ":" + 'redis running!\n')

sys.exit(0)

else:

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

fp.write("[check]" + logtime + ":" + 'redis stop service!\n')

sys.exit(1)

fp.close()

网络状态良好时表示redis运行正常,日志记录可以注释,防止日志打印过多。在redis配置鉴权需修改所有的命令执行脚本内容,带上鉴权信息。 当网络不通,即redis服务挂掉后,可以增加os.system(“service redis start”)或者os.system(“service redis restart”)尝试重启redis服务。 redis_master.py主机配置:

代码语言:javascript
复制
#!/usr/bin/python

import os

import time

SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave

SLAVENO = 'redis-cli slaveof no one' #being master

os.chdir("/etc/redis/") #set log file path

fp = open("redis_dump.log",'a') #open log file with append mode

result = os.system(SLAVEOF) #exec command

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #get time info

if 0 == result: #backup data from slave

fp.write("[master]" + logtime + ":" + 'start copy data from slave!\n')

else:

fp.write("[master]" + logtime + ":" + 'copy data from slave falue!\n')

time.sleep(10) #set backup time

result = os.system(SLAVENO) #being master

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

if 0 == result:

fp.write("[master]" + logtime + ":" + 'stop copy data, being master!\n')

else:

fp.write("[master]" + logtime + ":" + 'being master falue!\n')

fp.close()

从机redis_master.py内容与主机基本一致,修改备份数据对端地址为master ip即可。

代码语言:javascript
复制
SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave

SLAVEOF = 'redis-cli slaveof 192.168.133.130 6379' #backup data form master

执行这个脚本,redis状态将从主机变为从机,先从指定的ip对端进行数据备份,备份完成后切换自身状态为主机。 redis_backup.py主机配置

代码语言:javascript
复制
#!/usr/bin/python

import os

import time

time.sleep(15) #set data backup time

SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379'

os.chdir("/etc/redis/") #set log file path

fp = open("redis_dump.log",'a') #open log file with append mode

result = os.system(SLAVEOF) #exec command

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

if 0 == result:

fp.write("[backup]" + logtime + ":" + 'being slave!\n')

else:

fp.write("[backup]" + logtime + ":" + 'being slave falue!\n')

fp.close()

从机redis_master.py内容与主机基本一致,修改备份数据对端地址为master ip即可。

代码语言:javascript
复制
1 SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave
2 
3 SLAVEOF = 'redis-cli slaveof 192.168.133.130 6379' #backup data form master

执行这个脚本,redis将从主机状态变为从机,先从指定的对端ip进行数据备份,备份完成后切换状态为该对端从机。 上述用到的所有keepalived配置文件及脚本: https://github.com/binchen-china/keepalived-redis

4. 热备测试 1. 主从启动所有服务 Service redis start Service keepalived start 2. 在master执行ip a查看虚拟IP是否绑定成功

3. 查看日志,keepalived运行是否正常

4. 停止master的redis服务 Service redis stop,查看从机ip a,虚拟IP已经在1秒内切换到从机绑定了。

5. 查看从机信息 从机已经切换为主机

6. 重启主机redis服务 虚拟IP重新与主机绑定,主从恢复状态

7. 查看数据是否丢失

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-06-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档