Loading... <p>最近整理一下Redis高可用架构的文档,也准备分享出来,虽然这些架构也不是很复杂。<br />Redis的高可用方案目前主要尝试过5种方式,其中2种方式已经在线上使用。</p> <p>1)Redis Master-Slave + Keepalive + VIP。<br />这是很经典的db架构,也可以用与mysql的主从切换。<br />基本原理是:Keepalive通过脚本检测master的存活,然后通过漂移VIP(Virtual IP)完成主从切换。</p> <p>2)Redis Master-Slave + DNS Service + Sentinel。<br />基本原理是Sentinel集群进行Redis的存活检测和Redis M-S状态切换。<br />完成切换之后,sentinel调用notification-script参数制定的配置文件,通知DNS Server更改DNS配置,master dns解析执行新的master。</p> <p>3)Redis Master-Slave + Configure Center(Zookeeper) + Sentinel.<br />基本原理和第三种方案相似,只是notification-script通知的是配置中心完成redis连接配置的修改,比如Zookeeper实现的配置中心。</p> <p>4)Redis Master-Slave + Sentinel + Twemproxy + Lvs.<br />这种方案层次比较多,sentinel通知twemproxy进行redis m-s的配置更改。</p> <p>5)Redis Cluster,目前redis3.0接近发布stable版本了。</p> <p><strong style="background-color: transparent;border: 0px;margin: 0px;padding: 0px;vertical-align: baseline;line-height: 40px">1、基本架构图</strong><br /><img src="//cto.wang/usr/uploads/2016/07/20160703180926-20.png" title="1428029872983949.png" alt="1.png" /></p> <p><strong style="background-color: transparent;border: 0px;margin: 0px;padding: 0px;vertical-align: baseline;line-height: 40px">2、基本构建与原理</strong><br />1)Keepalive + VIP : 在redis master-slave上部署keepalived、redis instance存活检测脚本、以及告警通知脚本。<br />2)当redis master失效的时候,VIP从master上漂移到slave上,完成m-s角色和配置更改。<br />3)客户端连接redis的参数中host设置的是VIP,整个切换过程对客户端透明。</p> <p><strong style="background-color: transparent;border: 0px;margin: 0px;padding: 0px;vertical-align: baseline;line-height: 40px">3、优缺点与适用场景。</strong><br />优点:实现简单,成本低。<br />缺点:整个集群的最大吞吐量受限于redis单实例的处理能力,除非一个应用使用多套这种Keepalive+VIP方案。<br />因而扩展能力较差,而且不适合目前单机部署多个redis实例的部署场景,而我们的一个物理机上至少部署8个redis实例。<br />目前我们DBA已经否定了这种架构,不再支持部署这种集群。<br />适合场景:并发请求不是很高的应用。</p> <p><strong style="background-color: transparent;border: 0px;margin: 0px;padding: 0px;vertical-align: baseline;line-height: 40px">4、Keepalive配置和检测脚本</strong><br />下面keepalive的简单配置、检测和通知脚本。<br />1)keepalive.conf<br />master和slave使用相同的配置脚本,其中要注意的地方state的配置都是backup状态,而且都是非抢占方式nopreempt。</p> <pre class="brush:python;toolbar:false">vrrp_script chk_redis { script "/etc/keepalived/redis_check.sh" interval 2 } vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 51 priority 100 nopreempt authentication { auth_type PASS auth_pass redis } track_script { chk_redis } virtual_ipaddress { 10.203.31.216 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" }</pre> <p>2)redis_check.sh,redis实例存活检测脚本。</p> <p>当master检测到redis处于failed状态,将会释放VIP,slave机器将会获取VIP。</p> <pre class="brush:python;toolbar:false">#!/bin/bash REDIS_BIN='/apps/svr/redis/bin' REDIS_MASTER_HOST='127.0.0.1' REDIS_MASTER_PORT=6379 ALIVE=`$REDIS_BIN/redis-cli -h $REDIS_MASTER_HOST -p $REDIS_MASTER_PORT PING` if [ "$ALIVE" == "PONG" ]; then echo $ALIVE exit 0 else echo $ALIVE exit 1 fi</pre> <p>3)master-slave状态切换通知脚本,包括推送告警短信。</p> <pre class="brush:python;toolbar:false">#!/bin/bash REDIS_BIN='/apps/svr/redis/bin' MASTER_IP='192.168.0.216' # virtual ip MASTER_PORT=6379 status=$1 echo $status if [ "$status" = "master" ] then # promoting slave to master echo " config set slave-read-only no " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " slaveof no one " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " config rewrite " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT # pushing simple message to mobile or email elif [ "$status" = "backup" ] then # degrading master to slave echo "config set slave-read-only yes " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo "slaveof $MASTER_IP $MASTER_PORT" | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " config rewrite " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT # pushing simple message to mobile or email fi exit 0</pre> <p>notify.sh<span style="font-family: sans-serif;font-size: 16px">转自:</span>http://mdba.cn/?p=745</p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信