keepalived
Keepalived 可以用来防止服务器单点故障的发生
csharp
# 原理
是基于VRRP协议实现的,当backup收不到vrrp包时,就认为master宕机了,这时就需要根据VRRP的优先级来选举一个backup 当master,就实现服务的HA(高可用)啦
# VRRP Vitrual Router Redundancy Protocol ,虚拟路由冗余协议
这个协议,可以认为实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的VIP(该路由器所在局域网内其它机器的默认路由为该VIP),master 会发组播,当backup收不到vrrp包时就认为master 宕机了,这时就需要根据VRRP的优先级来选举一个backup 当master,就实现路由器HA(高可用)啦
#########
多台服务器组成一个虚拟路由器组 ,共享一个虚拟 IP 。通过优先级 选举 Master 节点,其他节点为 Backup。Master 节点定期发送 VRRP 通告,若 Backup 未收到通告,则触发选举新 Master。
##########
keepalived 主要包含三个模块 core 、 check、vrrp
# 1 core 是keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析
# 2 check 负责健康检查
# 3 vrrp模块来实现VRRP协议的
## check 健康检查:
1:支持 TCP、HTTP、HTTPS、SSL、脚本等多种检查方式。
2:若 Master 节点的服务异常,Keepalived **自动降低优先级**,触发 VIP 漂移到 Backup。

案例
csharp
# 192.168.88.22 真实服务IP
# 192.168.88.33 真实服务IP
# 192.168.88.99 负载均衡服务IP
# 192.168.88.100 负载均衡服务IP
echo "RS-192.168.88.22 service" > /var/www/html/index.nginx-debian.html
echo "RS-192.168.88.33 service" > /var/www/html/index.nginx-debian.htm
》》》》 22、33 真实服务器
1、通过安装Nginx(当作web服务的),当然也可以安装tomcat
2、修改nginx的 默认网页内容
csharp
# 安装nginx 作为web服务的,可以安装tomcat
apt update && apt install nginx -y && systemctl enable nginx && systemctl restart nginx
# 修改nginx的 默认网页内容
echo "RS-192.168.88.22 service" > /var/www/html/index.nginx-debian.html
echo "RS-192.168.88.33 service" > /var/www/html/index.nginx-debian.htm
》》》》 99、100 负载均衡服务器
1、通过安装Nginx(当作负载均衡),当然也可以LVS、HAProxy
2、修改nginx的配置文件
3、安装keepalived
4、配置keepalived
》》》 99、100 负载均衡服务器 修改文件如下
csharp
# 通过安装Nginx(当作负载均衡),当然也可以LVS、HAProxy
apt update && apt install nginx -y && systemctl enable nginx && systemctl restart nginx
# 99,100 (负载均衡器) 安装 Keepalived
apt update && apt install keepalived -y && systemctl enable keepalived && systemctl start keepalived
## 修改之后
## nginx -t 测试一下语法
## nginx -s reload 加载配置
## vim /etc/nginx/nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
upstream httpd {
server 192.168.88.22;
server 192.168.88.33;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
# 为了模拟域名访问, 需要在访问的客户端 host 加 IP service.zen.com
# server_name service.zen.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://httpd;
}
}
}

csharp
# 所有的负载均衡器(案例 99,100两台)都要 配置
# 一个是master,其它都是 backup
# priority 优先级 越大,优先级越高
# 配置keepalived
## vim /etc/keepalived/keepalived.conf
# 这个是 主的
!Configuration File for keepalived
global_defs{
# # 节点标识 支持字符串模式 backup 的这个名称要修改,不能一个名称 是唯一的
router_id 99
}
vrrp_instance VI_1 {
# # 初始状态:MASTER/BACKUP
state master
# # 绑定的物理网卡 要通过ip ad 查看 linux 是 ens,还是eth
interface ens33
# # 虚拟路由 ID(同一组需相同(同一集群,主备是一致),范围 0-255)
# 我的99,100 两台是一组,所以要一致
virtual_router_id 88
# # 优先级(值越大越优先)
priority 100
# 通告间隔(秒)
advert_int 2
# # 认证配置
authentication {
# 认证类型:PASS/AH
auth_type PASS
# 密码(同一组需相同)
auth_pass 1234
}
# 虚拟 IP(VIP)
virtual_ipaddress{
192.168.88.200/24
}
}
# 这个是 backup
!Configuration File for keepalived
global_defs{
router_id 100
}
vrrp_instance VI_1 {
state backup
interface ens33
virtual_router_id 88
priority 99
advert_int 2
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.200/24
}
}

