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

  1. 解压

# tar xzf redis-3.0.0.tar.gz

  1. 拷贝目录

# mv redis-3.0.0 /usr/local/redis

  1. 进入目录

# cd /usr/local/redis

  1. 编译

# make && make install

  1. 查看命令运行结果,如果是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 切换要求

  1. A,B上的keepalived要能在本服务器上的redis挂掉后关掉本身服务。
  2. 不论A-redis还是B-redis,都是以从机配置文件重启(第一次安装,或两个服务都宕掉重启等特殊情况例外);
  3. A-reids必须在同步完成后才能开启keepalived;
  4. A-redis必须在本服务器获得VIP后,设置为主节点;
  5. 丢失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高可用部署的更多相关文章

  1. Keepalived+Redis高可用部署(第二版)

    更新 20150625 脚本由5个减少为4个,sh脚本指令做了精简. 修改了另外3个脚本,在日志里增加了日期显示. 新增redis数据类型,持久化,主从同步简介. 新增hiredis简介. 新增c语言 ...

  2. Redis高可用部署及监控

    Redis高可用部署及监控 目录                        一.Redis Sentinel简介 二.硬件需求 三.拓扑结构 .单M-S结构 .双M-S结构 .优劣对比 四.配置部 ...

  3. keepalived+redis 高可用redis主从解决方案

    背景介绍: 目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案.#Redis 2.8版开始正式提供名为Sentinel的主从切换方案(后面附上,未测试) 因此, ...

  4. MariaDB Galera Cluster 部署 + keepalived实现高可用

    MariaDB Galera Cluster 部署 MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力 ...

  5. LVS+Keepalived高可用部署

    一.LVS+Keepalived高可用部署 一.keepalived节点部署 1.安装keepalived yum install keepalived ipvsadm -y mkdir -p /op ...

  6. Redis+Keepalived实现高可用

    使用redis哨兵可以在主服务器出现故障的时候自动切换主从,但是从服务器的IP不同于原主服务器的IP还需要在客户端手动修改IP才能生效 下面使用keepalived实现VIP自动漂移 keepaliv ...

  7. (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

    参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...

  8. Keepalived+LVS实现LNMP网站的高可用部署

    Keepalived+LVS实现LNMP网站的高可用部署   项目需求   当我们访问某个网站的时候可以在浏览器中输入IP或者域名链接到Web Server进行访问,如果这个Web Server挂了, ...

  9. Redis高可用方案----Redis主从+Sentinel+Haproxy

    安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...

随机推荐

  1. 怎么使PUTTY一直连接

    如何才能保证PUTTY一直连接,即使我们好长时间不去敲命令,也让它一直连接着? PuTTY的设置方法是:在Connection里面有个Seconds between keepaliaves.这里就是每 ...

  2. hdu 4966 GGS-DDU (最小树形图)

    比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...

  3. Mysql 如何实现列值的合并

    Mysql 如何实现列值的合并 SELECT  GROUP_CONCAT(name SEPARATOR ' ') AS name FROM A

  4. bg激活后台运行的服务

    按redis重启来做案例 ./redis-server Ctrl+z让执行的命令在后台暂停 [1]+ Stopped ./redis-server 这个时候他是把这个服务放到后台了,可是ctrl+z是 ...

  5. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...

  6. [转]backbone.js template()函数

    本文转自:http://book.2cto.com/201406/43974.html 本文所属图书 > Backbone.js实战 资深Web开发专家根据Backbone js最新版本撰写,对 ...

  7. [Notes] Learn Python2.7 From Python Tutorial

    I have planed to learn Python for many times. I have started to learn Python for many times . Howeve ...

  8. Remove Duplicates From Sorted Array

    Remove Duplicates from Sorted Array LeetCode OJ Given a sorted array, remove the duplicates in place ...

  9. POJ 3384 Feng Shui --直线切平面

    题意:房间是一个凸多边形,要在里面铺设两条半径为r的圆形地毯,可以重叠,现在要求分别铺设到哪,使地毯所占的地面面积最大. 解法:要使圆形地毯所占面积最大,圆形地毯一定是与边相切的,这样才能使尽量不重叠 ...

  10. UVA 11800 Determine the Shape --凸包第一题

    题意: 给四个点,判断四边形的形状.可能是正方形,矩形,菱形,平行四边形,梯形或普通四边形. 解法: 开始还在纠结怎么将四个点按序排好,如果直接处理的话,有点麻烦,原来凸包就可搞,直接求个凸包,然后点 ...