redis主从配置及通过keepalived实现redis自动切换高可用

一:环境介绍:

Master: 192.168.1.4

Slave: 192.168.1.5

Virtural IP Address (VIP): 192.168.1.253

二:设计思路:

当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;

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

当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。

然后依次循环。

需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失。

三:安装配置前准备工作

1.在主服务器192.168.1.4上面做下面操作

echo "192.168.1.4 test01" >> /etc/hosts

echo "192.168.1.5 test" >> /etc/hosts

2.在从服务器192.168.1.5上面做下面操作

echo "192.168.1.4 test01" >> /etc/hosts

echo "192.168.1.5 test" >> /etc/hosts

四:主服务器配置redis

1.下载安装redis软件包

wget http://download.redis.io/releases/redis-2.8.12.tar.gztar xf redis-2.8.12.tar.gz 
cd redis-2.8.12
make && make install
cd src/
cp redis-server redis-cli redis-benchmark redis-check-aof redis-check-dump /usr/local/bin
cd /usr/local/bin
ls -ll
然后将源码中的 redis.conf 复制到 /etc/redis.conf
cp /root/redis-2.8.12/redis.conf /etc/redis.conf
修改 /etc/redis.conf里面可以把  daemonize no 修改为daemonize yes
就可以默认在后台执行redis-server了。

再制作一个 init.d 的启动脚本:
vim /etc/init.d/redis-server
#!/usr/bin/env bash
#
# redis start up the redis server daemon
#
# chkconfig: 345 99 99
# description: redis service in /etc/init.d/redis #             chkconfig --add redis or chkconfig --list redis #             service redis start  or  service redis stop
# processname: redis-server
# config: /etc/redis.conf

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf"
#make sure some dir exist
if [ ! -d /var/lib/redis ] ;then
    mkdir -p /var/lib/redis
    mkdir -p /var/log/redis
fi

case "$1" in
    status)
        ps -A|grep redis
        ;;
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        if [ "$?"="0" ]
        then
              echo "Redis is running..."
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $REDIS_CLI -p $REDISPORT SHUTDOWN
                while [ -x ${PIDFILE} ]
               do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
   restart|force-reload)
        ${0} stop
        ${0} start
        ;;
  *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
        exit 1
esac

chmod o+x /etc/init.d/redis-server

chkconfig --add redis-server

service redis-server start

五:从发服务器配置redis

从服务器,配置一样,只不过 修改/etc/redis.conf 中

slaveof <masterip> <masterport>修改为

slaveof 192.168.1.4 6379

然后开启从服务器的redis服务。

start redis-server start

六:进行redis主从测试

#主服务器

redis-cli -p 6379 set hello world

#从服务器

redis-cli -p 6379 get hello

"world"

#主服务器

redis-cli -p 6379 set hello world2

#从服务器

redis-cli -p 6379 get hello

"world2"

redis-cli -p 6379 set hello world

(error) READONLY You can‘t write against a read only slave.

成功配置主从redis服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。

七:安装和配置keepalived

1.在Master和Slave上安装Keepalived

$ yum install keepalived -y

2.默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:

首先,在Master上创建如下配置文件:

$  vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_redis {
    script "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本   
    interval 2                                          ###监控时间
    }

vrrp_instance VI_1 {
    state MASTER                 ###设置为MASTER  
    interface eth1                ###监控网卡     
    virtual_router_id 51
    priority 100            ###权重值  
    authentication {
        auth_type PASS        ###加密  
        auth_pass 1111        ###密码
    }

track_script {
    chk_redis             ###执行上面定义的chk_redis  
    }

    virtual_ipaddress {
        192.168.1.253         ######VIP 
    }

         notify_master /etc/keepalived/scripts/redis_master.sh
         notify_backup /etc/keepalived/scripts/redis_backup.sh
         notify_fault  /etc/keepalived/scripts/redis_fault.sh
         notify_stop   /etc/keepalived/scripts/redis_stop.sh
}

3.然后,在Slave上创建如下配置文件:

$ vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_redis {
    script "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本  
    interval 2                   ###监控时间
    }

