keepalived+redis部署手册

时间:2024.4.21

一、Redis和Keepalived安装

1、 以下步骤在121和122上均要进行一遍

2、 以root用户登录,

cd /usr/local

2、命令:mkdir ms40 新建ms40目录

3、cd ms40

4、mkdir redis && cd redis && mkdir log && mkdir data然后切回ms40目录

5、mkdir keepalived

6、上传文件redis-2.6.14.tar.gz至redis目录

上传文件keepalived-1.2.7.tar.gz至keepalived目录

7、安装redis

1)cd redis

2)tar zxvf redis-2.6.14.tar.gz

3)cd redis-2.6.14

4)make

5)cd src

6)cp redis-benchmark redis-cli redis-server /usr/bin/

7)切回至ms40目录

8、安装keepalived

1)cd keepalived

2)tar zxvf keepalived-1.2.7.tar.gz

3)yum install popt-devel

4)yum -y install openssl-devel

5)cd keepalived-1.2.7

6)./configure

7)make && make install

二、Keepalived配置

1、 转移keepalived的配置文件

1) cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 2) cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ 3) mkdir /etc/keepalived

4) cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ 5) cp /usr/local/sbin/keepalived /usr/sbin/

三、Mater配置(10.25.174.121)

1、 从附件的Master文件夹中获取scripts文件夹和keepalived.conf覆盖至目录 /etc/keepalived目录下

