Redis - Keepalived + redis 主备热备切换

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:

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基本一致,修改以下两项即可

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主从内容一致:

#!/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主机配置:

#!/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即可。

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主机配置

#!/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即可。

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. 查看数据是否丢失

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏挖坑填坑

.net core + angular 项目中使用ueditor遇到的问题

这是两个问题, 1、angular中使用ueditor 2、.net core 中使用ueditor

1412
来自专栏calvin

net core 程序docker打包镜像并发布到官方store

学习一个技术的第一步,总是要先打印或显示一个hello world的。当然,学习docker也不例外。上一篇文章已经简单的介绍了环境的安装和配置。接下来就要打印...

2892
来自专栏bluesummer

利用Zookeeper实现分布式锁及服务注册中心

对于Zookeeper的定义以及原理,网上已经有很多的优秀文章对其进行了详细的介绍,所以本文不再进行这方面的阐述。 本文主要介绍一些基本的准备工作以及zooke...

3825
来自专栏技术博文

curl参数

目录 1. 介绍 2. curl扩展的安装 3. curl_init 4. curl_setopt 5. cur...

3845
来自专栏信安之路

简单粗暴的文件上传漏洞

文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的...

1.1K0
来自专栏Road

Redis 设计 --- 持久化存储策略 以及 过期键删除策略

本篇主要介绍 Redis 中 过期键删除策略 以及 如何“友好”支持数据持久化存储

1662
来自专栏分布式系统进阶

Kafka重置消费的OffsetKafka源码分析-汇总

5242
来自专栏GreenLeaves

WCF系列教程之初识WCF

本随笔参考自WCF编程系列(一)初识WCF,纯属读书笔记,加深记忆。 1、简介:Windows Communication Foundation(WCF)是微软...

2368
来自专栏何俊林

一个强大的网络库RxEasyHttp

本文来自周游的投稿,封装的网络请求库,github:https://github.com/zhou-you/RxEasyHttp,欢迎点击【阅读原文】,查看更多...

4048
来自专栏菩提树下的杨过

温故而知新:Asp.Net中如何正确使用Session

Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多;看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙...

20910

扫码关注云+社区

领取腾讯云代金券