keepalived
原理
keepalived是基于VRRP协议实现高可用.
VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用.目前keepalive实现vrrp协议,通过vrrp实现高可用.
分为主,备一般是2个节点.主备之间通过vrrp协议发送数据包沟通.
主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
vrrp协议使用组播的ip. 224.xx.xx.xx 默认(224.0.0.18)
默认配置文件解析
! Configuration File for keepalived
#全局定义部分
global_defs {
router_id web01 # 每一个keepalived的名字 在 当前网络中唯一
}
vrrp_instance VI_1 { # VRRP实例的名字 主备之间的名字一定要相同
state MASTER # 主 MASTER 备 BUCKUP
interface eth0 # 指定网卡
virtual_router_id 51 # 一对主备之间的id号 要相同
priority 100 # 优先级 数字越大优先级越高,建议之间相差50
advert_int 1 # 心跳检测 多久发送一次VRRP数据包
authentication { # VRRP的授权于认证 对数据包进行加密处理
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 设置vip
10.0.0.3 dev eth0 label eth0:0 # #label 设置了别名
}
}
#主配置下面都是一些无关的配置 为另一个软件写的配置
实例主备之间的配置--抢占式
# 抢占式 老大永远是老大
# 非抢占式 都可以坐老大
state 都为BACKUP
priority 必须不同
vrrp_instance 模块下添加 nopreempt
############## lb01 ###############
global_defs {
router_id web01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
}
################# lb02 #################
global_defs {
router_id web02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
通过抓包来看是 10.0.0.7 一直向 224.0.0.18 发送加密信息 :我还活着:
问题解决
1. # 主备都有vip
备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP.
有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路.
解决:
监控(备节点监控),只要备节点有vip就告警. ---- 发邮件
更狠一点监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了. ---- 写脚本利用ssh终止主的keepalived
nginx配合keepalived
keepalived只会在主机挂了,网络断开后,才会进行主备切换.
默认情况下keepalived不会监控某个服务.
项目目标: 某个服务关闭了,keepalived就进行主备切换.
项目步骤:
1 书写脚本,过滤服务进程数,端口数量,检查是否运行.
2 然后进行判断如果服务没有运行,则关闭keepalived.
3 修改keepalived配置文件,通过keepalived调用这个脚本.
检测脚本 -- 根据端口 根据服务
##### 一定要给执行权限 ####
############### 端口 #############
#!/bin/bash
#author: lidao996
#desc: 监控 nginx 端口数量
port_cnt=`ss -lntup |grep nginx |wc -l`
if [ $port_cnt -eq 0 ];then
systemctl stop keepalived
fi
############### 服务 #############
###### 服务名不可以含有nginx 会影响判断 ####
#!/bin/bash
#author: lidao996
#desc: 监控 nginx 端口数量
port_cnt=`ps -ef |grep [n]ginx |wc -l`
if [ $port_cnt -eq 0 ];then
systemctl stop keepalived
fi
global_defs {
router_id web01
}
vrrp_script check_web {
script "/root/keep_lb.sh"
interval 5
weight 1
user root
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
nopreempt
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
track_script {
check_web
}
}
双主模式
应对高并发的时候设置的双主模式 充分利用两个主机 进行交互