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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

环境: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,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 负载均衡 NoSQL
Redis之主从复制
【1月更文挑战第8天】主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(masterleader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。 默认情况下,每台Redis服务器都是主节点; 且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
178 3
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis高可用之主从复制架构(第一部分)
Redis高可用之主从复制架构(第一部分)
|
4月前
|
监控 NoSQL 容灾
【Redis】主从复制
【Redis】主从复制
|
2月前
|
存储 NoSQL Linux
centos7部署redis以及多实例
centos7部署redis以及多实例
54 0
|
4月前
|
监控 NoSQL Redis
Redis - 主从复制那些事与高可用sentinel
Redis - 主从复制那些事与高可用sentinel
36 0
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
|
1月前
|
负载均衡 NoSQL 容灾
|
2月前
|
NoSQL Linux Redis
基于centos7.7编译Redis6.0
基于centos7.7 源码编译redis-6.0.6记录
55 2
|
2月前
|
NoSQL 应用服务中间件 Linux
CentOS7搭建MySQL+Redis+MongoDB+FastDF
CentOS7搭建MySQL+Redis+MongoDB+FastDF
138 0
|
3月前
|
NoSQL Linux 网络安全
解决在Linux中进行redis的主从复制时出现的从机可以获取到主机的信息,主机获取不到从机的信息~
解决在Linux中进行redis的主从复制时出现的从机可以获取到主机的信息,主机获取不到从机的信息~

热门文章

最新文章