Keepalived
版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin
一、Keepalived( 地址漂移技术 )
单点故障: 一个功能(业务),服务器只有1台(极其凶险)
高可用: HA(High Available) 给单点设备做一个备份(时刻可以使用) 一主一备
1.什么是高可用
一般是指2台机器启动着相同的业务系统,当有一台机器down机了, 另外一台 服务器能快速的接管, 对于访问的用户是无感知的。
2.高可用通常使用什么软件?
通常服务高可用我们选择使用keepalived软件实现
keepalived 传送门
heartbeat ❤
3.keepalived 如何实现高可用的?
keepalived软件是基于VRRP议实现的。VRRP拟路由冗余协议,主要用于解决单点故障问题
4.那VRRP是如何诞生的,VRRP的原理又是什么?
Keepalived高可用对之间是通过VRRP协议通信的,因此,我从VRRP协议 介绍开始给您讲起:
1、VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟 路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3、VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用 对之间通信的。
4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包 的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优 先级竞选,但一般Keepalived系统运维工作中都是一对。
5、VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明 文的方式配置认证类型和密码。
1、比如公司的网络是通过网关转换进行上网的,那如果该路由器故障了,网关 无法转发报文了,此时所有人都将无法上网,这么时候怎么办呢?*
2、通常做法是给路由增加一台备节点,但问题来了?如果我们的主网关master 故障了,用户是需要手动修改网关指向Backup,如果用户过多修改起来会非 常的麻烦。
3、第一个问题: 假设用户将指向都修改到Backup路由器,那么Master路由器 如果修复好了又该怎么办?
4、第二个问题: 假设Master网关故障,我们将Backup网关配置为Master网 关IP行不行?
5、其实上不行,因为PC第一次是通过ARP广播寻找到Master网关的Mac地址与 IP地址,PC则会将Master网关的对应IP与MAC地址写入ARP缓存表中,那么 PC第二次则会直接读取ARP缓存表中的MAC地址与IP地址,然后进行数据包的 转发。此时PC转发的数据包还是会教给Master。(除非PC的ARP缓存表过 期,在次发起ARP广播的时候才能正确获取Bakcup的Mac地址与对应的IP地 址。)*
高可用核心概念总结
1.如何确定谁是主节点谁是备节点。(投票选举?优先级?配置文件中设 置)
2.如果Master故障,Backup自动接管,那Master恢复后会夺权吗?(抢占式、非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题?(都认为对方挂了) (脑裂)
二、环境准备与安装
可用安装配置
状态 | IP | 角色 | 主机名 |
---|---|---|---|
节点1 | 10.0.0.5 | Master | Lb01 |
节点2 | 10.0.0.6 | Backup | Lb02(nginx) |
VIP | 10.0.0.3 |
2.1.在master与backup上分别安装 keepalived
lb01 ~]# yum install keepalived -y
lb02 ~]# yum install keepalived -y
2.2.编写配置文件
lb01 ~]# vim / 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
}
}
#启动服务并加入开机自启
lb01 ~]# systemctl start keepalived.service
lb01 ~]# systemctl enable keepalived.service
#Backup配置
lb02 ~]# vim / 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
}
}
#启动服务并加入开机自启
lb02 ~]# systemctl start keepalived.service
lb02 ~]# systemctl enable keepalived.service
2.3.##通过命名行看到lb01上会多出一个10.0.0.3的VIP地址。
通过arp表看到10.0.0.3与10.0.0.5的mac地址一样
2.3.1keepalived高可用的地址漂移测试
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
三、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###非抢占
}
四、 keepalived 监控nginx 高可用
keepalived 只在keepalived服务关闭或断网,服务器宕机,才会进行主备切换.要使用keepalived监控某个服务,需要书写监控脚本,然后keepalived 定时执行脚本.
#监控脚本思路:
##1. 检查nginx进程/端口是否存在
##2. 如果没有,就把keepaliived 关闭
#1 . 测试命令
Ps -ef|grep nginx |wc -l
#2. 书写脚本
[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
#测试
[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
#检查脚本升级: 给nginx一次机会,启动一次看看
#监控脚本思路:
##1. 检查nginx进程/端口是否存在
#1) 如果不存在,则重启nginx
#2) 等待2-3秒
#3) 再次检查nginx进程/端口 是否存在
#a 仍然不存在
#b.就把keepaliived 关闭
[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
#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 #<==触发检查
}
}
五、keepalived高可用故障脑裂
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用 服务器又都还活着。
1.服务器网线松动等网络故障
2.服务器硬件故障发生损坏现象而崩溃
3.主备都开启firewalld防火墙
脑裂的时候是什么样子的:
有vip地址
ping通 master_ip
curl /wget
#脑裂检查脚本思路
#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
测试
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137205.html