keepalived群集
Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
群集具备的特性
1)负载均衡 提高群集的性能
2)健康检查(探针) 探测调度器和节点服务器是否在正常运行
3)故障转移 通过VIP漂移实现主备切换
健康检查(探针)常用的工作方式
1)发送心跳消息 vrrp报文 ping/pong
2)TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
3)HTTP URL检查 向目标主机的URL路径发起HTTP GET请求方法,如果响应状态码为 2XX 或 3XX,则认为健康检查正常;如果响应状态码为 4XX 或 5XX,则认为健康检查异常
http://IP:PORT/URI路径 http://www.nbpl.com/test.html
keepalived的工作原理
keepalived是基于 VRRP 协议实现多机热备的高可用方案。
默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,并通过VIP接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP)继续提供服务,保证服务的高可用。
keepalived的工作模式
1)抢占模式:keepalived的默认模式,MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来
2)非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BACKUP,且都要添加nopreempt配置)
nginx做负载均衡器 + keepalived 实现高可用
1)先准备好对 nginx 进程做健康检查的脚本
2)修改keepalived配置文件,添加调用健康检查脚本的配置 使用vrrp_script XXX {}定义脚本路径 使用track_script { XXX }调用脚本
3)启动 nginx 和 keepalived
实验
keepalived + LVS
环境配置
客户机: 20.0.0.100
LVS1代理服务器 安装 Keepalived: 20.0.0.13
LVS2代理服务器 安装 Keepalived: 20.0.0.14
vip 虚拟ip: 20.0.0.200
web1服务器: 20.0.0.11
web2服务器: 20.0.0.12
实操
1) 代理服务器 LVS1、LVS2 关闭防火墙 安装keepalived、ipvsadm
systemctl disable firewalld.service --now
setenforce 0 #关闭防火墙、核心防护yum -y install ipvsadm keepalived #安装 ipvsadm keepalived
rpm -qa | grep keepalived #查看keepalived版本rpm -ql keepalived #查看keepalived安装路径
2) 修改LVS1代理主服务器配置(主)
cp /etc/keepalived.conf /etc/keepalived.conf.bak #备份配置文件
vim /etc/keepalived.conf......
global_defs { #定义全局参数smtp_server 127.0.0.1 #邮件服务指向本地router_id LVS_01 #指定主服务器(路由器)的名称#vrrp_strict #加注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
}vrrp_instance VI_1 { #定义VRRP热备实例参数state MASTER #指定热备状态,主为MASTER,备为BACKUPinterface ens33 #指定承载vip地址的物理接口 virtual_router_id 10 #指定虚拟路由器的ID号,每个热备组保持一致#nopreempt #如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreemptpriority 100 #指定优先级,数值越大优先级越高,这里设置主为100,备为90advert_int 1 #通告间隔秒数(心跳频率)authentication { #定义认证信息,每个热备组保持一致auth_type PASS #认证类型auth_pass abc123 指定验证密码,主备服务器保持一致}virtual_ipaddress { #指定群集vip地址20.0.0.200}
}virtual_server 20.0.0.200 80 { #指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数delay_loop 6 #健康检查的间隔时间(秒)lb_algo rr #指定调度算法,轮询(rr)lb_kind DR #指定群集工作模式,直接路由(DR)persistence_timeout 0 #连接保持时间(秒)protocol TCP #应用服务采用的是 TCP协议real_server 20.0.0.11 80 { #指定第一个Web节点的地址、端口weight 1 #节点的权重 TCP_CHECK {connect_port 80 #添加检查的目标端口connect_timeout 3 #添加连接超时(秒)nb_get_retry 3 #添加重试次数delay_before_retry 3 #添加重试间隔}}real_server 20.0.0.12 80 { #添加第二个 Web节点的地址、端口weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}
}}systemctl start keepalived
ip a #查看虚拟网卡vip
3) 加载IPVS模块、保存当前的IPVS配置,并且查看当前系统上的IPVS配置信息
modprobe ip_vs #加载 IP 虚拟服务器 (IPVS) 模块ipvsadm-save > /etc/sysconfig/ipvsadm #将当前 IPVS 的配置保存到 /etc/sysconfig/ipvsadm 文件中systemctl start ipvsadm.service
systemctl restart keepalived.service ipvsadm -ln #列出当前系统上的 IPVS 配置信息
4)修改LVS2代理主服务器配置(备)
global_defs {smtp_server 127.0.0.1router_id LVS_02 #指定备服务器(路由器)的名称#vrrp_strict #加注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
}vrrp_instance VI_1 {state BACKUP #指定热备状态,主为MASTER,备为BACKUPinterface ens33virtual_router_id 10priority 90 #指定优先级,数值越大优先级越高,这里设置主为100,备为90advert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {20.0.0.200}
}virtual_server 20.0.0.200 80 {delay_loop 6lb_kind DRpersistence_timeout 0protocol TCPreal_server 20.0.0.11 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 20.0.0.12 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}}systemctl start keepalived
ip a #查看虚拟网卡vip
5) LVS – DR模式构建负载均衡集群
#启动 ipvsadm 服务(主备皆如此)
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadmipvsadm -ln
#如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalive
6) 配置节点服务器,准备测试页面
systemctl stop firewalld
setenforce 0yum -y install httpd
systemctl start httpd#建立测试页
#192.168.80.100
echo 'this is kgc web!' > /var/www/html/index.html#192.168.80.101
echo 'this is benet web!' > /var/www/html/index.html
7)浏览器访问测试结果
8) 关闭主服务器的Keepalived服务,测试高可用
Nginx + Keepalived
环境配置
客户机: 20.0.0.100
Nginx1代理服务器 安装 Keepalived: 20.0.0.13
Nginx2代理服务器 安装 Keepalived: 20.0.0.14
vip 虚拟ip: 20.0.0.200
web1服务器: 20.0.0.11
web2服务器: 20.0.0.12
实操
1)编写Nginx服务监控脚本
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then/usr/local/bin/nginxsleep 2counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; then/etc/init.d/keepalived stopfi
fi
2) 配置Nginx1代理服务器(主)
global_defs { router_id Nginx_01
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {20.0.0.200}track_script {check_nginx}
}
3)配置Nginx2代理服务器(备)
global_defs { router_id Nginx_02
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {20.0.0.200}track_script {check_nginx}
}
4) Nginx负载均衡配置
#主备nginx均配置四层反向代理
vim /apps/nginx/conf/nginx.conf
stream{upstream iserver {server 20.0.0.103:80;server 20.0.0.104:80;
}server {listen 80;proxy_pass iserver;} }systemctl restart nginx
5)负载均衡测试
用curl命令对VIP地址进行访问
6)高可用测试
systemctl stop nginx #关闭主服务器的nginx服务
脑裂故障问题
现象
主服务器和备服务器都同时拥有相同的VIP
原因
因为主服务器和备服务器之间的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故
障了并通过ip命令在本地生成VIP
解决
关闭主服务器或备服务器其中一个的keepalived服务
预防
(1)如果是系统防火墙导致,则关闭防火墙或者添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信或者做链路聚合
(3)在主服务器使用脚本定时判断与备服务器之间的通信链路是否中断,如果判断主备服务器之间的链路中断则自行关闭主服务器的keepalived服务
(4)利用第三方应用或监控系统检测是否发送了脑裂故障现象,如果确认发生脑裂故障则通过第三方应用或监控系统来关闭主备服务器其中一个的keepalived服务