基于Keepalived的Redis主从高可用集群搭建

目标:

  • 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;
  • 当 Master 挂掉,Slave 正常时, Slave接管服务升级Master,有写权限,同时关闭主从复制功能;
  • 当 Master 恢复正常, Master降级为Slave同步数据,开启主从复制。

安装机器:node00/01 192.168.5.1/192.168.5.2
vip: 192.168.5.3

1、安装&配置Redis

安装redis需要gcc编译环境,此处不赘述。以下操作在node00/01上进行
先将redis-5.0.9.tar.gz传送到服务器

$ tar -zxvf redis-5.0.9.tar.gz -C /usr/local/
$ cd redis-5.0.9
$ make && make install
# 开始配置Redis
$ mkdir /etc/redis
$ cp /usr/local/redis-5.0.9/redis.conf /etc/redis
$ vi /etc/redis/redis.conf
# 修改如下配置
bind 0.0.0.0   # 修改支持网络访问
protected-mode no   # 同样一个安全配置,默认yes是不能网络访问的
daemonize yes   # 后台运行redis
appendonly yes  # 持久化配置(开启AOF)
# 指定Master IP,同步(仅从配置)
$ cat >> /etc/redis/redis.conf << EOF
slaveof 192.168.5.1 6379  
EOF
# 配置redis.service开机自启动
$ vi /lib/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf --daemonize no
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload
$ systemctl enable redis && systemctl start redis

2、安装keepalived

以下操作在node0/1上进行

$ yum install keepalived -y
$ rm -fr /etc/keepalived/keepalived.conf 
$ vi /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
vrrp_script chk_redis {
    script "/etc/keepalived/redis_check.sh"    ###监控脚本
    interval 2                         ###监控时间
    weight -20                         ##如果条件成立则权重减20
    }

vrrp_instance VI_1 {
    state BACKUP                ###都设置为BACKUP,非抢占式
    nopreempt                   # 不抢占MASTER
    interface ens32                ###监控网卡
    virtual_router_id 117
    priority 100            ###权重值,node1上设为90
    authentication {
        auth_type PASS        ###加密
        auth_pass 123        ###密码
    }
    #设置额外的监控,里面的任意一个网卡出现问题,都会进入FAULT状态
    track_interface {
       ens32
    }
    track_script {
         chk_redis            ###执行上面定义的chk_redis
    }
    virtual_ipaddress {
       192.168.5.3        ######VIP
    }
        notify_master /etc/keepalived/redis_master.sh
        notify_backup /etc/keepalived/redis_backup.sh
        notify_fault  /etc/keepalived/redis_fault.sh
        notify_stop  /etc/keepalived/redis_stop.sh
}

$ systemctl enable keepalived && systemctl restart keepalived

以下为4个检测脚本

#  定时检测脚本
$ vi redis_check.sh
#!/bin/bash

ALIVE=`/usr/local/bin/redis-cli PING`
# 当Redis服务宕机时立即停止keepalived
if [ "$ALIVE" != "PONG" ]; then
   systemctl stop keepalived
   exit 1
fi

# VIP不在本机,要保证为slave
COUNT=`ip a | grep 5.3 |wc -l`
if [ $COUNT -eq 0 ]; then   
   COUNT=`/usr/local/bin/redis-cli info replication | grep role:slave |wc -l`
   if [ $COUNT -eq 0 ]; then   
      /etc/keepalived/redis_slave.sh     
   fi
   exit 0
fi

# VIP主机上Redis角色不是Master,则要置主
COUNT=`/usr/local/bin/redis-cli info replication | grep role:master |wc -l`
if [ $COUNT -eq 0 ]; then   
   /etc/keepalived/redis_master.sh
   exit 0
fi


# 被选入Master时,执行的脚本
$ vi /etc/keepalived/redis_master.sh  
#!/bin/bash

REDISCLI="/usr/local/bin/redis-cli"
REDISCONF="/etc/redis/redis.conf"

LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

# 检测服务不正常时,执行fault脚本
$ vi /etc/keepalived/redis_fault.sh
#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

# keepalive终止时写入日志
$ vi /etc/keepalived/redis_stop.sh 
#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

# 进入slave时执行的脚本
$ vi /etc/keepalived/redis_backup.sh 
#!/bin/bash 
 
REDISCLI="/usr/local/bin/redis-cli"
REDISCONF="/etc/redis/redis.conf"
LOGFILE="/var/log/keepalived-redis-state.log"
 
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
# IP为指定另一个redis的IP,在node1上,这个值为192.168.5.2
$REDISCLI SLAVEOF 192.168.5.2 6379 >> $LOGFILE  2>&1  
$ chmod +x /etc/keepalived/*.sh

说明:在网上大多数的教程中,对redis_check.sh定时检测脚本处理得不够,可能会导致出现如下场景:Keepalived的VIP这台机上,Redis的角色是“从”,这样,客户端通过vip连接上Redis之后,读没有问题,但却无法写、删除了(出错提示:You can't write against a read only slave)。
因此,我们在检测脚本中实现了:
1)将Keepalived的vip与Redis的“主”角色绑定,
2)当Redis服务宕机时立即随之停止keepalived服务,即将此台机器从集群中剔除,这样,另外一台机器就必然自动置主。
3)当然,当这台机的Redis服务重新启动后,要手工启动keepalived服务,将它重新加回到集群。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容