13.keepalived实现nginx高可用
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.Keepalived高可用基本概述
1.什么是高可用
一般是指2台机器启动着相同的业务系统,当有一台机器down机了, 另外一台 服务器能快速的接管, 对于访问的用户是无感知的。
2.keepalived是如何实现高可用的?
keepalived软件是基于VRRP协议实现的。VRRP虚拟路由冗余协议,主要用 于解决单点故障问题
3.高可用核心概念
1.如何确定谁是主节点谁是备节点。(投票选举?优先级?配置文件中设置)
2.如果Master故障,Backup自动接管,那Master恢复后会夺权吗?(抢占式、非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题? (都认为对方挂了) (脑裂)
2.Keepalived高可用安装配置
1.实践环境,配置实现虚IP转移
状态 | Ip | 角色 | 主机名 |
节点1 | 10.0.0.5 | Master | Lb01 |
节点2 | 10.0.0.6 | Backup | Lb02 |
Vip | 10.0.0.3 |
2.在master与backup上分别安装 keepalived,并进行配置
[root@lb01 ~]# yum install keepalived -y
[root@lb02 ~]# yum install keepalived -y
###lb02配置
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
#lb01配置
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}

3.配置文件详解
global_defs #全局定义部分
vrrp_instance #vrrp实例 这里面配置vip 主/备 优先级 id号等等
virtual_server #lvs专用 keepalived for lvs 暂不使用
#global_defs 全局定义部分
global_defs {
router_id lb01 #每个keepalived软件名字 在同一个局域网中 唯一即可.
}
#vrrp实例设置部分
vrrp_instance 实例名字 { #实例名字 在同一个配置文件中唯一. 在同一组主备之间,名字一致
state MASTER # 状态(大写) MASTER/BACKUP
interface eth0 #指定网卡
virtual_router_id 51 #同一组 主备之间 id保持一致#在同一个keepalived配置文件中 保持 唯一
priority 100 #优先级 主备之间 差50即可.主 100 备 50
advert_int 1 #advert interval 心跳间隔
authentication { #认证模式 推荐使用PASS简单密码认证 即可.
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #vip 虚拟ip地址
10.0.0.3/24 dev eth0 label eth0:0
}
}
3.Keepalived高可用地址漂移
1.在Master上进行如下操作
# 先确认Master存在vip地址
[root@lb01 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
# 停止Master上的keepalived, 检测vip已不存在
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr |grep 10.0.0.3
2.在Backup上进行如下操作
#主节点停止后,备节点无需任何操作发现地址已经漂移至Backup端
[root@lb02 ~]# ip addr|grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
3.此时重新启动Master上的Keepalived,会发现VIP被强行抢占
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
4.Keepalived高可用非抢占式
通常master服务故障后backup会变成master,但是当master服务又恢复的 时候,master会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说并 不是太友好,此时我们可以配置keepalived为非抢占式(前提两台主机的硬件 配置信息一致)
配置非抢占式步骤如下
1.两个节点的state都必须配置为BACKUP(官方建议)
2.两个节点都在vrrp_instance中添加nopreempt参数
3.其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为 BACKUP,唯一的区分就是优先级。
#当高优先级机器联机时,VRRP通常会抢占低优先级机器。
#“nopreempt”允许低优先级机器维护主角色,即使高优先级机器重新联机。
#注意:要使其工作,此项的初始状态必须是BACKUP。
具体配置参考如下
#Master
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt###非抢占
}
#Backup
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt###非抢占
}
5.keepalived监控nginx 高可用
keepalived 只在keepalived服务关闭或断网,服务器宕机,才会进行主备切换.要使用keepalived监控某个服务,需要书写监控脚本,然后keepalived 定时执行脚本.
监控脚本思路:
1.检查nginx进程/端口是否存在
2.如果没有,就把keepaliived 关闭
1.书写脚本
[root@lb01 ~]# cat /server/scripts/chk_lb.sh
#!/bin/bash
proc_cnt=`ps -C nginx --no-heading |wc -l`
if [ $proc_cnt -eq 0 ];then
systemctl stop keepalived
fi
2.测试脚本执行
[root@lb01 ~]# systemctl is-active nginx keepalived.service
active
active
[root@lb01 ~]# pkill nginx
[root@lb01 ~]# systemctl is-active nginx keepalived.service
failed
active
[root@lb01 ~]# sh /server/scripts/chk_lb.sh
[root@lb01 ~]# systemctl is-active nginx keepalived.service
failed
failed
检查脚本升级: 给nginx一次机会,启动一次看看
监控脚本思路:
检查nginx进程/端口是否存在
1) 如果不存在,则重启nginx
2) 等待2-3秒
3) 再次检查nginx进程/端口 是否存在
a 仍然不存在
b.就把keepaliived 关闭
3.书写升级后的脚本
[root@lb01 ~]# cat /server/scripts/chk_lb-v2.sh
#!/bin/bash
#第1次检查脚本状态
proc_cnt=`ps -C nginx --no-heading |wc -l`
if [ $proc_cnt -eq 0 ];then
systemctl start nginx
sleep 3
#等待3秒后,再次检查nginx状态
proc_cnt=`ps -C nginx --no-heading |wc -l`
if [ $proc_cnt -eq 0 ];then
systemctl stop keepalived
fi
fi
4.keep执行监控脚本
[root@lb01 script]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_script chk_lb { #<==定义vrrp脚本,检 测HTTP端口
script "/server/scripts/chk_lb.sh" #<==执行脚本,当nginx 服务有问题,就停掉keepalived服务。
interval 2 #<==间隔2秒
weight 2 ####权重,可以不加
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script { #指定vrrp实例使用的监控脚本
chk_lb #<==触发检查
}
}
6.keepalived高可用故障脑裂
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用 服务器又都还活着。
1.服务器网线松动等网络故障
2.服务器硬件故障发生损坏现象而崩溃
3.主备都开启firewalld防火墙
但是脑裂并不影响web服务因为是无状态的,但是数据库服务用keepalived做高可用发生了脑裂会产生影响
1.keepalived脑裂演示
#lb01和lb02都开启防火墙
[root@lb01 ~]# systemctl start firewalld
[root@lb02 ~]# systemctl start firewalld
#lb01和lb02都放行http和https协议,这是为了让用户能正常访问网站
[root@lb01 ~]# firewall-cmd --add-service={http,https}
[root@lb02 ~]# firewall-cmd --add-service={http,https}
#lb01和lb02检查是否有vip
[root@lb01 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
[root@lb02 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
2.脑裂检查脚本思路
1.检查备节点是否有vip
2.检查备节点是否可以ping通 主节点
1和2同时成立 脑裂
脚本如下
[root@lb02 ~]# cat /server/scripts/chk_break_brain.sh
#!/bin/bash
vip=10.0.0.3
master_ip=10.0.0.5
while true
do
vip_cnt=`ip a |grep $vip -w|wc -l`
#使用ping检查指定ip是否可以访问
ping -c1 -W1 $master_ip &>/dev/null
if [ $? -eq 0 -a $vip_cnt 1 ] ; then
echo 发生脑裂;
else
echo 一切正常
fi
sleep 3
done
评论已关闭