开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

centos6上redis+Keepalived实现Redis主从复制

简介:
+关注继续查看

环境:CentOs6.8

Master:172.20.52.72

Slave:172.20.52.159

Virtual IP address(VIP):172.20.52.253


应用软件:

    1、keepalived-1.2.12.tar.gz

     下载地址http://www.keepalived.org/download.html

    2、redis-2.8.7.tar.gz

     下载地址http://www.oschina.net/news/49449/redis-2-8-7


一、安装配置前准备

    yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel

    

            Redis属于内存数据库,所以调优都集中到了内存上,需要将 vm.overcommit 设置为1 
            echo "vm.overcommit_memory=1" >> /etc/sysctl
            sysctl -p

            1.在主服务器172.20.52.160上面做下面操作
                echo " 172.20.52.72  node1" >> /etc/hosts
                echo " 172.20.52.159 node2" >> /etc/hosts
            2.在从服务器10.10.10.204上面做下面操作
                echo " 172.20.52.72 node1" >> /etc/hosts
                echo " 172.20.52.159 node2" >> /etc/hosts

二、在Master和slave上安装Redis

    tar -zxvf redis-2.8.7.tar.gz

    cd redis-2.8.7

    make && make install

    cd src

    mkdir -p /usr/local/redis/bin    

    cp redis-server redis-cli redis-benchmark redis-check-aof redis-check-dump /usr/local/redis/bin

    mkdir -p /usr/local/redis/etc

    复制源码中的redis.conf至/usr/local/redis/etc/     cp redis.conf /usr/local/redis/etc/

    修改 /usr/local/redis/etc/redis.conf里面可以把 daemonize no 修改为daemonize yes

    制作一个redis  init.d 的启动脚本:

    复制如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/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

    vim /etc/init.d/redis-server
    chmod o+x /etc/init.d/redis-server
    chkconfig --add redis-server
    /etc/init.d/redis-server start

从服务上redis的配置

    修改 /etc/redis.conf

    slaveof <masterip> <masterport>修改为

  slaveof 172.20.52.72 6379

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

  start redis-server start

    

三、进行主从测试

   主服务器: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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 {
        172.20.52.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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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的脚本

1
2
3
4
5
6
7
8
9
10
mkdir /etc/keepalived/scripts
#!/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

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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 172.20.52.159 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

1
2
3
4
5
6
7
8
9
10
11
#!/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 172.20.52.159 6379 >> $LOGFILE  2>&1

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

vim /etc/keepalived/scripts/redis_master.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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 172.20.52.72   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

1
2
3
4
5
6
7
8
9
10
11
#!/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 172.20.52.72  6379 >> $LOGFILE  2>&1

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

vim /etc/keepalived/scripts/redis_fault.sh

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

vim /etc/keepalived/scripts/redis_stop.sh

1
2
3
4
#!/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 172.20.52.253 INFO

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

role:master

slave0:172.20.52.159,6379,online

尝试插入一些数据:

$ redis-cli -h 172。20.52.253 SET Hello Redis

OK


从VIP读取数据

$ redis-cli -h 172.20.52.253 GET Hello

"Redis"

从Master读取数据

$ redis-cli -h 172.20.52.72 GET Hello

"Redis"

从Slave读取数据

$ redis-cli -h 172.20.52.159 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 2016


同时Slave上的日志显示:

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

[master]

2016年 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 172.20.52.253 INFO

$ redis-cli -h 172.20.52.159 INFO

role:master


然后我们恢复Master的Redis进程

$  /etc/init.d/redis start

查看Master上的Keepalived日志

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

[master]

2016年 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 2016

Being slave....

Run SLAVEOF cmd ...

OK

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




1.问题:刚使用redis-cli -h 172.20.52.253 INFO

说连接失败,没有路由。

此时我的解决办法是iptables -F

2.VIP的添加

ifconfig eth1:0 172.20.52.253 netmask 172.20.52.253 up



本文转自 ping9527 51CTO博客,原文链接:http://blog.51cto.com/babyhanggege/1910105,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CentOS 安装 Redis
CentOS 安装 Redis
40 0
centos7搭建keepalived+LVS+NFS高可用web群集
一、理论部分 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
73 0
CentOS安装Redis
CentOS安装Redis
60 0
CentOS安装Redis单实例
CentOS安装Redis单实例
246 0
Centos6.8 搭建Lvs+Keepalived
  Keepalived   keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。Keepalived是自动完成,不需人工干涉。 简介:   Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
1958 0
centOS上安装redis
1.安装tcl支持 yum install tcl    2.安装redis我们以最新的2.8.9为例 $ wget http://download.redis.io/releases/redis-2.
517 0
CentOS 6.5下Redis安装记录
Redis简介: Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
671 0
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载