脚本检测 负载均衡是否正常
csharp
# 在 /usr/local/keepalived 中创建 check_nginx.sh 脚本,脚本内容如下
# 因为使用nginx代理的,只有nginx 正常启动,则可以curl -I http://127.0.0.1 正常访问
# $? 等于 0,则表示 nginx 正常,非0,表示 启动异常,或者不工作。
# $? 是上一指令的返回值,成功是0,不成功是1
# 要保证这个脚本文件,当前用户有执行权限
chmod a+X /usr/local/keepaliverd/check_nginx.sh
#!/bin/bash
/usr/bin/curl -I http://127.0.0.1
if [ $? -ne 0 ]; then
systemctl restart nginx
if [ $? -ne 0 ] ; then
systemctl stop keepalived
fi
fi
# 或者用这种脚本,更为通用性
~
#!/bin/bash
counter=$(ps -C nginx --no-heading | wc -l)
if [ "${counter}" = "0" ]; then
systemctl restart nginx
sleep 5
counter=$(ps -C nginx --no-heading | wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
csharp
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalived
global_defs{
router_id 99
}
# 健康检测模块调用
vrrp_script check_nginx {
script "/usr/local/keepalived/check_nginx.sh"
interval 2 # 检查间隔时间(秒),默认1秒
# # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
# 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
weight -20 # 检查失败时优先级降低的值 (-254 - 254)
}
vrrp_instance VI_1 {
state master
interface ens33
virtual_router_id 88
priority 100
advert_int 2
# 引用脚本
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.200/24
}
}
查看日志
tail -f /var/log/syslog

单实例主备模式的keepalived部署 双多实例双主模式的keepalived部署
单vip 架构: 只有master上有vip,backup上没有vip,这个时候master会比较忙,backup机器会比较闲,设备使用率比较低
上面的案例就单VIP主备模式
双vip 架构: 启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。 可以提升设备的使用率,这两台机器互为主备。
》》》》 双多实例双主模式的keepalived部署

csharp
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalived
global_defs{
router_id Master_99
}
# 健康检测模块调用
vrrp_script check_nginx {
script "/usr/local/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 88
priority 100
advert_int 2
# 引用脚本
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.200/24
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 100
priority 99
advert_int 2
# 引用脚本
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.155/24
}
}
csharp
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalived
global_defs{
router_id Master_99
}
# 健康检测模块调用
vrrp_script check_nginx {
script "/usr/local/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 88
priority 99
advert_int 2
# 引用脚本
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.200/24
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 2
# 引用脚本
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.155/24
}
}
LVS+ keepalived
csharp
案例使用 LVS_DR 直接路由模式
# 192.168.88.22 真实服务IP
# 192.168.88.33 真实服务IP
# 192.168.88.99 负载均衡服务IP
# 192.168.88.100 负载均衡服务IP
## 99,100 lvs 负载均衡器中 配置
#ip a d dev ens33 192.168.88.200/32 删除VIP
ip a a dev ens33 192.168.88.200/32
ipvsadm -A -t 192.168.88.200:80 -s rr
ipvsadm -a -t 192.168.88.200:80 -r 192.168.88.22:80 -g
ipvsadm -a -t 192.168.88.200:80 -r 192.168.33.33:80 -g
ipvsadm -S > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
## 22,33 RS 真实服务器中配置
ip a a dev lo 192.168.88.200/32
# ARP静默 临时
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# ARP静默 永久
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p
csharp
# 99,100 LVS负载均衡都要安装keepalived 同时配置 keepalivd
# 路径 /etc/keepalived/keepalived.conf
!Configuration File for keepalived
global_defs{
router_id lvs_master
}
vrrp_instance VI_1 {
state MASTER
interface ens33
# 不抢占资源
nopreempt
virtual_router_id 88
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress{
192.168.88.200/24
}
virtual_server 192.168.88.200 80 {
delay_loop 3
lb_algo rr # LVS 调度算法
lb_kind DR # LVS 集群模式 (直接路由模式)
nat_mask 255.255.255.0
protocol TCP # 健康检查使用的协议
real_server 192.168.88.22 80 {
weight 1
inhibit_on_failure # 当该节点失败时,把权重设置为0,而不是从IPVS中删除。
TCP_CHECK { # 健康检查
connect_port 80 # 检查的端口号
connect_timeout 3 # 连接超时的时间
}
}
real_server 192.168.88.33 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
}


注意
- LVS的 VIP 是/32 而Keepalived的 VIP 是 /24