说明:通过keepalived服务部署,解决nginx服务的单点故障问题。
实现方式:修改KEEPALIVED配置文件即可!
具体操作:如下
n 进入keepalived目录
[root@localhost keepalived]# cd /etc/keepalived/
n 编辑keepalived配置文件
[root@localhost keepalived]# vim keepalived.conf
- MASTER配置文件
! Configuration File for keepalived
#全局定义keepalived发生事件时接收邮件通知的设置;
global_defs {
notification_email {
}
#运行keepalived机器的标识,可设为localhost或其他IP;
router_id localhost
}
#检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_http_port {
script “/opt/chk_nginx.sh” #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级减5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
#keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
state MASTER
#指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
interface em1
# 发送多播数据包时的源IP地址,需要注意:这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
mcast_src_ip 103.110.98.14
#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
virtual_router_id 51
#定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
priority 101
#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
advert_int 1
#设置验证类型和密码。主从必须一样
authentication {
#设置vrrp验证类型,主要有PASS和AH两种
auth_type PASS
#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写(需保证此IP未被使用)
virtual_ipaddress {
103.110.98.20
}
#执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面,否则nginx监控失效!!
track_script {
#引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
chk_http_port
}
}
此时通过 ip a命令查看ip,可查看到新增的vip地址<br /> <br />_**2.Backup 配置文件**_
! Configuration File for keepalived
global_defs {
notification_email {
}
router_id haproxy2
}
vrrp_script chk_http_port {
script “/opt/chk_nginx.sh”
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
#根据本即的网卡修改,可与master不一致
interface eth0
mcast_src_ip 103.110.98.15
#虚拟路由标识,同一vrrp_instance下,MASTER和BACKUP必须是一致的
virtual_router_id 51
#BACKUP优先级需要小于MASTER
priority 98
#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
advert_int 1
#设置验证类型和密码。BACKUP与MASTER必须一样
authentication {
auth_type PASS
auth_pass 1111
}
#VRRP 虚拟地址 如果有多个VIP,继续换行填写(需保证BACKUP 与MASTER配置一致)
virtual_ipaddress {
103.110.98.20
}
track_script {
chk_http_port
}
}
3.脚本检测chk_http_port文件 chk_http_port.sh
!/bin/bash
# check nginx server status
# Nginx服务端口
PORTS=”8090”
function check_ports {
for port in $PORTS;do
nc -z 127.0.0.1 $port | grep -q succeeded
[ “${PIPESTATUS[1]}” -eq 0 ] && mark=${mark}1
done
# 如果mark值为空说明端口都不通。
# 如果mark等于1,说明有端口是通的。
echo $mark
}
ret1=$(check_ports)
# 如果mysql端口不通,会尝试重启一次mysql
if [ “$ret1” != 1 ];then
service nginx stop &
q! #无用命令,只是为了跳出上面的命令
sleep 1
ret2=$(check_ports)
# 如果还是有端口不通,表示mysql服务不正常,则停掉keepalived,使VIP发生切换
[ “$ret2” != 1 ] && /etc/init.d/keepalived stop
fi
两台服务器的配置文件修改完毕后重启服务
service keepalived restart