LVS+Keepalived

一、概念与原理

1.Keepalived

基于 VRRP 协议实现高可用(HA)。初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)。

功能:

LVS 集群管理

节点健康检查(Health Check)

Keepalive可以通过在自身的Keepalive.conf文件里配置LVS的节点IP和相关参数实现对LVS 的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务 时,Keepalive服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度 到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后, Keepalive服务又会自动地把它们加入到正常转发队列中,对客户提供服务。

故障自动切换(Failover)

Keepalive可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换, 这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服 务器。

Keepalive高可用功能实现的简单原理为,两台主机同时安装好Keepalive软件并启动服务,开 始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作 为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动 接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障 修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时 它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

高可用 VIP(虚拟 IP)接管

2.VRRP 工作原理

MASTER 节点发送心跳(通告)给 BACKUP 节点。BACKUP 节点收不到心跳时,接管 VIP。MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。默认多播地址:224.0.0.18

优先级决定 MASTER 节点(数值越大优先)。

3.Keepalived 主要模块

模块 功能
core 核心进程、配置文件加载解析
vrrp VRRP 协议实现,高可用
check 健康检查,支持 TCP/HTTP/脚本检查

二、脑裂问题与防护

1. 脑裂(Split Brain)

1.脑裂(Split Brain)

两个节点失去心跳连接,均认为对方挂掉。

后果:共享资源冲突。 数据损坏(如数据库)

在高可用(HA)系统中,当联系2个节点的"心跳线"断开时,本来为一整体、动作协调的HA系统,就分裂成为 2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢 "共享资源"、争起"应用服务",就会发生严重后果------或者共享资源被瓜分、2边"服务"都起不来了;或者2边 "服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)。

2. 原因:

1.心跳线故障(断线、老化)。高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断开,老化)。

2.网卡/驱动故障

​ 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)

3.心跳网络设备故障

​ 因心跳线间连接的设备故障(网卡及交换机)。

4.仲裁机器异常

​ 因仲裁的机器出问题导致仲裁机器异常。

5.防火墙阻挡 VRRP

​ 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。

6.配置不一致(virtual_router_id、优先级、实例名)

​ Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发 生。

7.vrrp实例名字不一致、优先级一致

3. 防护策略

双心跳线冗余

添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。

磁盘锁(锁定共享资源)

正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也 会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实 中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用 服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到 对端)时才启用磁盘锁。平时就不上锁了。仲裁机制(Ping 参考 IP)

仲裁机制(Ping 参考 IP)

例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明 断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服 务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通 参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

脚本监控报警

三、部署步骤

1.环境准备

主 DR:192.168.10.80(MASTER)

备 DR:192.168.10.23(BACKUP)

VIP:192.168.10.180

Web 节点: 192.168.10.16 & 192.168.10.17

客户端:192.168.10.100

2.安装与配置 LVS + Keepalived

DR 服务器操作

systemctl stop firewalld

setenforce 0

yum -y install ipvsadm keepalived

modprobe ip_vs

cat /proc/net/ip_vs # 检查模块

配置 Keepalived

文件: /etc/keepalived/keepalived.conf

关键配置:

global_defs {

router_id LVS_01

smtp_server 127.0.0.1

}

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 10

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass abc123

}

virtual_ipaddress {

192.168.10.180

}

}

virtual_server 192.168.10.180 80 {

delay_loop 6

lb_algo rr

lb_kind DR

persistence_timeout 50

protocol TCP

real_server 192.168.10.16 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

real_server 192.168.10.17 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

VIP 配置:

vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

DEVICE=ens33:0

ONBOOT=yes

IPADDR=192.168.10.180

NETMASK=255.255.255.255

重启网络

systemctl restart network

ifup ens33:0

启动服务

systemctl start keepalived

ip addr # 查看 VIP 是否生效

ipvsadm-save > /etc/sysconfig/ipvsadm

systemctl start ipvsadm

ipvsadm -ln # 查看 LVS 配置

内核参数优化

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节点

systemctl stop firewalld

setenforce 0

yum -y install httpd

systemctl start httpd

echo 'this is kgc web!' > /var/www/html/index.html # 192.168.10.16

echo 'this is benet web!' > /var/www/html/index.html # 192.168.10.17

vim /etc/sysconfig/network-scripts/ifcfg-lo:0

DEVICE=lo:0

ONBOOT=yes

IPADDR=192.168.10.180

NETMASK=255.255.255.255

service network restart

ifup lo:0

route add -host 192.168.10.180 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

测试

客户端访问 VIP http://192.168.10.180/

停掉 MASTER Keepalived

systemctl stop keepalived

观察 BACKUP 节点接管 VIP 是否成功,再启动 MASTER,观察 VIP 是否回归(抢占或非抢占模式)。

相关推荐
Ap04157 天前
LVS介绍以及模式实现
lvs
天蓝不会忘记027 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs
qizhideyu7 天前
LVS(Linux virual server)
linux·运维·lvs
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
Yiiz.7 天前
LVS实验
lvs
️️(^~^)7 天前
LVS实验
linux·服务器·lvs
gx23487 天前
1-LVS
linux·服务器·lvs
unfeeling_7 天前
LVS实验
lvs
芝士雪豹只抽瑞克五7 天前
Linux Virtual Server (LVS) 负载均衡集群笔记
linux·笔记·负载均衡·lvs
屎到临头想搅便7 天前
LVS负载均衡
网络·lvs