环境: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.72node1" >> /etc/hosts
echo " 172.20.52.159 node2" >> /etc/hosts

二、在Master和slave上安装Redis

tar -zxvfredis-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 的启动脚本:

复制如下代码:

#!/usr/bin/envbash
#
#redisstartuptheredisserverdaemon
#
#chkconfig:3459999
#description:redisservicein/etc/init.d/redis\
#chkconfig--addredisorchkconfig--listredis\
#serviceredisstartorserviceredisstop
#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"
#makesuresomedirexist
if[!-d/var/lib/redis];then
mkdir-p/var/lib/redis
mkdir-p/var/log/redis
fi

case"$1"in
status)
ps-A|grepredis
;;
start)
if[-f$PIDFILE]
then
echo"$PIDFILEexists,processisalreadyrunningorcrashed"
else
echo"StartingRedisserver..."
$EXEC$CONF
fi
if["$?"="0"]
then
echo"Redisisrunning..."
fi
;;
stop)
if[!-f$PIDFILE]
then
echo"$PIDFILEdoesnotexist,processisnotrunning"
else
PID=$(cat$PIDFILE)
echo"Stopping..."
$REdis_CLI-p$REdisPORTSHUTDOWN
while[-x${PIDFILE}]
do
echo"WaitingforRedistoshutdown..."
sleep1
done
echo"Redisstopped"
fi
;;
restart|force-reload)
${0}stop
${0}start
;;
*)
echo"Usage:/etc/init.d/redis{start|stop|restart|force-reload}">&2
exit1
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

vrrp_scriptchk_redis{
script"/etc/keepalived/scripts/redis_check.sh"###监控脚本
interval2###监控时间
}

vrrp_instanceVI_1{
stateMASTER###设置为MASTER
interfaceeth1###监控网卡
virtual_router_id51
priority100###权重值
authentication{
auth_typePASS###加密
auth_pass1111###密码
}

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

vrrp_scriptchk_redis{
script"/etc/keepalived/scripts/redis_check.sh"###监控脚本
interval2###监控时间
}

vrrp_instanceVI_1{
stateBACKUP###设置为BACKUP
interfaceeth1###监控网卡
virtual_router_id51
priority10###比MASTRE权重值低
authentication{
auth_typePASS
auth_pass1111###密码与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
#!/bin/bash
ALIVE=`/usr/local/bin/redis-cliPING`
if["$ALIVE"=="PONG"];then
echo$ALIVE
exit0
else
echo$ALIVE
exit1
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"Beingmaster....">>$LOGFILE2>&1

echo"RunSLAVEOFcmd...">>$LOGFILE
$REdisCLISLAVEOF172.20.52.1596379>>$LOGFILE2>&1
sleep10#延迟10秒以后待数据同步完成后再取消同步状态

echo"RunSLAVEOFNOONEcmd...">>$LOGFILE
$REdisCLISLAVEOFNOONE>>$LOGFILE2>&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"Beingslave....">>$LOGFILE2>&1

sleep15#延迟15秒待数据被对方同步完成之后再切换主从角色
echo"RunSLAVEOFcmd...">>$LOGFILE
$REdisCLISLAVEOF172.20.52.1596379>>$LOGFILE2>&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"Beingmaster....">>$LOGFILE2>&1

echo"RunSLAVEOFcmd...">>$LOGFILE
$REdisCLISLAVEOF172.20.52.726379>>$LOGFILE2>&1
sleep10#延迟10秒以后待数据同步完成后再取消同步状态

echo"RunSLAVEOFNOONEcmd...">>$LOGFILE
$REdisCLISLAVEOFNOONE>>$LOGFILE2>&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"Beingslave....">>$LOGFILE2>&1

sleep15#延迟15秒待数据被对方同步完成之后再切换主从角色
echo"RunSLAVEOFcmd...">>$LOGFILE
$REdisCLISLAVEOF172.20.52.726379>>$LOGFILE2>&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 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

从Slave读取数据

$ redis-cli -h 172.20.52.159 GET Hello


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上的日志显示:

[master]

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

Being master....

Run SLAVEOF cmd ...

OK Already connected to specified master

Run SLAVEOF NO ONE cmd ...

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

$ redis-cli -h 172.20.52.159 INFO

然后我们恢复Master的Redis进程

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

[backup]

Fri Sep 28 14:16:37 CST 2016

Being slave....

发现目前的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

centos6上redis+Keepalived实现Redis主从复制的更多相关文章

  1. android – 使用Camera2 API从服务录制视频

    我在一些我无法测试的手机上遇到问题(这是第一个问题)我正在尝试构建一个可以从camera2API录制的服务.但是,当我将应用程序发送到后台时,在某些手机上似乎存在我目前无法解决的问题.我只有日志,无法弄清楚应用程序无法正常工作的主要原因.由于该类太大而无法在此处显示为代码,因此您可以在此处找到它:https://github.com/Astyan42/RecordingService/blob/m

  2. 离子运行android似乎工作,但该应用程序没有在手机上启动,为什么?

    我的手机处于打开状态,处于调试模式,我已通过adbdevices-l确认了这一点.当我运行离子运行android时,我得到Ionic声称应用程序启动时的输出,但手机上没有任何反应.我使用Android4.4.4的Nexus5.androidapp中的index.html:解决方法键入离子信息并检查已安装的Cordova版本.如果你有v5.0.0现在需要一个新的插件,否则所有的http请求都被阻止.

  3. android – 从AOSP master切换到froyo

    我刚用回购检查了主人.现在我想切换到froyo.如果不再下载一堆东西我怎么能这样做?我不想再次下载一堆东西,我只是希望能够在分支之间自由移动,就像在普通的gitclone中一样.解决方法由于您使用repo下载了所有内容,因此您可以轻松地使用repo在分支之间切换而无需再次下载所有内容:repoinit-bfroyo;回购同步这将只下载切换分支所需的文件,就像使用git在分支之间移动一样.

  4. MvvmCross:从android中的MvxListView获取所选项目的最佳方法是什么?

    我正在使用MvvmCrossv3.06,我在android中定义了一个绑定到列表的MvxListView.我可以看到列表,但无法确定获取单击它时所选项目的最佳方法.目前我在活动的OnCreate中执行以下操作,但它不是特别是MVVM,我想知道是否有更好的方法通过绑定?

  5. 布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法

    这篇文章主要介绍了布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  6. springboot+redis实现简单的热搜功能

    这篇文章主要介绍了springboot+redis实现一个简单的热搜功能,通过代码介绍了过滤不雅文字的过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. Java利用redis zset实现延时任务详解

    zset作为redis的有序集合数据结构存在,排序的依据就是score。本文就将利用zset score这个排序的这个特性,来实现延时任务,感兴趣的可以了解一下

  8. SpringBoot+Redis+Lua分布式限流的实现

    本文主要介绍了SpringBoot+Redis+Lua分布式限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. Yii2框架redis基本应用示例

    这篇文章主要介绍了Yii2框架redis基本应用,结合实例形式分析了Yii2 redis扩展包的安装、配置及基本数据操作相关技巧,需要的朋友可以参考下

  10. redis+php实现微博(二)发布与关注功能详解

    这篇文章主要介绍了redis+php实现微博发布与关注功能,结合实例形式分析了php结合redis实现微博的发布及关注相关操作技巧,需要的朋友可以参考下

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部