阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

149次阅读
没有评论

共计 12680 个字符,预计需要花费 32 分钟才能阅读完成。

一:环境介绍:

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

————————————– 分割线 ————————————–

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm

Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm

Keepalived+Haproxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm

Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm

————————————– 分割线 ————————————–

五:从发服务器配置 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 服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-07/104552p2.htm

七:安装和配置 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 的角色,故障切换以及自动恢复都成功了。

Redis 的详细介绍 :请点这里
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

————————————– 分割线 ————————————–

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm

Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm

Keepalived+Haproxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm

Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm

————————————– 分割线 ————————————–

五:从发服务器配置 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 服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-07/104552p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计12680字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中