nosql之 redis 高可用性集群方案,应急维护技巧

@H_301_0@前提:现在有主从结构,主库没有配置持久化,从库配置AOF。(主库用来备份和写服务,从库用来提供读服务)

@H_301_0@场景:哪天主库突然宕了,怎么办?

@H_301_0@

@H_301_0@方法:连上从库,做save操作。将会在从库的data目录保存一份从库最新的dump.rdb文件。将这份dump.rdb文件拷贝到主库的data目录下。再重启主库。

@H_301_0@

@H_301_0@就因为这个我想到了用集群的方案,但是redis官方没有MysqL那样的master-

@H_301_0@master的模式~ 这样的情况下,只能咱们自己想办法了~

@H_301_0@

@H_301_0@实现的原理~

当 Master 与 Slave 均运作正常时,Master负责读,Slave负责同步;

当 Master 挂掉,Slave 正常时,Slave接管服务,同时关闭主从复制功能

@H_301_0@

然后依次循环。

这样,两台redis服务器中的任何一台挂掉,都会由另一台继续提供服务,不会对网站形

成可察觉的影响,也不会丢失数据。

你也可以实现

当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复

Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。

高可用方面

需要把读写进行分离的,写的话,就指向到一个vip~ 那两个主 用keepalived加脚本进行判断。

读的话,尽量用haproxy进行分流,这样的话,哪怕一个从down的话,haproxy会自动剔除的~

redis安装~

wgethttp://redis.googlecode.com/files/redis-2.2.13.tar.gztar-zxfredis-2.2.13.tar.gzcdredis-2.2.13makemakeinstall

keepalived的安装~

tar-xzvfkeepalived-1.1.20.tar.gzcdkeepalived-1.1.20./configure--prefix=/usr/local/webserver/keepalivedmakemakeinstallcp/usr/local/webserver/keepalived/sbin/keepalived/usr/sbincp/usr/local/webserver/keepalived/etc/sysconfig/keepalived/etc/sysconfigcp/usr/local/webserver/keepalived/etc/rc.d/init.d/keepalived/etc/init.dmkdir/etc/keepalivedcp/usr/local/webserver/keepalived/etc/keepalived/keepalived.conf/etc/keepalived

安装完之后,具体说下高可用性的部分,下面是 的keepalived.conf 的配置文件~

killall-0redis-server 来判断进程的存活~

也可以用checkredis.sh 这个脚本~

【大家可以写简单点~】 这个方法是redis自带的一个判断服务存活的程序


  1. @H_301_0@#!/bin/bash

  2. @H_301_0@REDIS_HOME="/home/redis"

  3. @H_301_0@REDIS_COMMANDS="/home/redis/src"#Thelocationoftheredisbinary

  4. @H_301_0@REDIS_MASTER_IP="172.16.0.180"#RedisMASTERip

  5. @H_301_0@REDIS_MASTER_PORT="6379"#RedisMASTERport

  6. @H_301_0@ERROR_MSG=`${REDIS_COMMANDS}/redis-cliPING`

  7. @H_301_0@#

  8. @H_301_0@#ChecktheoutputforPONG.

  9. @H_301_0@#

  10. @H_301_0@if["$ERROR_MSG"!="PONG"]

  11. @H_301_0@then

  12. @H_301_0@#redisisdown,returnhttp503

  13. @H_301_0@/bin/echo-e"HTTP/1.1503ServiceUnavailable\r\n"

  14. @H_301_0@/bin/echo-e"Content-Type:Content-Type:text/plain\r\n"

  15. @H_301_0@/bin/echo-e"\r\n"

  16. @H_301_0@/bin/echo-e"Redisis*down*.\r\n"

  17. @H_301_0@/bin/echo-e"\r\n"

  18. @H_301_0@exit1

  19. @H_301_0@else

  20. @H_301_0@#redisisfine,returnhttp200

  21. @H_301_0@/bin/echo-e"HTTP/1.1200OK\r\n"

  22. @H_301_0@/bin/echo-e"Content-Type:Content-Type:text/plain\r\n"

  23. @H_301_0@/bin/echo-e"\r\n"

  24. @H_301_0@/bin/echo-e"Redisisrunning.\r\n"

  25. @H_301_0@/bin/echo-e"\r\n"

  26. @H_301_0@exit0

  27. @H_301_0@fi

