keepalived
官网
Keepalived 可以用来防止服务器单点故障的发生
# 原理
是基于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。
案例
scp 远程拷贝
# 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的 默认网页内容
# 安装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 负载均衡服务器 修改文件如下
# 通过安装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;}}}
# 所有的负载均衡器(案例 99,100两台)都要 配置
# 一个是master,其它都是 backup
# priority 优先级 越大,优先级越高
# 配置keepalived
## vim /etc/keepalived/keepalived.conf
# 这个是 主的
!Configuration File for keepalivedglobal_defs{# # 节点标识 支持字符串模式 backup 的这个名称要修改,不能一个名称 是唯一的router_id 99}vrrp_instance VI_1 {# # 初始状态:MASTER/BACKUPstate master # # 绑定的物理网卡 要通过ip ad 查看 linux 是 ens,还是ethinterface ens33# # 虚拟路由 ID(同一组需相同(同一集群,主备是一致),范围 0-255)# 我的99,100 两台是一组,所以要一致virtual_router_id 88# # 优先级(值越大越优先)priority 100# 通告间隔(秒)advert_int 2# # 认证配置authentication {# 认证类型:PASS/AHauth_type PASS# 密码(同一组需相同)auth_pass 1234}# 虚拟 IP(VIP)virtual_ipaddress{192.168.88.200/24}
}# 这个是 backup
!Configuration File for keepalivedglobal_defs{router_id 100
}vrrp_instance VI_1 {state backupinterface ens33virtual_router_id 88priority 99advert_int 2authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.200/24}
}
脚本检测 负载均衡是否正常
# 在 /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 ]; thensystemctl restart nginxif [ $? -ne 0 ] ; thensystemctl stop keepalivedfi
fi # 或者用这种脚本,更为通用性
~
#!/bin/bash
counter=$(ps -C nginx --no-heading | wc -l)
if [ "${counter}" = "0" ]; thensystemctl restart nginxsleep 5counter=$(ps -C nginx --no-heading | wc -l)if [ "${counter}" = "0" ]; thensystemctl stop keepalivedfifi
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalivedglobal_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节点升级为MASTERweight -20 # 检查失败时优先级降低的值 (-254 - 254)}
vrrp_instance VI_1 {state masterinterface ens33virtual_router_id 88priority 100advert_int 2# 引用脚本track_script {check_nginx}authentication {auth_type PASSauth_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部署
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalivedglobal_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 MASTERinterface ens33virtual_router_id 88priority 100advert_int 2# 引用脚本track_script {check_nginx}authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.200/24}
}
vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 100priority 99advert_int 2# 引用脚本track_script {check_nginx}authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.155/24}
}
## /etc/keepalived/keepalived.conf 的配置文件
!Configuration File for keepalivedglobal_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 BACKUPinterface ens33virtual_router_id 88priority 99advert_int 2# 引用脚本track_script {check_nginx}authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.200/24}
}
vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 100priority 100advert_int 2# 引用脚本track_script {check_nginx}authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.155/24}
}
LVS+ keepalived
LVS负载均衡 资料
案例使用 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
# 99,100 LVS负载均衡都要安装keepalived 同时配置 keepalivd
# 路径 /etc/keepalived/keepalived.conf
!Configuration File for keepalivedglobal_defs{router_id lvs_master
}vrrp_instance VI_1 {state MASTERinterface ens33# 不抢占资源nopreempt virtual_router_id 88priority 100advert_int 2authentication {auth_type PASSauth_pass 1234}virtual_ipaddress{192.168.88.200/24}virtual_server 192.168.88.200 80 {delay_loop 3lb_algo rr # LVS 调度算法lb_kind DR # LVS 集群模式 (直接路由模式)nat_mask 255.255.255.0 protocol TCP # 健康检查使用的协议real_server 192.168.88.22 80 {weight 1inhibit_on_failure # 当该节点失败时,把权重设置为0,而不是从IPVS中删除。TCP_CHECK { # 健康检查connect_port 80 # 检查的端口号connect_timeout 3 # 连接超时的时间}}real_server 192.168.88.33 80 {weight 1inhibit_on_failureTCP_CHECK {connect_port 80connect_timeout 3}}}
注意
- LVS的 VIP 是/32 而Keepalived的 VIP 是 /24