vrrp_instance VI_1 {
    state BACKUP         ###设置为BACKUP   
    interface eth1       ###监控网卡
    virtual_router_id 51
    priority 10          ###比MASTRE权重值低   
    authentication {
        auth_type PASS
        auth_pass 1111        ###密码与MASTRE相同  
    }

track_script {
    chk_redis        ###执行上面定义的chk_redis  
    }

    virtual_ipaddress {
        192.168.1.253   ####vip
    }

         notify_master /etc/keepalived/scripts/redis_master.sh
         notify_backup /etc/keepalived/scripts/redis_backup.sh
         notify_fault  /etc/keepalived/scripts/redis_fault.sh
         notify_stop   /etc/keepalived/scripts/redis_stop.sh

}

4.在Master和Slave上创建监控Redis的脚本

$  mkdir /etc/keepalived/scripts

$  vim /etc/keepalived/scripts/redis_check.sh

#!/bin/bash  
ALIVE=`/usr/local/bin/redis-cli PING`  
if [ "$ALIVE" == "PONG" ]; then 
echo $ALIVE  
exit 0  
else 
echo $ALIVE  
exit 1  
fi

5.编写以下负责运作的关键脚本:

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_backup.sh

notify_fault /etc/keepalived/scripts/redis_fault.sh

notify_stop /etc/keepalived/scripts/redis_stop.sh

因为Keepalived在转换状态时会依照状态来呼叫:

当进入Master状态时会呼叫notify_master

当进入Backup状态时会呼叫notify_backup

当发现异常情况时进入Fault状态呼叫notify_fault

当Keepalived程序终止时则呼叫notify_stop

1)首先,在Redis Master上创建notity_master与notify_backup脚本:

$  vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.5 6379 >> $LOGFILE  2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态  

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

$  vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash  
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.5 6379 >> $LOGFILE  2>&1

2)在Redis Slave上创建notity_master与notify_backup脚本:

$  vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash  
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1

echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.4 6379 >> $LOGFILE  2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态  

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

$  vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash  
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.1.4 6379 >> $LOGFILE  2>&1

3)然后在Master与Slave创建如下相同的脚本:

$  vim /etc/keepalived/scripts/redis_fault.sh

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

$  vim /etc/keepalived/scripts/redis_stop.sh

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

6.在主从服务器上面给脚本都加上可执行权限:

