博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
centos6上redis+Keepalived实现Redis主从复制
阅读量:6280 次
发布时间:2019-06-22

本文共 8963 字,大约阅读时间需要 29 分钟。

环境: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

     下载地址

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

你可能感兴趣的文章
python def说明
查看>>
实验四
查看>>
关于上、下拉电阻的总结整理
查看>>
STL--map学习笔记
查看>>
gogo learning
查看>>
软件工程概论作业2
查看>>
利用Boost影响Lucene查询结果的排序
查看>>
Spring boot(四)Spring Boot 集成 MyBatis
查看>>
BZOJ4502串——AC自动机(fail树)
查看>>
[Codeforces757G]Can Bash Save the Day?——动态点分治(可持久化点分树)
查看>>
BZOJ2521[Shoi2010]最小生成树——最小割
查看>>
BZOJ1861[Zjoi2006]书架——非旋转treap
查看>>
【转】delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)
查看>>
lombok安装和使用
查看>>
debian var目录
查看>>
项目功能积累
查看>>
邻接表(有向图)
查看>>
字的传送
查看>>
H3C路由交换设备配置的备份与恢复
查看>>
面试题 16:反转链表
查看>>