keepalived高可用集群
1 概述
代理服务器和调度器都是单点模式,keepalived就是用来实现调度器的高可用集群,防止出现单点故障问题。
1.1 keepalived的工作原理
keepalived是专门为了LVS集群开发出来的,是基于vrrp协议(虚拟路由的冗余协议)实现的调度器的高可用方案,但是适用场景不仅仅局限于LVS。而且keepalived为后台的真实服务器做了一个健康检查,当服务不可用时,会自动的移除ipvs的转发策略,服务恢复时,会自动重新把策略加入到ipvs。
1.1.1 健康检查
健康检查,别名探针
1)发送心跳消息 ping/pang
2)TCP端口检查 向一个主机的IP:PORT 发起TCP连接
3) HTTP URL 检查 向一个主机的 http://IP:PORT/URL路径 发送HTTP GET请求方法,主机响应返回2XX、3XX状态码则认为健康检查正常,如响应返回4XX、5XX状态码则认为健康检查异常
检查服务器 | 作用 |
---|---|
节点服务器 | 如果发现有故障的节点就会将其隔离或者剔除集群,待其恢复后再重新加入到集群当中 |
负载均衡器 | 会定时检查主服务器的状态(包括主机和服务的状态),如果主服务器故障就自动切换到备服务器上,待主服务器恢复后再重新让主服务器去承载业务请求 |
1.1.2 keepalive功能
- 按优先级进行主备切换,当主故障时,可以自动切换到备,主恢复之后,如果主的优先级比备高,还是会自动的切换到主。
- 故障检测和恢复功能。
- 主备之间通过组播地址:224.0.0.18,互相发送健康检查的报文,确定主和备之间的通信(确定双方是否工作正常)。
- 通过配置vip来实现集群的入口,vrrp是一个冗余协议,主在工作时,备完全不参与集群的工作,只是监听主的状态。
1.1.3 Keepalived体系主要模块及其作用
Keepalived的主要模块 | 作用 |
---|---|
core模块 | 为Keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析 |
vrrp模块 | 是来实现VRRP协议的 |
check模块 | 负责健康检查,常见的方式有端口检查及URL检查 |
1.2 脑裂
在HA系统,只要是通过vip这个机制实现的,都有可能会出现这个问题。
1.2.1 脑裂的定义
vip地址同时出现在了主和备上。
注:vip地址永远只能出现一台服务器上!
1.2.2 脑裂的原因
1、防火墙屏蔽了主备的之间224.0.0.18的报文,导致互相收不到信息,就认为对方已经挂起,所以都认为自己是主。
2、网卡出现故障(硬件故障),配置出问题:ip地址冲突。
3、心跳线:网线之间连接故障,断开,老化。
4、keepalived的配置文件有问题,配置的相关项出现问题(80%)
1.2.3 脑裂的解决方法
-
软件层面:
- 抓包进行定位,查看组播的报文是否正常。
- 配置文件进行排查(网卡配置,应用配置)。
-
硬件层面:
- 更换心跳线(网线)进行测试。
- 网卡硬件的问题。
- 内存和cpu,磁盘空间不足,也会出现脑裂。
2 LVS高可用
2.1 架构
名称 | IP地址 |
---|---|
LVS-Master | 192.168.207.100 |
LVS-Backup | 192.168.207.110 |
Web-A | 192.168.207.200 |
Web-B | 192.168.207.210 |
VIP | 192.168.207.250 |
Client | 192.168.207.10 |
2.2 步骤
2.2.1 主备统一操作
apt -y install ipvsadm keepalived
cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived.service
主配置如下:
备配置如下:
主备再统一操作
vim /etc/sysctl.conf
sysctl -p
route add -host 192.168.207.250 dev ens33
2.2.2 检查配置的转发策略是否生效
主备服务器统一检查
ipvsadm -ln
2.2.3 检查主的vip地址是否生成
主备服务器统一检查
ip a
2.2.4 模拟主服务器故障切换
看主的vip能否飘到备服务器
2.2.5 恢复主服务器
看vip是否能够会到主服务器
3 nginx高可用
3.1 架构
名称 | IP地址 |
---|---|
Nginx-Master | 192.168.207.200 |
Nginx-Backup | 192.168.207.210 |
VIP | 192.168.207.150 |
后端服务器1 | 192.168.207.100 |
后端服务器2 | 192.168.207.110 |
后端服务器3 | 192.168.207.120 |
3.2 编写nginx检查脚本
vim /opt/check_nginx.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
fi
3.3 主代理服务器keepalived配置
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
vrrp_script check_nginx {
script "/opt/check_nginx.sh"
#脚本必须能执行,位置一定要写绝对路径
interval 3
#每隔5秒钟通过脚本检查nginx的状态
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 50
priority 100
advert_int 1
virtual_ipaddress {
192.168.207.150
}
track_script {
check_nginx
}
}
3.4 备代理服务器keepalived配置
vim /etc/keepalived/keepalived.conf
global_defs {
router_id Nginx_02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 50
priority 80
advert_int 1
virtual_ipaddress {
192.168.207.150
}
}
3.5 主备代理服务器nginx七层反向代理配置
vim /usr/local/nginx/conf/nginx.conf
upstream kc {
server 192.168.207.100;
server 192.168.207.110;
server 192.168.207.120;
}
server {
listen 80;
proxy_pass http://kc;
}