$  chmod +x /etc/keepalived/scripts/*.sh

7.进行相关功能测试

启动Master和slave上的Redis

$  /etc/init.d/redis start

启动Master和slave上的Keepalived

$  /etc/init.d/keepalived start

尝试通过VIP连接Redis:

$ redis-cli -h 192.168.0.253 INFO

连接成功,Slave也连接上来了。

role:master

slave0:192.168.1.5,6379,online

尝试插入一些数据:

$ redis-cli -h 192.168.0.253 SET Hello Redis

OK

从VIP读取数据

$ redis-cli -h 192.168.0.253 GET Hello

"Redis"

从Master读取数据

$ redis-cli -h 192.168.0.1 GET Hello

"Redis"

从Slave读取数据

$ redis-cli -h 192.168.0.2 GET Hello

"Redis"

8.通过模拟相关故障,进行功能测试

将Master上的Redis进程杀死:

$  killall -9 redis-server

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[fault]

Thu Sep 27 08:29:01 CST 2012

同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[master]

2014年 07月 07日 星期一 16:42:52 CST

Being master....

Run SLAVEOF cmd ...

OK Already connected to specified master

Run SLAVEOF NO ONE cmd ...

OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。

$ redis-cli -h 192.168.1.253 INFO

$ redis-cli -h 192.168.1.5 INFO

role:master

然后我们恢复Master的Redis进程

$  /etc/init.d/redis start

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[master]

2014年 07月 07日 星期一 16:48:08 CST

Being master....

Run SLAVEOF cmd ...

OK

Run SLAVEOF NO ONE cmd ...

OK

同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[backup]

Fri Sep 28 14:16:37 CST 2012

Being slave....

Run SLAVEOF cmd ...

OK

发现目前的Master已经再次恢复了Master的角色,故障切换以及自动恢复都成功了。

参考:http://chwshuang.iteye.com/blog/1881169

redis主从配置及通过keepalived实现redis自动切换高可用

时间: 2024-08-26 19:49:29

redis主从配置及通过keepalived实现redis自动切换高可用的相关文章

mysql mha 主从自动切换 高可用

mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案. 一,什么是mha,有什么特性 1. 主服务器的自动监控和故障转移 MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移.即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了.MHA通常在几秒内完成故障转移,9-12秒可以检测出

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused 在docker中搭建的redis主从集群时,从服务器上的redis日志报错: 32677:S 08 Feb 16:14:38.947 * Connecting to MASTER 172.168.10.70:6379 32677:S 08 Feb 16:14:38.948 * MASTER <-> SLAVE sync started 32677:S 08

Redis集群_1.redis主从配置

Redis主从配置(Master-Slave) 一. Redis Replication的特点: 1):一个Master可以同步多个Slave 2):不仅Master可以同步多个Slave,Slave也可以同步其它Slave,可以构成一个图形结构,同时还能分担Master的同步压力 3):Redis Replication使用的是异步复制.从2.8开始,Slave会周期性发起一个Ack确认replication stream被处理进度 4):复制在Master Server是以非阻塞模式完成数据

Windows下Redis主从配置出现Writing to master:Unknow error

异常:Sending command to master in replication handshake: -Writing to master: Unknown error: 解决结论: 从数据库的slaveof所写的ip地址要和 主数据库的bind第一个参数相同: 解决过程: 一.当我在一台操作系统为win10的64位电脑上进行redis主从配置时,出现以上错误,死活连接不上,当时配置如下: 1.(master)配置redis.windows.conf (1)bind 127.0.0.1

Redis 主从配置密码以及哨兵

Redis 主从介绍 主Redis写入数据时,从Redis会通过Redis Sync机制,同步数据,确保数据一致.并且Redis有哨兵(Sentinel)机制,Redis主挂掉会自动帮我们提升从为主. 主从同步类型以及哨兵介绍 级联复制 为避免主Redis同时读写压力过大,三个包括以上节点的Redis,可以配置为级联复制,如下图所示,节点4可以同步节点3数据,也可以同步节点2数据. 一主多从 需要两个以及以上节点.因为Redis是异步同步数据,数据写入主节点并返回客户端,并不代表从节点也已经写入

Redis 主从配置(Windows版)

原文:Redis 主从配置(Windows版) 安装从库 1.复制一份 Redis 文件,当做从库. 2.修改从库文件中 redis.windows.conf 的端口号. 3.安装服务,需要重新设置名称.然后去服务中,开启“redis6380”(此时就可以连接6380的库了) redis-server --service-install redis.windows.conf  --service-name Redis6380 配置主从服务器 Redis Slaveof 命令 Redis Slav

redis慢查询日志、php安装redis扩展、redis存储session、redis主从配置

一:redis慢查询日志 编辑配置文件/etc/redis.conf针对慢查询日志,可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢查询日志的长度.当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除. slowlog-log-slower-than 1000 //单位ms,表示慢于1000ms则记录日志slowlog-max-len 128 //定义日志长度,表示最多存128条slowlog get //列出所有的慢查询日志slowlog get 2 //只列出2条slowl

redis主从配置和哨兵

1.redis主从配置 如果redis需要实现高可用.前提条件就是实现数据的同步 (1)拷贝配置shards文件夹 改名为sentinel (2)主从搭建策略 6379主机. 6380从机 6381从机 (3)状态信息检查 info replication (4)主从挂载 (5)检查主从挂载状态 2.哨兵机制 2.1哨兵的作用 通过哨兵机制,可以实现redis的高可用,如果主节点宕机后,由哨兵通过选举机制,选择一台从机.同时修改其他机器的配置文件,配置新的主机. 2.编辑哨兵配置文件 (1)准备

Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡

Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Keepalived实现WEB服务的高可用负载均衡服务,终于在2017年的第一天前完成了,所以在此分享给有需要的朋友:说到负载均衡,其实在linux下有很多服务可以实现,比如nginx.haproxy.lvs等服务,当前我们在前面的文章有介绍过了,但是对于高可用服务,我们在linux下最常见也是应用最多的是Kee