在变为backup的状态下,所运行的服务,为主的时候所运行的服务~

global_defs{
router_idDBPOOL_01
}

vrrp_scriptchk_redis{
script"killall-0redis-server"
interval2
}

vrrp_instanceVI_ETH0{
interfaceeth0
virtual_router_id100
priority100
advert_int1
stateMASTER

track_script{
chk_redis
}

virtual_ipaddress{
172.16.0.180
}

notify_master"/opt/redis.sh-m"
notify_backup"/opt/redis.sh-s"
notify_fault"/opt/redis.sh-k"
}


下面是从的配置


global_defs{
router_idDBPOOL_01
}

vrrp_scriptchk_redis{
script"killall-0redis-server"
interval2
}

vrrp_instanceVI_ETH0{
interfaceeth0
virtual_router_id100
nopreempt
priority88
advert_int1
stateBACKUP

track_script{
chk_redis
}

virtual_ipaddress{
172.16.0.180
}

notify_master"/opt/redis.sh-m"
notify_backup"/opt/redis.sh-s"
notify_fault"/opt/redis.sh-k"
}


@H_301_0@下面是/opt/redis.sh 的脚本

#!/bin/sh
#
#ScripttostartRedisandpromotetoMASTER/SLAVE

#UsageOptions:
#-mpromotetheredis-servertoMASTER
#-spromotetheredis-servertoSLAVE
#-kstarttheredis-serverandpromoteittoMASTER
#
REDIS_HOME="/home/redis"
REDIS_COMMANDS="/home/redis/src"#redis执行文件的目录
REDIS_MASTER_IP="172.16.0.180"#RedisMASTERip
REDIS_MASTER_PORT="6379"#RedisMASTERport
REDIS_CONF="redis-mdb.conf"#配置文件

E_INVALID_ARGS=65
E_INVALID_COMMAND=66
E_NO_SLAVES=67
E_DB_PROBLEM=68

error(){
E_CODE=$?
echo"Exiting:ERROR${E_CODE}:$E_MSG"

exit$E_CODE
}

start_redis(){
alive=`${REDIS_COMMANDS}/redis-cliPING`
if["$alive"!="PONG"];then
${REDIS_COMMANDS}/redis-server${REDIS_HOME}/${REDIS_CONF}
sleep1
fi
}

start_master(){
${REDIS_COMMANDS}/redis-cliSLAVEOFnoone
}

start_slave(){
${REDIS_COMMANDS}/redis-cliSLAVEOF${REDIS_MASTER_IP}${REDIS_MASTER_PORT}
}

usage(){
echo-e"StartRedisandpromotetoMASTER/SLAVE-version0.3(c)AlexWilliams-www.alexwilliams.ca"
echo-e"\nOptions:"
echo-e"\t-m\tpromotetheredis-servertoMASTER"
echo-e"\t-s\tpromotetheredis-servertoSLAVE"
echo-e"\t-k\tstarttheredis-serverandpromoteittoMASTER"
echo-e""

exit$E_INVALID_ARGS
}

forargin"$@"
do
case$argin
-m)arg_m=true;;
-s)arg_s=true;;
-k)arg_k=true;;
*)usage;;
esac
done

if[$arg_m];then
echo-e"Promotingredis-servertoMASTER\n"
start_redis
wait
start_master
elif[$arg_s];then
echo-e"Promotingredis-servertoSLAVE\n"
start_redis
wait
start_slave
elif[$arg_k];then
echo-e"Startingredis-serverandpromotingtoMASTER\n"
start_redis
wait
start_master
else
usage
fi

相关文章

一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如何向redis中...
一、引言 上一篇文章,我介绍了如何在Linux系统上安装和配置MongoDB,其实都不是很难,不需要安装和编译...
一、介绍 Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门...
一、引言 redis学了一段时间了,基本的东西都没问题了。从今天开始讲写一些redis和lua脚本的相关的东西...
一、介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分。...
一、引言 上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入...