LVS+keepalived配置高可用架构和负载均衡机制(2)

简介: LVS+keepalived配置高可用架构和负载均衡机制(2)

一、概述

接上文,实际生产场景中,往往存在硬件资源数量的限制,此时需要设置DS节点复用RS节点。
所以往往最常见的架构如下图所示:
1) 3台主机组建真实服务器集群,即3个RS
2) 2个RS兼做DS,构建负载均衡机制

                     Client
                        │
                        │VIP:17.7.7.18
       ┌────────────────┼────────────────┐
┌──────┴───────┐ ┌──────┴───────┐ ┌──────┴───────┐
│  RS1/DS1     │ │  RS2/DS2     │ │  RS3         │
│7.7.7.11      │ │7.7.7.12      │ │7.7.7.13      │
└──────────────┘ └──────────────┘ └──────────────┘

配置与非复用相同的情况下:在 docker 环境测试通过,但在生产环境中存在 LVS 转发混乱的情况!

二、DS/RS复用流量死循环:症状描述

如果 LVS 主备都是 localnode(即DS/RS复用),并且 backup 的 LVS rules 已经启用(比如 keepalived),那么就会出现下面的情况:
client 发 SYN 包给 master DS
50% 机会 master DS 把包转给 backup DS(因为 backup DS 也是 RS)
因为 backup 的 LVS rules 已经启用,所以50%机会 backup 把包转给 master
master 收到包后,又把包转给 backup,然后陷入死循环。

三、DS/RS复用流量死循环:解决思路

iptables的mangle表可以对目标数据包加上mark标记,用于实现策略路由控制数据包的流向。我们在规则中指定对端LVS节点的mac地址,如果不是对端mac地址的请求,说明是来自客户端的请求,需要打上mark标记;如果是来自对端mac地址的请求,则说明是主机转发的请求,就不打标记。而刚好LVS也支持通过fwmark配置虚拟服务,替代场景的VIP:PORT方式,只对打了fwmark标记的数据包进行转发。二者结合起来即可实现只针对客户端过来的请求进行转发,乒乓问题迎刃而解!
一次完整的客户端请求处理流程如下:
首先客户端的请求到达LVS主机,先由主机上的iptables对请求数据包打上一个mark值为1的标记(mark值可为任意正整数),然后LVS上配置了fwmark为1的虚拟服务,这样被打上mark的数据包就可以正常被主机的LVS捕获,进入虚拟服务转发;如果请求被转发给了备机,因为是来自主机mac地址的请求,所以备机不会打mark,也就不会进入备机的虚拟服务转发,而是直接由备机的RS服务处理。
其他描述参考:
经过 DS1 的包,如果 mac address 不是 DS2 的,用 iptables 给包打 mark=i
经过 DS2 的包,如果 mac address 不是 DS1 的,用 iptables 给包打 mark=j
在 keepalived 配置 LVS 时使用 fwmark-service 来表示 virtual_server,不用三元组(ip,port,protocol)的方式
这样,如果是 DS 转发过来的包,就不会进入 LVS 进行负载(防止两个 DS 互相扔皮球,进入死循环),而是被 RS 服务处理。而客户端进来的包,就会进入 LVS 进行负载。

四、DS/RS复用流量死循环:解决方法

#VIP=192.168.10.55
VIP=10.128.190.248
VPORT=80
#MAC_Director1=00:0c:29:0c:a9:ca
#MAC_Director2=00:0c:29:24:ce:e7
MAC_Director1=34:73:79:20:ca:73
MAC_Director2=34:73:79:20:cb:83

# DS1 配置 iptables ,除了 DS2 以外的包,都设置 mark 为 3
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac \
! --mac-source $MAC_Director2 -j MARK --set-mark 0x3

# DS2 配置 iptables ,除了 DS1 以外的包,都设置 mark 为 4
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac \
! --mac-source $MAC_Director1 -j MARK --set-mark 0x4

# 查看表 mangle:(默认 iptables 查看的是 filter 表)
iptables -t mangle -L -n
firewall-cmd --info-ipset=lvs_mark_list

# DS1 配置 keepalived
virtual_server fwmark 3 {
...
}

# DS2 配置 keepalived
virtual_server fwmark 4 {
...
}

五、以上配置后,包处理流程就变成如下

client 请求,master DS 收到包后,打了 mark 为 3。
LVS 看到 mark=3 的请求,50% 自己的 RS 处理,50% 转发到 backup DS。
backup 收到包后,发现是 master 过来的,不设置 mark。所以这个包不会被 LVS 处理,而被 backup 上面的服务给处理了。
Redhat 7 之前用的是 Piranha 做 LVS 的 HA,7版本后用 Keepalived。Piranha 是不会启用 backup 的 rules的,所以不存在这个问题。

【注意事项】

防止系统重启导致 iptables 规则失效!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
10月前
|
运维 负载均衡 微服务
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
512 11
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
存储 编解码 搜索推荐
文生图架构设计原来如此简单之社区与共享机制
工作流共享是文生图应用社区建设的核心功能,它使用户能够分享创作经验和技巧,形成知识共享生态。工作流序列化与存储设计需要解决复杂工作流的高效表示问题。
318 10
|
负载均衡 网络协议 Linux
LVS,软负载均衡
LVS(Linux Virtual Server)是一项广泛应用的负载均衡技术,由章文嵩博士于1998年发起,自Linux 2.4.24版本起成为官方内核的一部分。LVS通过四层负载均衡技术实现高性能、高可用的服务器集群,支持多种调度算法和工作模式(如D-NAT、full-NAT、IP隧道、DR),适用于HTTP、数据库等应用。相比7层负载均衡器(如Nginx、HAProxy),LVS具有更高的并发处理能力和更低的资源消耗,适合大规模流量分发。本期文章详细介绍了LVS的工作原理、优势与不足,并对比了常见的负载均衡产品,帮助读者根据具体需求选择合适的解决方案。
2678 6
LVS,软负载均衡
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
3075 11
架构学习:7种负载均衡算法策略
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
333 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
负载均衡 算法 Linux
LVS+Keepalived:实现高效软负载均衡的利器
本文介绍了如何使用LVS(Linux Virtual Server)和Keepalived搭建高可用负载均衡集群。LVS通过不同调度算法将请求转发给后端服务器,而Keepalived基于VRRP协议实现服务高可用,避免IP单点故障。具体步骤包括环境准备、安装配置ipvsadm和Keepalived、启动服务及测试。文中还详细解释了配置文件中的关键参数,并提供了故障转移测试方法。最后,文章简要对比了软件、硬件和云负载均衡方案的特点,帮助读者选择合适的负载均衡策略。
2186 4
|
负载均衡 Java 持续交付
深入解析微服务架构中的服务发现与负载均衡
深入解析微服务架构中的服务发现与负载均衡
899 7