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即可。

 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进行数据备份,备份完成后切换状态为该对端从机。

上述用到的所有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. 查看数据是否丢失

最新文章

  1. iframe关于滚动条的去除和保留
  2. java代码实现队列的优化
  3. Ubuntu14.04_64位使用过程
  4. Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
  5. Swift3.0语言教程获取字符
  6. Hadoop之hive的drop table恢复
  7. 项目管理和缺陷跟踪工具Redmine
  8. js 重载i
  9. Git操作指南(2) —— Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并(转)
  10. THREE.js代码备份——canvas_lines(随机点、画线)
  11. 安装Hadoop系列 — 新建MapReduce项目
  12. MSSql2008打开企业管理器出错,具体显示提示无法识别的配置节 system.serviceModel。
  13. Category类别
  14. 中间自适应,左右定宽的两种经典布局 ---- 圣杯布局 VS 双飞翼布局
  15. [USACO08JAN]跑步Running
  16. 初识C语言(六)
  17. 搜狐畅游一面(c++)
  18. DB2 公共表表达式(WITH语句的使用)
  19. Ubuntu下提示U盘没有权限--只能读不能写
  20. img 标签

热门文章

  1. 51nod 1043 幸运号码(数位dp)
  2. SQL Server数据库(SQL Sever语言 CRUD)
  3. matlab(数组、矩阵)
  4. 转载css层级优先级。
  5. centos 5.8 64位系统安装 mysql5.6
  6. 通过计算机名访问linux
  7. JS引用类型之——数组
  8. java之trycatchfinally代码块与return,throw的执行顺序的探索
  9. [Js]面向对象的拖拽
  10. bzoj 1934: [Shoi2007]Vote 善意的投票