keepalived是一种轻量级的高可用软件解决方案,主要功能为监控检查和VRRP冗余协议。基于三层检测,即IP层/TCP层/应用层,当检测到某台服务器的服务出现故障等,会自动剔除有故障的服务,服务恢复正常后自动加入到服务器群中。

  • 环境

192.168.2.118 nginx主/keepalived-master
192.168.2.119 nginx从/keepalived-slave
192.168.2.112 lap


  • keepalived部署

在118服和119服上部署keepalived服务(注意执行权限)

wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz 
tar -zxvf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure
make
make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/

keepalived部署_keepalived

完成预编译后,上图表示开启了VRRP模块


  • keepalived+nginx主备架构

118服的keepalived配置

手动添加配置目录和检测脚本目录

mkdir -p /etc/keepalived
mkdir -p /data/sh/

添加配置文件keepalived.conf

! Configuration File for keepalived
 global_defs {
  notification_email {
      abc@163.com
 }
    notification_email_from abc@163.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
 }

 vrrp_script chk_nginx {
    script  "/data/sh/check_nginx.sh"
    interval 2
    weight 2
 }
 vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     lvs_sync_daemon_inteface eth0
     virtual_router_id 151
     priority 100
     advert_int 5
     nopreempt
     authentication {
         auth_typePASS
         auth_pass  1111

     }
     virtual_ipaddress {
         192.168.2.129
  }
     track_script {
     chk_nginx
    }
 }

常用参数说明:

notification_email      当切换的时候发送通知对象
notification_email_from     发件人
smtp_server         smtp服务地址
smtp_connect_timeout        smtp连接超时时间
router_id           运行keepalived的标识

vrrp_script         检测脚本
script              脚本路径
interval            检测时间间隔
weight              权重

vrrp_instance           vrrp实例
state               主机状态,包括MASTER和BACKUP
virtual_router          路由id
priority            优先级,值越高,主机状态就是MASTER
advert_int          检查间隔
nopreempt           不抢占
authentication          设置认证
auth_type           认证方式
auth_pass           认证密码

virtual_ipaddress       设置VIP
track_script            脚本监控,名称为vrrp_script设置

virtual_server          虚拟服务器定义模块
delay_loop          健康检查时间间隔
lb_algo wrr             调度算法,包括rr/wrr/lc等
lb_kind DR          转发规则,包括NAT/DR/TUN
persistence_timeout     会话保持时间
protocol TCP            采用的协议
real_server         真实ip端口
weight              给每台主机的权重,0代表失效

TCP_CHECK
connect_timeout         连接超时时间
nb_get_retry            重连次数
delay_before_retry      重连时间间隔
connect_port            连接端口

nginx检测脚本check_nginx.sh(注意执行权限chmod u+x check_nginx.sh)

#!/bin/bash
#2017年12月5日21:50:40
#auto check nginx
#by me
###################
killall -0 nginx
if [[ $? -ne 0 ]];then
        /etc/init.d/keepalived stop
fi


在119服上也根据上述操作部署keepalived,在配置文件中,把优先级priority的值改成80

启动keepalived服务

/etc/init.d/keepalived start
或
service keepalived start
modprobe ip_vs           内核加载ipvs模块

查看启动情况

[root@leeclient init.d]# ps -ef | grep keepalived 
root      8212     1  0 22:05 ?        00:00:00 keepalived -D
root      8214  8212  0 22:05 ?        00:00:00 keepalived -D
root      8215  8212  0 22:05 ?        00:00:00 keepalived -D
root      8427  1712  0 22:08 pts/0    00:00:00 grep keepalived
[root@leeclient init.d]#

查看日志

tail -f /var/log/messages

keepalived部署_keepalived_02

表示一开始是backup状态,后来检测到118和119都是backup,然后根据优先级来判断,118服的keepalived升级成master

查看ip状态

ip addr list


keepalived部署_keepalived_03


keepalived部署_服务器_04

浏览器输入VIP:192.168.2.129

keepalived部署_keepalived_05

此时访问nginx是118服的

手动停止118服的nginx服务,再查看日志和ip

pkill nginx
tail -f /var/log/messages
ip addr list

118服的keepalived检测到nginx服务停止后,会执行检测脚本,停止keepalived服务:

keepalived部署_服务器_06

119服可以看到进入了master状态:

keepalived部署_keepalived_07

此时再看ip,则发现nginx切换到了119服上。
118服:
keepalived部署_服务器_08

119服:
keepalived部署_服务器_09

此时继续访问192.168.2.129也可以正常访问web。从而实现了高可用。
再开启118的nginx及keepalived服务后,118的keepalived变成了backup状态,只有119的nginx挂了,才会自动切换到119的nginx上。

当118和119同时设置state为backup,118的priority为100,119的priority为80,并且同时设置为nopreempt,此时谁先启动keepalived,谁就是master,当master挂了后再恢复时状态一直为backup。如果注释掉nopreempt,则在状态同为backup的情况下,谁的优先级高谁就抢占成功成为master。

备注:
1) 在预编译的时候,出现错误configure: error: Popt libraries is required
没有安装popt开发包,执行

yum -y install popt-devel