前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis - Keepalived + redis 主备热备切换

Redis - Keepalived + redis 主备热备切换

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

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

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

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

clip_image002
clip_image002

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:

clip_image004
clip_image004

Slave:

clip_image006
clip_image006

测试主从环境: Master:

clip_image008
clip_image008

Slave:

clip_image010
clip_image010

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

clip_image012
clip_image012

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是否绑定成功

clip_image016
clip_image016

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

clip_image018
clip_image018

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

clip_image020
clip_image020

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

clip_image022
clip_image022

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

clip_image024
clip_image024
clip_image026
clip_image026

7. 查看数据是否丢失

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档