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

Redis - Keepalived + redis 主备热备切换的更多相关文章

  1. nginx+keepalived简单双机主从热备

    双机主从热备概述 可以两台机子互为热备,平时各自负责各自的服务.在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续 ...

  2. Nginx+keepalived 高可用双机热备(主从模式/双主模式)

    基础介绍负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行. 关于负载均衡介绍,可以参考:li ...

  3. keepalived+LVS 实现双机热备、负载均衡、失效转移 高性能 高可用 高伸缩性 服务器集群

    本章笔者亲自动手,使用LVS技术实现实现一个可以支持庞大访问量.高可用性.高伸缩性的服务器集群 在读本章之前,可能有不少读者尚未使用该技术,或者部分读者使用Nginx实现应用层的负载均衡.这里大家都可 ...

  4. haproxy/nginx+keepalived负载均衡 双机热备 邮件报警 实战及常见问题

    Haproxy 做http和tcp反向代理和负载均衡keepalived 为两台 Haproxy 服务器做高可用/主备切换.nginx   为内网服务器做正向代理,如果业务需求有变化,也可以部分替代 ...

  5. Keepalived+LVS+nginx双机热备

    Keepalived简介 什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了, 也就是所谓的高可用或热备,用来防止单点故障的发生. Keepalived采 ...

  6. keepalived+nginx实现双机热备

    keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机, ...

  7. [笔记]使用Keepalived实现Nginx主从热备

    HA(High Available), 高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点. 1.1. 高可靠软件keepalived keepaliv ...

  8. 如何使用keepalived实现nginx双机热备

    1.linux安装方法:yum -y install keepalived 配置开机启动:sudo chkconfig  keepalived on 查看keepalivede运行日志:/var/lo ...

  9. MFS+Keepalived双机高可用热备方案操作记录

    基于MFS的单点及手动备份的缺陷,考虑将其与Keepalived相结合以提高可用性.在Centos下MooseFS(MFS)分布式存储共享环境部署记录这篇文档部署环境的基础上,只需要做如下改动: 1) ...

随机推荐

  1. Combination Sum II [LeetCode]

    Problem description: http://oj.leetcode.com/problems/combination-sum-ii/ Basic idea: use recursive a ...

  2. python中关闭文件

    1.关闭文件,通过f.write把内容写入文件会覆盖之前文件中的内容

  3. Hadoop运维操作

    1.      处理hadoop的namenode宕机 处理措施: 进入hadoop的bin目录,重启namenode服务 操作命令: cd path/to/hadoop/bin ./hadoop-d ...

  4. MATLAB时间序列预测Prediction of time series with NAR neural network

    具体请参考:http://lab.fs.uni-lj.si/lasin/wp/IMIT_files/neural/nn05_narnet/ 神经网络预测时间序列数据,有三种模型, 这里是给出的是第二种 ...

  5. [转]JDE910--jas.ini参数说明

    配置 jas.ini 文件 jas.ini 文件可以使用 Java™ Application Server (JAS) 来提供 JDE 安装的配置.您必须针对特定于每个环境的 JDE 实例来配置 ja ...

  6. biztalk中使用WCF-SQL接受传送数据【转】

    接触biztalk时间不长,转载一篇学习教程: http://www.cnblogs.com/chnking/archive/2010/05/09/1731098.html chnking写的. 一. ...

  7. 如何采集所有QQ群成员?

    首先,你需要有一个CHROME浏览器其实,你要装一个叫REGEX SCRAPER的插件 在qun.qzone.qq.com打开你的QQ群页面-查看群成员 点击REGEX 插件, 粘贴上这个代码 tex ...

  8. ruby开源项目之Octopress:像黑客一样写博客(zhuan)

    ruby开源项目之Octopress:像黑客一样写博客 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 今年一直推荐的一种写作方式.markdown语法快速成文,git ...

  9. NOIP 2000解题报告

    题目简单,思路很快就有,关键是代码实现能力,大概3个多小时完成.第一题:题目大意:将一个10进制数N转换成-B进制数 (负进制转换):B<=20, N(-32768<=N<=3276 ...

  10. 根据图片Uri获得图片文件

    2013-12-17 1. 根据联系人图片Uri获得图片文件并将它显示在ImageView上, 代码如下: Uri uri = Uri.parse("content://com.androi ...