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

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
2月前
|
运维 负载均衡 微服务
|
6月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
230 11
|
7月前
|
存储 编解码 搜索推荐
文生图架构设计原来如此简单之社区与共享机制
工作流共享是文生图应用社区建设的核心功能,它使用户能够分享创作经验和技巧,形成知识共享生态。工作流序列化与存储设计需要解决复杂工作流的高效表示问题。
159 10
|
9月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
158 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
10月前
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
731 9
|
11月前
|
负载均衡 算法 Linux
LVS+Keepalived:实现高效软负载均衡的利器
本文介绍了如何使用LVS(Linux Virtual Server)和Keepalived搭建高可用负载均衡集群。LVS通过不同调度算法将请求转发给后端服务器,而Keepalived基于VRRP协议实现服务高可用,避免IP单点故障。具体步骤包括环境准备、安装配置ipvsadm和Keepalived、启动服务及测试。文中还详细解释了配置文件中的关键参数,并提供了故障转移测试方法。最后,文章简要对比了软件、硬件和云负载均衡方案的特点,帮助读者选择合适的负载均衡策略。
1534 4
|
12月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
存储 资源调度 算法
操作系统的心脏:深入理解内核架构与机制####
【10月更文挑战第16天】 本文旨在揭开操作系统最神秘的面纱——内核,通过剖析其架构设计与关键机制,引领读者一窥究竟。在这篇探索之旅中,我们将深入浅出地讨论内核的基本构成、进程管理的智慧、内存分配的策略,以及那至关重要的系统调用接口,揭示它们是如何协同工作,支撑起现代计算机系统的高效运行。这既是一次技术的深潜,也是对“看不见的手”调控数字世界的深刻理解。 ####
308 3
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
220 5
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路

热门文章

最新文章