文章目录
- LVS+Keepalived
-
- 一个合格的群集应该具备的特性
- 健康检查(探针)常用的工作方式
- keepalived的工作原理
- keepalived的工作模式
- keepalived三个模块
- [nginx做负载均衡器 + keepalived 实现高可用](#nginx做负载均衡器 + keepalived 实现高可用)
- 脑裂故障问题
- 环境准备
- 具体步骤
LVS+Keepalived
一个合格的群集应该具备的特性
- 负载均衡 提高群集的性能
- 健康检查(探针) 探测调度器和节点服务器是否在正常运行
- 故障转移 通过VIP漂移实现主备切换
健康检查(探针)常用的工作方式
-
发送心跳消息 vrrp报文 ping/pong
-
TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
-
HTTP URL检查 向目标主机的URL路径发起HTTP GET请求方法,如果响应状态码为 2XX 或 3XX,则认为健康检查正常;如果响应状态码为 4XX 或 5XX,则认为健康检查异常
http://IP:PORT/URI路径 http://www.xy103.com/test.html
keepalived的工作原理
keepalived是基于 VRRP 协议实现多机热备的高可用方案。
默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,并通过VIP接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP)继续提供服务,保证服务的高可用。
keepalived的工作模式
- 抢占模式:keepalived的默认模式,MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来
- 非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BACKUP,且都要添加nopreempt配置)
keepalived三个模块
- core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
- vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
- check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)
nginx做负载均衡器 + keepalived 实现高可用
- 先准备好对 nginx 进程做健康检查的脚本
- 修改keepalived配置文件,添加调用健康检查脚本的配置 使用vrrp_script XXX {}定义脚本路径 使用track_script { XXX }调用脚本
- 启动 nginx 和 keepalived
脑裂故障问题
现象
主服务器和备服务器都同时拥有相同的VIP
原因
因为主服务器和备服务器之间的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令在本地生成VIP
解决
关闭主服务器或备服务器其中一个的keepalived服务
预防
- 如果是系统防火墙导致,则关闭防火墙或者添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
- 如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信或者做链路聚合
- 在主服务器使用脚本定时判断与备服务器之间的通信链路是否中断,如果判断主备服务器之间的链路中断则自行关闭主服务器的keepalived服务
- 利用第三方应用或监控系统检测是否发送了脑裂故障现象,如果确认发生脑裂故障则通过第三方应用或监控系统来关闭主备服务器其中一个的keepalived服务
环境准备
主DR 服务器:20.0.0.52
备DR 服务器:20.0.0.53
Web 服务器1:20.0.0.54
Web 服务器2:20.0.0.55
vip:20.0.0.188
客户端:本机
具体步骤
主DR 服务器:20.0.0.52
备DR 服务器:20.0.0.53
关闭防火墙、核心防护
systemctl stop firewalld.service
setenforce 0
安装软件包
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
进入目录
cd /etc/keepalived/
做备份
cp keepalived.conf keepalived.conf.bak
修改配置文件
vim keepalived.conf
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
#vrrp_strict
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态
主为MASTER,备为BACKUP
state MASTER/BACKUP
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
#nopreempt #如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123456
}
virtual_ipaddress { #指定群集vip地址
20.0.0.188
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 20.0.0.188 80 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 0 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 20.0.0.54 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 20.0.0.55 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
##删除后面多余的配置##
}
启动 ipvsadm 服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln
调整 proc 响应参数,关闭Linux 内核的重定向参数响应
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
--------------------------------------------------
配置节点服务器
Web 服务器1:20.0.0.54
Web 服务器2:20.0.0.55
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
准备网页
--20.0.0.54---
echo 'this is xy101 web!' > /var/www/html/index.html
--20.0.0.55---
echo 'this is xy102 web!' > /var/www/html/index.html
修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=20.0.0.188
NETMASK=255.255.255.255
service network restart 或 systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 20.0.0.188 dev lo:0
vim /etc/sysctl.conf
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
sysctl -p
测试验证
在客户端访问 http://20.0.0.188/
再在主服务器关闭 keepalived 服务后再测试
systemctl stop keepalived