Keepalived+Redis高可用部署
1 Redis简介及安装
Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。
Redis从它的许多竞争继承来的三个主要特点:
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
1.1 REDIS优势
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
1.2 REDIS安装
在redis官网下载最新的源码包
http://download.redis.io/releases/redis-2.8.3.tar.gz
- 解压
# tar xzf redis-3.0.0.tar.gz
- 拷贝目录
# mv redis-3.0.0 /usr/local/redis
- 进入目录
# cd /usr/local/redis
- 编译
# make && make install
- 查看命令运行结果,如果是0则是成功
# echo $?
1.3 REDIS启动
# redis-server
第一次启动时可能会有提示的warning信息;可以忽略,但最好是按照提示的处理办法修改。
1.4 REDIS客户端启动
# redis-cli
1.5 验证客户端操作
# redis> set iom dtsoft
OK
# redis> get iom
“dtsoft”
2 主从自动切换原理
2.1 场景描述
假设有两台服务器A,B,A为主节点,B为从节点,每台上都装有keepalived和redis,并且已为keepalived分配一个VIP,下面分两种情况讨论:
B-redis挂掉
VIP仍为A服务器占用,用户读写不受任何影响,B-keepalived检测到B-redis挂掉后自动关掉本身服务(其实也可以不关掉keepalived服务,此处是为了尽量保持和A-keepalived相同的配置);问题修复后,以从机配置文件启动B-redis,启动B-keepalived, A、B两节点回到初始状态。
A-redis挂掉
A-keepalived检测到A-redis挂掉后自动关掉本身服务,VIP被B服务器占用,B-redis设置为主节点;问题修复后,A-redis以从机配置文件重启并自动同步B-redis数据,同步完成后开启A-keepalived, VIP重回A 服务器,A-redis设置成主节点, B-redis设置为A-redis的从节点,A、B两节点回到初始状态
2.1 切换要求
- A,B上的keepalived要能在本服务器上的redis挂掉后关掉本身服务。
- 不论A-redis还是B-redis,都是以从机配置文件重启(第一次安装,或两个服务都宕掉重启等特殊情况例外);
- A-reids必须在同步完成后才能开启keepalived;
- A-redis必须在本服务器获得VIP后,设置为主节点;
- 丢失VIP的服务器要将本机上的redis置为从节点(如果redis还没挂)。
1,4,5可以用keepalived的配置脚本解决,2,3可以自己编写主从启动脚本控制。
3 keepalived配置
3.1 A-keepalived配置
红字为手工加的备注,原文件里没有。
vi /etc/keepalived/keepalived.cnf文件
global_defs {
router_id LVS_MASTER
}
vrrp_script monitor_redis {
script “/etc/keepalived/script/redis_monitor.sh” –检查redis服务状态脚本;
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
monitor_redis –检查redis服务状态脚本;
}
virtual_ipaddress {
192.168.10.251 #virtual server
}
notify_backup /etc/keepalived/script/redis_backup.sh –keepalived变为从节点(丢失VIP)后执行的脚本
notify_master /etc/keepalived/script/redis_master.sh — keepalived变为主节点(获得VIP)后执行的脚本
}
3.2 B-keepalived配置
vi /etc/keepalived/keepalived.cnf文件
global_defs {
router_id LVS_BACKUP
}
vrrp_script monitor_redis {
script “/etc/keepalived/script/redis_monitor.sh” –检查redis服务状态脚本;
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
monitor_redis –检查redis服务状态脚本;
}
virtual_ipaddress {
192.168.10.251 #virtual server
}
notify_backup /etc/keepalived/script/redis_backup.sh –keepalived变为从节点(丢失VIP)后执行的脚本
notify_master /etc/keepalived/script/redis_master.sh — keepalived变为主节点(获得VIP)后执行的脚本
}
4 REDIS配置
我们是根据keepalived自动切换VIP的原理来实现redis主从切换,每次切换,主从角色都会调换,因此两台两台机子上都要编写主从配置文件。
4.1 编辑主节点配置文件
# vim redis.conf
daemonize yes –进程后台启动
logfile /usr/local/redis/redis.log –日志文件
syslog-enabled no –日志不写进系统日志
dir /usr/local/redis/data –数据文件存放
requirepass system –认证密码
slave-server-stale-data no –同步未完成从机不能接收除slaveof和info之外的命令,相当重要
4.2 编辑从节点配置文件
# vim redis_slave.conf
daemonize yes
logfile /usr/local/redis/redis.log
syslog-enabled no
dir /usr/local/redis/data
slaveof 192.168.10.3 6379 –主服务器的IP(两台机器不同)地址和端口
masterauth system –主服务器上的认证密码
slave-server-stale-data no –同步未完成从机不能接收除slaveof和info之外的命令,相当重要
5 编写脚本
5.1 A服务器redis启动脚本:
#!/bin/bash
export CONFIGPATH=/usr/local/redis/redis_slave.conf
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export result=123
export RESULT=0
export VIP=192.168.10.251
export SLAVEIP=192.168.10.3
killall -9 redis-server
#scp $REDISPATH/flag xf7023@$SLAVEIP:$REDISPATH
echo “start redis-server with $CONFIGPATH”
nohup $REDISPATH/redis-server $CONFIGPATH 2>nohup.out
until [ “$result” = “$RESULT” ]
do
export RESULT=`redis-cli -a $REDISPASS<<EOF
get iom
EOF`
echo “RESULT=$RESULT,SYNC…, wait 10s…”
sleep 10
done
killall -9 keepalived
sleep 5
echo “start keepalived”
service keepalived start
sleep 10
echo “VIP get?”
ip a|sed -n ‘/inet addr/p’|grep $VIP
#until [ “$?” = “0” ]
#do
#ip a|sed -n ‘/inet/p’|grep $VIP
#done
if [ “$?” == “0” ];then
echo $(ip a)
fi
echo “set slaveof master”
redis-cli -a $REDISPASS <<EOF
slaveof no one
EOF
exit 0
5.2 redis_monitor.sh
#/bin/bash
export LOGFILE=/etc/keepalived/log/alive_state.log
export ALIVE=$(/usr/local/redis/src/redis-cli -a system PING)
echo “ALIVE=$ALIVE” >>$LOGFILE
if [ “$ALIVE” = “PONG” ]; then
echo $ALIVE
exit 0
else
echo “killall -9 keepalived”>>$LOGFILE
echo $ALIVE
killall -9 keepalived
exit 1
fi
5.3 redis_master.sh
#!/bin/bash
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export LOGFILE=”/etc/keepalived/log/alive_state.log”
date >> $LOGFILE
echo “set master ” >> $LOGFILE
echo “run slaveof no one cmd …”
$REDISPATH/redis-cli -a $REDISPASS slaveof no one
5.4 redis_backup.sh
#!/bin/bash
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export REDISMASTER=”192.168.10.3 6379″ –redis主节点地址,A,B两服务器不同,注意区别
export LOGFILE=”/etc/keepalived/log/alive_state.log”
date >> $LOGFILE
echo “set back up ” >> $LOGFILE
echo “MASTER:$REDISMASTER”>>$LOGFILE
echo “run slaveof cmd …”
$REDISPATH/redis-cli -a $REDISPASS slaveof $REDISMASTER
6 系统测试
6.1.1 测试环境
VIP:192.168.10.251
A机器IP:192.168.10.2
B机器IP:192.168.10.2
客户机IP:192.168.10.1
6.1.2 测试过程
A机器启动redis和keepalived
# redis-server redis.conf
# service keepalived start
B机器启动redis和keepalived
# redis-server redis_slave.conf
# service keepalived start
测试客户机与A,B集群连接
客户机运行redis客户端:
# redis-cli –h 192.168.10.251 –p 6379
redis:6379> auth system –第一次需要输入密码
OK
客户机上做些写(增,删,改)操作,看A-redis和B-redis是否数据同步。
测试A-redis(主节点)挂掉后客户机业务
关掉redis主机,查看A-keepalived是否自动停止
# ps –ef|grep keep
B机器是否获得VIP
# ip a
B-redis是否变为主机状态
# info
客户机上做些写(增,删,改)操作,看B-redis是否数据同步。
测试A-redis重启后客户机业务
用命令脚本启动A-redis主机
# sh ./script/redis_start.sh
查看A-redis是否将B-redis数据同步完全,分别在A,B redis运行
# keys * 看数量是否相等
查看A机器是否或得VIP
# ip a
查看A-redis是否变为主节点(keepalived获得VIP会执行命令,将A-redis变为主节点),登陆A-redis,运行命令
# info
查看B-redis是否变为从节点(keepalived丢失VIP会执行命令,将B-redis变为从节点),登陆B-redis,运行命令
# info
客户机连接redis客户端,测试业务是否正常
# redis-cli –h 192.168.10.251 –p 6379
6.1.3 测试注意
- redis节点不能开启从节点只读模式,也就是slave-read-only要设置为 no。
- 如果AB服务器keepalived都挂掉,VIP有可能长久固定在某个上面。
- keepalived的配置文件里的脚本要注意执行权限,配置文件格式要完全正确,否则可能会无法绑定VIP。
- A,B服务器各脚本里的变量要注意区别,尤其是IP。
- A-redis挂掉后启动要用启动脚本,B-redis不需要。
Keepalived+Redis高可用部署的更多相关文章
- Keepalived+Redis高可用部署(第二版)
更新 20150625 脚本由5个减少为4个,sh脚本指令做了精简. 修改了另外3个脚本,在日志里增加了日期显示. 新增redis数据类型,持久化,主从同步简介. 新增hiredis简介. 新增c语言 ...
- Redis高可用部署及监控
Redis高可用部署及监控 目录 一.Redis Sentinel简介 二.硬件需求 三.拓扑结构 .单M-S结构 .双M-S结构 .优劣对比 四.配置部 ...
- keepalived+redis 高可用redis主从解决方案
背景介绍: 目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案.#Redis 2.8版开始正式提供名为Sentinel的主从切换方案(后面附上,未测试) 因此, ...
- MariaDB Galera Cluster 部署 + keepalived实现高可用
MariaDB Galera Cluster 部署 MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力 ...
- LVS+Keepalived高可用部署
一.LVS+Keepalived高可用部署 一.keepalived节点部署 1.安装keepalived yum install keepalived ipvsadm -y mkdir -p /op ...
- Redis+Keepalived实现高可用
使用redis哨兵可以在主服务器出现故障的时候自动切换主从,但是从服务器的IP不同于原主服务器的IP还需要在客户端手动修改IP才能生效 下面使用keepalived实现VIP自动漂移 keepaliv ...
- (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)
参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...
- Keepalived+LVS实现LNMP网站的高可用部署
Keepalived+LVS实现LNMP网站的高可用部署 项目需求 当我们访问某个网站的时候可以在浏览器中输入IP或者域名链接到Web Server进行访问,如果这个Web Server挂了, ...
- Redis高可用方案----Redis主从+Sentinel+Haproxy
安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...
随机推荐
- Android Paint和Color类绘画实例
要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...
- iOS 内存错误调试(EXC_BAD_ACCESS)
内存错误crash现场: Thread堆栈: 有可能是访问被释放对象造成,根据现场并不能找到具体哪个对象出现内存错误. 1.开启僵尸对象调试 Edit Scheme->Debug->Dia ...
- Sql动态添加字段的正确姿势
如何给指定表动态添加字段? 一.创建一张表[Tbl_AutoFileds] (tableName表名,fieldName字段名,dataType数据类型,length长度 isnull 是否允许为n ...
- 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性
概述 Google的Borg系统是一个集群管理工具,在它上面运行着成千上万的job,这些job来自许许多多不同的应用,并且跨越多个集群,而每个集群又由大量的机器构成. Borg通过组合准入控制,高效的 ...
- NOIP2012pj摆花[DP 多重背包方案数]
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- 03 Hibernate错题分析
1.在Hibernate中,以下关于主键生成器说法错误的是( C). A.increment可以用于类型为long.short或byte的主键 B.identity用于如SQL Server.DB2. ...
- u3d_小游戏_拼图_1_生成碎片(非随机)
http://blog.csdn.net/cube454517408/article/details/7907247 首先是参考此文: main.cs作用:1.大图的拆分 2.判断是否成功 3.对碎 ...
- [No000064]python 变量命名规范
python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范.于是总结了一些,供参考. 模块名: 模块应该使用尽可能短的.全小写命名,可以在模块命名时使用下划线以增强可读性.同样包的命名也 ...
- webapp开发需要注意的浏览器内核知识
Web App:1.开发成本较低使用web开发技术就可以轻松的完成web app的开发2.升级较简单升级不需要通知用户,在服务端更新文件即可,用户完全没有感觉3.维护比较轻松和一般的web一样,维护比 ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...