keepalived+redis 实现高可用的自动故障转移failover

keepalived+redis 实现高可用的自动故障转移failover在A服务器(10.0.11.2),B服务器(10.0.12.2)上均安装redis,keepalived(安装方法略)A作为默认的master,B作为slave(在redis的配置文件中加上 SLAVEOF 10.0.11.2 6379)即可A,B上的Redis均开启本地化策略。appendonly yesA服务器的配置keepalived配置文件内容——-begin——! Configuration File for keepalivedglobal_defs { notification_email { hq@xxx.com } notification_email_from hq@xxx.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id redis1.xxx.com}vrrp_script chk_redis {script "/opt/redis/sh/redis_check.sh"interval 2}vrrp_instance VI_1 { state MASTER interface bond0 virtual_router_id 51 priority 101 advert_int 2 authentication { auth_type PASS auth_pass 1111 } track_script {chk_redis } virtual_ipaddress { 10.0.11.0 } notify_master /opt/redis/sh/redis_master.sh notify_backup /opt/redis/sh/redis_backup.sh notify_fault /opt/redis/sh/redis_fault.sh notify_stop /opt/redis/sh/redis_stop.sh}—–end—–说明:global_defs 部分的邮件可以随便写,要实现邮件通知则要按真实填写script "/opt/redis/sh/redis_check.sh"#监控脚本的路径interval 2#监控的频率state MASTER#默认的状态interface bond0#网卡名virtual_router_id 51 #A,B 服务器设置一样即可priority 101#优先级 比B设大即可advert_int 2#貌似广播的频率,不确定authentication {#A,B 服务器设置一样即可auth_type PASSauth_pass 1111} track_script {#监控的名称,上面设置的chk_redis } virtual_ipaddress {#虚拟IP, 客户端就用这个IP来访问redis 10.0.11.0 }#以下是各个状态下执行的脚本路径notify_master /opt/redis/sh/redis_master.sh#成为masternotify_backup /opt/redis/sh/redis_backup.sh#成为backupnotify_fault /opt/redis/sh/redis_fault.sh#监控脚本 exit 1 时notify_stop /opt/redis/sh/redis_stop.sh#keepalived 服务停止时/opt/redis/sh/redis_check.sh–begin–#!/bin/bashALIVE=`/usr/local/bin/redis-cli PING`LOGFILE="/opt/redis/logs/keepalived-redis-state.log"if [ "$ALIVE" == "PONG" ]; thenecho $ALIVE #echo "check master pong" >> $LOGFILEexit 0elseecho $ALIVEexit 1fi–end–/opt/redis/sh/redis_master.sh–begin–#!/bin/bashREDISCLI="/usr/local/bin/redis-cli"LOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master…." >> $LOGFILE 2>&1echo "Run SLAVEOF cmd …" >> $LOGFILE$REDISCLI SLAVEOF 10.0.12.2 6379 >> $LOGFILE 2>&1sleep 15echo "Run SLAVEOF NO ONE cmd …" >> $LOGFILE$REDISCLI SLAVEOF NO ONE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1–end–/opt/redis/sh/redis_backup.sh–begin–REDISCLI="/usr/local/bin/redis-cli"LOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave…." >> $LOGFILE 2>&1sleep 15echo "Run SLAVEOF cmd…" >> $LOGFILE$REDISCLI SLAVEOF 10.0.12.2 6379 >> $LOGFILE 2>&1–end–/opt/redis/sh/redis_fault.sh–begin–#!/bin/bashLOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[fault]" >> $LOGFILEdate >> $LOGFILEsh /opt/redis/sh/redis_backup.sh–end–/opt/redis/sh/redis_stop.sh–begin–#!/bin/bashLOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[stop]" >> $LOGFILEdate >> $LOGFILE–end–B服务器的配置keepalived配置文件内容——-begin——! Configuration File for keepalivedglobal_defs { notification_email { hq@xxx.com } notification_email_from hq@xxx.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id redis2.xxx.com}vrrp_script chk_redis {script "/opt/redis/sh/redis_check.sh"interval 2}vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 51 priority 99 authentication { auth_type PASS auth_pass 1111 } track_script {chk_redis } virtual_ipaddress { 10.0.11.0 } notify_master /opt/redis/sh/redis_master.sh notify_backup /opt/redis/sh/redis_backup.sh notify_fault /opt/redis/sh/redis_fault.sh notify_stop /opt/redis/sh/redis_stop.sh}—–end—–/opt/redis/sh/redis_check.sh–begin–#!/bin/bashALIVE=`/usr/local/bin/redis-cli -h 10.0.11.2 -p 6379 PING`LOGFILE="/opt/redis/logs/keepalived-redis-state.log"if [ "$ALIVE" != "PONG" ]; then echo $ALIVEexit 0elseecho $ALIVEexit 1fi–end–/opt/redis/sh/redis_master.sh–begin–#!/bin/bashREDISCLI="/usr/local/bin/redis-cli"LOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master…." >> $LOGFILE 2>&1##echo "master Run SLAVEOF 10.0.11.2 cmd …" >> $LOGFILE##REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE 2>&1#sleep 10echo "Run SLAVEOF NO ONE cmd …" >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1–end–/opt/redis/sh/redis_backup.sh–begin–#!/bin/bashREDISCLI="/usr/local/bin/redis-cli"LOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave…." >> $LOGFILE 2>&1#sleep 10echo "backup Run SLAVEOF 10.0.11.2 cmd…" >> $LOGFILE$REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE 2>&1–end–/opt/redis/sh/redis_fault.sh–begin–#!/bin/bashLOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[fault]" >> $LOGFILEdate >> $LOGFILEsh /opt/redis/sh/redis_slave.sh–end–/opt/redis/sh/redis_stop.sh–begin–#!/bin/bashLOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[stop]" >> $LOGFILEdate >> $LOGFILE–end–/opt/redis/sh/redis_slave.sh–begin–#!/bin/bashREDISCLI="/usr/local/bin/redis-cli"LOGFILE="/opt/redis/logs/keepalived-redis-state.log"echo "[slave]" >> $LOGFILEecho "Being slave…." >> $LOGFILE 2>&1sleep 35date >> $LOGFILEecho "slave Run SLAVEOF 10.0.11.2 cmd…" >> $LOGFILE$REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE 2>&1–end–redis_slave.sh 中的sleep 35 说明,因为A服务器上的redis服务起来后 B变成fault状态,同时A服务器在变成master,如果次是B太快同步A的话(比A从B同步数据早)会造成数据丢失。这样做的目的是A起来后先从B同步数据,B在slaveof A,脚本说明:脚本的逻辑就是当A,B上的redis服务正常是A为master,B为slave如果检测到A服务不正常则B成为master, “/usr/local/bin/redis-cli SLAVEOF NO ONE” 这个命令就是关闭数据同步,变成Redis 的master.如果A服务起来后,A切回master,在变成master前从B上同步最新的数据。同时在B上要 执行 “/usr/local/bin/redis-cli SLAVEOF 10.0.11.2 6379”让B再做为A的slave,不然B还是master.在redis的主从架构中,可以用“/usr/local/bin/redis-cli -h 10.0.11.2 INFO” 来查看各个当前的状态。 看当前服务器是master还是slave;在命令行下“tail -30 /opt/redis/logs/keepalived-redis-state.log” 查看keepalived的状态转换“tail -30 /var/log/messages” 查看 keepalived虚拟IP的变化。以上是在实际生产环境中测试过的,虽然有的的地方可能不大合理,但故障转移可以实现,,数据也不会丢。之前按网上的教程做的vip可以切换,但数据这块有问题,所以改成这样。如有更好的方法请告知,多谢!

你写PPT时,阿拉斯加的鳕鱼正跃出水面,

keepalived+redis 实现高可用的自动故障转移failover

相关文章:

你感兴趣的文章:

标签云: