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. POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6169   Accepted: 2573 Desc ...

  2. EasyUI tab常用

    获取选中的tab的title var tab = $('#tab_Employee').tabs('getSelected'); var t=tab.panel('options').title; t ...

  3. UI-简答的BOL的取值塞值

    不知道从什么时候开始,习惯用BOL MODEL来做一些东西的了.某个项目开始正式接触标准主数据的时候,开始了用MAINTAIN BAPI和BUPA的一些FM.然后在一段时间内是以此类的FM来开发的.B ...

  4. JavaScript学习——判断数据类型总结(转)

    一.JS中的数据类型 1.数值型(Number):包括整数.浮点数. 2.布尔型(Boolean) 3.字符串型(String) 4.对象(Object) 5.数组(Array) 6.空值(Null) ...

  5. easyui 中重复加载两次url

    之前一直在使用easyui中,忽视了官网上的小细节,类似于datagrid.combobox 等组件在使用的时候,它的数据加载方式分为两种: 官网中: ①在html中,比如: <table id ...

  6. BZOJ2494 Triangles and Quadrangle

    一道非常"简单"的计算几何题... 题意:给你两个三角形和一个四边形,问你能否用这两个三角形拼成这个四边形 首先...四边形可能是凹四边形...需要判断一下...这个比较简单直接分 ...

  7. select option居中显示

    <style> .ch-select{ padding:0px;} .ch-select input[type=text]{ width:100%; position:relative; ...

  8. IKAnalyzer 和 solr4.3 冲突

    solr4.3 运行之后发现异常:Exception in thread "main" java.lang.VerifyError: class org.wltea.analyze ...

  9. 初学ExtJs 表格显示后台数据

    最近开始接触ExtJs,贴出自己的代码,一个简单的表格显示 版本 3.4.1 需要json包 代码清单1.jsp引入的ExtJs文件 <!-- 资源文件 ExtJs --> <lin ...

  10. C#伪静态实现的方法

    在asp.net开发网站的时候,我们经常会用到伪静态,好处是可以隐藏真实的路径,提高网站的安全性,在官网等展示网站希望对搜索引擎友好,提高搜索排名:或者在涉及到模板开发都会用到伪静态.下面讲解下平时用 ...