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即可。
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配置文件及脚本:
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 主备热备切换的更多相关文章
- nginx+keepalived简单双机主从热备
双机主从热备概述 可以两台机子互为热备,平时各自负责各自的服务.在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续 ...
- Nginx+keepalived 高可用双机热备(主从模式/双主模式)
基础介绍负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行. 关于负载均衡介绍,可以参考:li ...
- keepalived+LVS 实现双机热备、负载均衡、失效转移 高性能 高可用 高伸缩性 服务器集群
本章笔者亲自动手,使用LVS技术实现实现一个可以支持庞大访问量.高可用性.高伸缩性的服务器集群 在读本章之前,可能有不少读者尚未使用该技术,或者部分读者使用Nginx实现应用层的负载均衡.这里大家都可 ...
- haproxy/nginx+keepalived负载均衡 双机热备 邮件报警 实战及常见问题
Haproxy 做http和tcp反向代理和负载均衡keepalived 为两台 Haproxy 服务器做高可用/主备切换.nginx 为内网服务器做正向代理,如果业务需求有变化,也可以部分替代 ...
- Keepalived+LVS+nginx双机热备
Keepalived简介 什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了, 也就是所谓的高可用或热备,用来防止单点故障的发生. Keepalived采 ...
- keepalived+nginx实现双机热备
keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机, ...
- [笔记]使用Keepalived实现Nginx主从热备
HA(High Available), 高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点. 1.1. 高可靠软件keepalived keepaliv ...
- 如何使用keepalived实现nginx双机热备
1.linux安装方法:yum -y install keepalived 配置开机启动:sudo chkconfig keepalived on 查看keepalivede运行日志:/var/lo ...
- MFS+Keepalived双机高可用热备方案操作记录
基于MFS的单点及手动备份的缺陷,考虑将其与Keepalived相结合以提高可用性.在Centos下MooseFS(MFS)分布式存储共享环境部署记录这篇文档部署环境的基础上,只需要做如下改动: 1) ...
随机推荐
- servlet 配置
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.web.s ...
- Touch ID集成
作者感言 这个国庆由于种种原因, 过的不太安稳, 搬家, 办证, 东跑西跑, 忙的压根就不像是在过节....不过算了, 挑最后一天写写博文.最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系 ...
- java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique
错误信息: Caused by: java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique ...
- 聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
- SQL Server数据库(SQL Sever语言 函数以及SQL编程)
1.数学函数:操作一个数据,返回一个结果 --去上限: ceiling ☆select ceiling(price) from car --去下限:floor ☆select floor(price) ...
- 5月4日课堂内容:for循环的穷举、迭代
一.for循环拥有两类: 1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.迭代: 从初始情况按照规律不断求解中间情况,最终推导出结果. 二.穷举练习 1.单位给发了一张 ...
- struts2视频学习笔记 21(输入校验的流程)
课时21 输入校验的流程 1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性. 2.如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,co ...
- [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor
这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ...
- oracle数据泵备份(Expdp命令)[转]
Oracle备份方式主要分为数据泵导出备份.热备份与冷备份三种,今天首先来实践一下数据泵备份与还原.数据泵导出/导入属于逻辑备份,热备份与冷备份都属于物理备份.oracle10g开始推出了数据泵( ...
- PostgreSQL数据库系统优点
PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统, 它提供了多版本并行控制,支持几乎所有 SQL 构件(包括子查询,事务和用户定 义类型和函数), 并且可以获得非常广阔范围的(开发 ...












