一、keepalived高可用环境搭建

1、安装keepalived软件

参考资料

在/usr目录下新建software目录

cd /usr

mkdir software

cd software

下载keepalived软件到sortware目录下

解压该软件,出现目录keepalived-2.0.6

cd keepalived-2.0.6

安装软件包

yum install -y openssl openssl-devel

然后在该目录下编译

./configure –prefix=/usr/wt/keepalived #解压到指定的目录下/usr/wt/keepalived

然后继续make && make install

如果出现* WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

安装yum -y install libnl libnl-devel

如果出现configure: error: libnfnetlink headers missing

安装yum install -y libnfnetlink-devel

没有错误和警告后,在该目录继续执行make && make install,安装完毕。

2、制作keepalived的服务命令

将/usr/software/keepalived-2.0.6/keepalived/etc/init.d/目录下的keepalived文件,拷贝到/etc/init.d/

cp /usr/software/keepalived-2.0.6/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/software/keepalived-2.0.6/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
/etx目录下新建keepalived目录,将/usr/wt/keepalived/etc/keepalived/目录下的keepalived.conf文件拷贝到/etc/keepalived/
cp /usr/wt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/wt/keepalived/sbin/keepalived /usr/sbin/

完成之后,可以直接使用service命令:

service keepalived start #开启keepalived软件

service keepalived stop #关闭keepalived软件

相关的日志信息,可以从/var/log/messages文件中查看启动的相关信息

3、修改配置文件keepalived.conf

修改配置文件/etc/keepalived/keepalived.conf,记得使用vim进行编辑,在windows操作下,可能出错

主节点配置文件

! Configuration File for keepalived
global_defs { 
 router_id rocketmq-nameserver1 
 }vrrp_script chk_nginx { 
 script “/etc/keepalived/nginx_check.sh” 
 interval 2 
 weight -20 
 }vrrp_instance VI_1 { 
 state MASTER 
 interface eth0 
 virtual_router_id 50 
 mcast_src_ip 192.168.2.50 
 priority 100 
 advert_int 1 
 authentication { 
 auth_type PASS 
 auth_pass wtroot 
 } 
 track_script { 
 chk_nginx 
 } 
 virtual_ipaddress { 
 192.168.2.10 
 } 
 }备用节点配置文件
! Configuration File for keepalived
global_defs { 
 router_id rocketmq-nameserver2 
 }vrrp_script chk_nginx { 
 script “/etc/keepalived/nginx_check.sh” 
 interval 2 
 weight -20 
 }vrrp_instance VI_1 { 
 state BACKUP 
 interface eth0 
 virtual_router_id 50 
 mcast_src_ip 192.168.2.51 
 priority 90 
 advert_int 1 
 nopreempt 
 authentication { 
 auth_type PASS 
 auth_pass wtroot 
 } 
 track_script { 
 chk_nginx 
 } 
 virtual_ipaddress { 
 192.168.2.10 
 } 
 }

解释

! Configuration File for keepalived
global_defs { 
 router_id rocketmq-nameserver1 #填入电脑的主机名称,可以通过输入指令hostname,查看主机名 
 }vrrp_script chk_nginx { 
 script “/etc/keepalived/nginx_check.sh” #检查nginx的脚本路径 
 interval 2 #每隔2s执行脚本一次 
 weight -20 #权重,每次执行成功,权重减去20 
 }vrrp_instance VI_1 { 
 state MASTER # 主节点,备用节点为BACKUP 
 interface eth0 # 物理机使用的网卡;可以通过ifconfig查看网卡名称 
 virtual_router_id 50 #同一个主从节点的标志,比如该主节点填入50,那么BACKUP节点也要是50 
 mcast_src_ip 192.168.2.50 #真实的物理机ip地址 
 priority 100 #优先级,要设置的比备用节点的优先级高 
 advert_int 1 #MASTER节点与BACKUP节点同步检查的时间间隔为1s 
 nopreempt # nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高 
 authentication { 
 auth_type PASS #密码认证,主从节点需要设置的一样 
 auth_pass wtroot 
 } 
 track_script { 
 chk_nginx #调用上面的脚本,名称与上面对应 
 } 
 virtual_ipaddress { 
 192.168.2.10 #虚拟的ip地址,主从一致 
 } 
 }

首先nopreempt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。

配置文件参考资料

4、与nginx配和使用的脚本
nginx_check.sh
!/bin/bash
A=ps -C nginx --no-header |wc -l 
 if [ $A -eq 0 ];then 
 /usr/wt/nginx/sbin/nginx 
 sleep 2 
 B=ps -C nginx --no-header |wc -l 
 if [ $B -eq 0 ];then 
 killall keepalived 
 fi 
 fi解释
!/bin/bash
A=ps -C nginx --no-header |wc -l #查看nginx的进程数 
 if [ $A -eq 0 ];then #如果等于0,启动nginx,nginx的启动目录/usr/wt/nginx/sbin/nginx 
 /usr/wt/nginx/sbin/nginx 
 sleep 2 #睡眠2s 
 B=ps -C nginx --no-header |wc -l 
 if [ $B -eq 0 ];then #nginx如果还是没有启动成功,将keepalived程序关闭 
 killall keepalived 
 fi 
 fi
注意:脚本需要用vi进行创建:vi nginx_check.sh;脚本写完之后,使用 sh nginx_check.sh命令,实现脚本执行是否成功;

如果出现解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi’错误的问题

我们可以查看该脚本文件的格式,方法是使用命令:vim nginx_check.sh进入编辑文件界

直接输入”:”,然后在”:”之后输入”set ff”,回车即可看到脚本格式,如下图所示,可以看到当前脚本格式是dos。

我们需要把格式改为unix,方法是输入”:set ff=unix”,也可以输入”:set fileformat=unix”

错误详细参考资料

5、常见错误

1) WARNING - script ‘/etc/keepalived/nginx_check.sh’ is not executable for uid:gid 0:0 - disabling.

/etc/keepalived/nginx_check.sh 文件需要授权,不然不能执行:
chmod 777 nginx_check.sh
2)SECURITY VIOLATION - scripts are being executed but script_security not enabled. 
 Unsafe permissions found for script ‘/etc/keepalived/nginx_check.sh’.

出现这种错误,没有问题,可以不用管

3)Error exec-ing command ‘/etc/keepalived/nginx_check.sh’, error 2: No such file or directory

出现这种问题,就是脚本文件的格式有问题,采用上面的解决办法

4)可以将2个节点都设置为BACKUP,然后都加上nopreempt(不抢占),只依靠谁的优先级高,就使用谁的

5)如果发现,nginx服务挂掉,节点不能切换,可以排除下ps -ef |grep keepalived 是否真的已经杀死了,如果没有杀死,可以将sleep的时间设置的小一点