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/
完成预编译后,上图表示开启了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
表示一开始是backup状态,后来检测到118和119都是backup,然后根据优先级来判断,118服的keepalived升级成master
查看ip状态
ip addr list
主
从
浏览器输入VIP:192.168.2.129
此时访问nginx是118服的
手动停止118服的nginx服务,再查看日志和ip
pkill nginx
tail -f /var/log/messages
ip addr list
118服的keepalived检测到nginx服务停止后,会执行检测脚本,停止keepalived服务:
119服可以看到进入了master状态:
此时再看ip,则发现nginx切换到了119服上。
118服:
119服:
此时继续访问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