2、给脚本加上可执行权限:chmod +x /etc/keepalived/scripts/*.sh

3、备份/usr/local/ms40/redis/redis-2.6.14目录下的redis.conf文件

4、从附件的Master文件夹中获取redis.conf文件覆盖至上述目录中

四、Slave配置(10.25.174.122)

1、 从附件的Slave文件夹中获取scripts文件夹和keepalived.conf覆盖至目录 /etc/keepalived目录下

2、给脚本加上可执行权限:chmod +x /etc/keepalived/scripts/*.sh

3、备份/usr/local/ms40/redis/redis-2.6.14目录下的redis.conf文件

4、从附件的Master文件夹中获取redis.conf文件覆盖至上述目录中

五、启动

1、 启动121上的redis

1)cd /

2)cd /usr/local/ms40/redis/redis-2.6.14

3)src/redis-server

2、启动122上的redis

1)cd /

2)cd /usr/local/ms40/redis/redis-2.6.14

3)src/redis-server

3、启动121上的keepalived

1)cd /

2)service keepalived start

4、启动122上的keepalived

1)cd /

2)service keepalived start

六、验证

1、运行-cmd

Ping 10.25.174.200 看是否能够ping通

2、 运行-cmd

telnet 10.25.174.200 6379 是否能通

3、 使用sshclient连接至121或者122,使用root用户

cd /usr/local/ms40/redis/redis-2.6.14

src/redis-cli –h 10.25.174.200

set name “test”

get name

看看结果是否为test

如果是则 del test

六、安装Redis过程中涉及的一些问题

1、GCC的问题

make[2]: cc: Command not found

make[1]: *** [adlist.o] Error 127

make[1]: Leaving directory `/usr/local/redis-2.6.16/src'

make: *** [all] Error 2

原因:没安装gcc,执行命令安装:yum install gcc-c++

2、内存分配器的问题(重视) make[1]: Entering directory `/usr/local/redis-2.6.16/src'

CC adlist.o

In file included from adlist.c:34:

zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory

zmalloc.h:55:2: error: #error "Newer version of jemalloc required"

make[1]: *** [adlist.o] Error 1

make[1]: Leaving directory `/usr/local/redis-2.6.16/src'

make: *** [all] Error 2

原因:查看redis的源码 src/zmalloc.c可以看到如下代码:

#if defined(USE_TCMALLOC)

#define malloc(size) tc_malloc(size)

#define calloc(count,size) tc_calloc(count,size)

#define realloc(ptr,size) tc_realloc(ptr,size)

#define free(ptr) tc_free(ptr)

#elif defined(USE_JEMALLOC)

#define malloc(size) je_malloc(size)

#define calloc(count,size) je_calloc(count,size)

#define realloc(ptr,size) je_realloc(ptr,size)

#define free(ptr) je_free(ptr)

可以看到源码中首先会判断系统中是否存在tcmalloc内存分配器,如果没有,则使用jemalloc内存分配器,如果连jemalloc分配器也没有找到,就会报错了。

本次现网部署Redis后,因为没有jemalloc分配器,导致碎片率达到了1.59,redis的内存占用率也就是实际内存占用的1.59倍,这个数据量是非常恐怖的,对内存资源是个相当大的损耗。

在现网环境的linux系统中,可能没有预先安装Jemalloc分配器,需要手动安装。

1、wget /download/jemalloc/jemalloc-3.2.0.tar.bz2

2、tar jxf jemalloc-3.2.0.tar.bz2(tar.bz2的压缩格式使用 tar jxf 解压)

3、cd jemalloc-3.2.0

4、./configure

5、make && make install

6、ldconfig

过程完成后,在切回到redis-2.6.14目录中,重新执行make命令

当然如果不想使用jemalloc分配器,可以强制使用如下命令来安装redis:

make MALLOC=libc(libc是默认的内存分配器,不过经过验证,碎片率是最高的)

经现网验证:

1) 使用libc内存分配器的话,内存碎片率可以达到1.6左右

2) 但是使用jemalloc,碎片率一般在1.1以内

3) 对于tcmalloc,和jemalloc的结果差不多,但是因为redis暂时还没有集成tcmalloc,

所以需要另外来安装,过程详见:

七、安装Keepalived过程中涉及的一些问题

1、虚拟网卡sit0的问题 Keepalived安装完成后,在启动时报了如下的异常:

Oct 18 00:24:43 localhost Keepalived[6866]: Starting VRRP child process, pid=6868

Oct 18 00:24:43 localhost Keepalived_vrrp[6868]: No such interface, sit0

使用ip a命令查看网卡信息如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:50:56:ba:67:6e brd ff:ff:ff:ff:ff:ff inet 10.25.174.122/24 brd 10.25.174.255 scope global eth0 inet6 fe80::250:56ff:feba:676e/64 scope link valid_lft forever preferred_lft forever

3: sit0: <NOARP> mtu 1480 qdisc noop

link/sit 0.0.0.0 brd 0.0.0.0

网上对于sit0的描述如下:

点了很多网页来解决该问题,后来在朱万骏的帮助下,在/etc/modprobe.conf文件增加如下两行配置:

alias ipv6 off

alias net-pf-10 off

然后reboot重启服务器

2、nc命令的问题

家里测试环境(79.78、79.79)没有nc命令(类似windows下的telnet)

1) wget

2) tar zxvf netcat-0.7.1.tar.gz

3) ./configure

4) make && make install

3、检测脚本的问题

因家里在压测的时候,服务器没有nc命令,所以在检测脚本redis_check.sh中使用的是ping命令来检测redis是否还活着。但是因为在大并发情况下,ping命令会被拥堵,由此可能导致redis主备进行切换

原redis_check.sh:

#!/bin/bash

ALIVE=`/usr/bin/redis-cli PING`

if [ "$ALIVE" == "PONG" ]; then

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

现redis_check.sh:

#!/bin/bash

nc -w 0 127.0.0.1 6379 && exit 0 || exit 1

4、keepalived.conf问题

Keepalived.conf中有运行监测脚本redis_check.sh的配置:

vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.sh" interval 1

}

变量interval 表示执行监测脚本的时间间隔:1秒执行一次确实没有必要。

5秒执行一次即可。


第二篇:通过Keepalived实现Redis Failover自动故障切换功能


通过Keepalived实现Redis Failover自动故障切换功能

详细可参考http://heylinux.com/archives/1942.html

设计思路:

redis 主和 redis从 正常同步;

redis主keepalived 启动,执行redis_master.sh脚本,vip在自己身上;

redis 从keepalived 启动,执行redis_slave.sh脚本;

redis主服务关闭,则redis主执行redis_fault.sh脚本, vip落在redis 从上,redis从执行redis-_master.sh脚本,变成主;

redis主服务开启,则redis主执行redis_slave.sh脚本变成从,vip还在redis 从上,还是主; redis从服务关闭,则redis从执行redis_fault.sh脚本, vip落在redis主上,redis主执行redis-_master.sh脚本,变成主;

redis从服务开启,则redis从执行redis_slave.sh脚本变成从, vip还在redis主上,redis主继续做主,此时为redis初试主从状态;

环境:

192.168.1.235 redis

192.168.1.236 redis-slave

192.168.1.237 vip

一:安装keepalived

(redis和redis-slave两台服务器都安装)

yum -y install ipvsadm

wget /software/keepalived-1.2.2.tar.gz

tar -zxvf keepalived-1.2.2.tar.gz

cd keepalived-1.2.2

./configure

configure时若出现以下结果:

不推荐使用yum install -y kernel-devel安装 安装完成后建立一下链接在配置:

ln -s /usr/src/kernels/2.6.18-194.el5-i686/ /usr/src/linux/

上述过程完毕后,在进行configure:

make

make install

cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

chmod 755 /etc/init.d/keepalived

cp /usr/local/sbin/keepalived /usr/sbin/

cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#运行 由于keepalived配置文件不是在启动时一次性加载并读取完成的,所以必须是完整路径,可以根据log判断是否加载了正确的配置文件

keepalived –f /usr/local/etc/keepalived/keepalived.conf

运行过程可以查看log:

tail -f /var/log/message

通过Keepalived实现RedisFailover自动故障切换功能

通过Keepalived实现RedisFailover自动故障切换功能

二:安装redis

(redis和redis-slave两台服务器都安装)

tar -zxvf redis-2.4.17.tar.gz

cd redis-2.4.17

./configure

make

make install

redis-slve只需注意一点

[root@redis bin]# pwd

/usr/local/bin

[root@redis bin]# vim redis.conf

116 slaveof 192.168.1.235 6379

三:通过Keepalived实现Redis Failover自动故障切换

修改Master和Slave的/etc/hosts文件

[root@redis rc.d]# cat /etc/hosts

192.168.1.235 redis

192.168.1.236 redis-slave

Master上是

[root@redis rc.d]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=redis

Slave上是

[root@redis-slave linux]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=redis-slave

修改完主机名重启机器生效

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建: 首先,在Master上创建如下配置文件:

[root@redis linux]# vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

xiesongmeng@xlhtol.com

}

notification_email_from keepalived@redis

router_id redis

}

vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.sh" interval 1

}

vrrp_instance mes_Redis {

state MASTER

interface eth0

garp_master_delay 10

smtp_alert

virtual_router_id 3

priority 100

nopreempt

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.237

}

track_script {

chk_redis

}

notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_slave.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh }

然后,在Slave上创建如下配置文件:

[root@redis-slave linux]# vim /etc/keepalived/keepalived.conf global_defs {

notification_email {

xiesongmeng@xlhtol.com

}

notification_email_from keepalived@redis-slave router_id redis-salve

}

vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.sh" interval 1

}

vrrp_instance mes_Redis {

state BACKUP

interface eth0

garp_master_delay 10

smtp_alert

virtual_router_id 3

priority 90

nopreempt

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.237

}

track_script {

chk_redis

}

notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_slave.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh }

在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

编写以下负责运作的关键脚本:

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_slave.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

首先,在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.236 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_slave.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.236 6379 >> $LOGFILE 2>&1

接着,在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.235 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_slave.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.235 6379 >> $LOGFILE 2>&1

然后在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

在Master与Slave给脚本都加上可执行权限:

chmod +x /etc/keepalived/scripts/*.sh

脚本创建完成以后,我们开始按照如下流程进行测试:

1.启动Master上的Redis

[root@redis bin]# pwd

/usr/local/bin

[root@redis bin]# ./redis-server redis.conf

2.启动Slave上的Redis

[root@redis bin]# pwd

/usr/local/bin

[root@redis bin]# ./redis-server redis.conf

3.启动Master上的Keepalived

/etc/init.d/keepalived start

4.启动Slave上的Keepalived

/etc/init.d/keepalived start

5.尝试通过VIP连接Redis:

[root@redis bin]#pwd

/usr/local/bin

[root@redis bin]# ./redis-cli -h 192.168.1.237 info

role:master

slave0:192.168.1.236,6379,online

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

6.尝试插入一些数据:

[root@redis bin]# ./redis-cli -h 192.168.1.237 SET Hello Redis 从VIP读取数据

[root@redis bin]# ./redis-cli -h 192.168.1.237 GET Hello "Redis"

从Master读取数据

[root@redis bin]# ./redis-cli -h 192.168.1.235 GET Hello

"Redis"

从Slave读取数据

[root@redis-slave bin]# ./redis-cli -h 192.168.1.235 GET Hello

"Redis"

下面,模拟故障产生:

将Master上的Redis进程杀死:

[root@redis bin]# ./redis-cli shutdown

查看Master上的Keepalived日志

[root@redis scripts]# tail /var/log/keepalived-redis-state.log

[fault]

Thu Sep 27 08:29:01 CST 2012

同时Slave上的日志显示:

[root@redis-slave scripts]# tail /var/log/keepalived-redis-state.log

[master]

Thu Nov 15 12:06:04 CST 2012

Being master....

Run SLAVEOF cmd ...

OK

Run SLAVEOF NO ONE cmd ...

OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。 ./redis-cli -h 192.168.1.237 info

./redis-cli -h 192.168.1.236 info

role:master

然后我们恢复Master的Redis进程

主变成slave

然后把236redis停掉

235恢复主的角色,在把236redis开启

恢复235是主,236是备

自动切换成功!

更多相关推荐:
怎样写好research proposal(中文)

大多数学生和刚起步的研究者都不了解什么是研究计划也不知道其重要性简单的说一个人研究计划的好坏决定了其研究的好坏一个构思欠佳的研究计划会毁了整个项目即使它勉强通过了论文答辩委员会另一方面一个高质量的研究计划不仅确...

research proposal

DevelopingResearchProposalsHandoutPreparedbyTedZornUniversityofWaikatoThisisahandoutIoftengivetostudentswhenIexpect...

research proposal范文

Researchproposal1TitleCormacMcCarthysTheRoadandAmericanModernEschatologyOrModernEschatologyofthe21stcentu...

怎样写好research proposal

每个学术研究者必须经历的一道关卡就是ResearchProposal的写作它大致对应中文里的开题报告选题报告研究报告是一项研究开始之前的提纲规划和陈述既是为了帮助自己梳理文献整理思路廓清方向也常常是写给相关他人...

申请文书Research proposal怎么写

申请文书Researchproposal怎么写首先先讨论最常见的SOP无论申请什么学校一定都会要求SOP这份文件通常分以下几个部份大学时期修过课程大学时期研究硕班时期修过课程硕班时期研究课外活动打工或经验毕业后...

怎样写一篇好的research proposal

怎样写一篇好的researchproposal每个学术研究者必须经历的一道关卡就是ResearchProposal的写作它大致对应中文里的开题报告选题报告研究报告是一项研究开始之前的提纲规划和陈述既是为了帮助自...

CSC research proposal格式参考

国家建设高水平大学公派研究生项目研修计划ResearchPlanforCSCScholarshipProgram国家建设高水平大学公派研究生项目研修计划ResearchPlanforCSCScholarship...

informal memo proposal 非正式的建议

InformalMemoProposalDate19thMarch20xxFromRebeccaToYantaiMunicipalGovernmentSubjectMorePublicLibrariesShouldBeBuilti...

bec proposal范文

May2120xxDearMrMichaelJamesReApplicationforMostImprovedOrganisationAwardIamwritingtoapplyfortheMostImprovedAwardwhi...

Design of the research proposal留学学习计划书(英文版哦!)

TherearekeyelementswhendesigningaresearchproposalAsuggestedtemplatewrittenbytheHullandEastYorkshireHospitalsNHSTrus...

format of a research paper introduction论文的标准格式

WritingaResearchPaperIntroductionAstepbystepreferenceTheintroductionisthefirstchapterofaItstartsfromtheresearchprop...

Paper Proposal0

PaperProposalEngineeringIntroductiontomechanicalEngineeringTABLEOFCONTENTSEXECUTIVESUMMARY错误未定义书签12INTROD...

research proposal(23篇)