基于 openEuler 构建 LVS-DR 群集

一、对比 LVS 负载均衡群集的 NAT 模式和 DR 模式

1. NAT 模式

工作原理:

客户端请求发送到负载均衡器(LVS)。

LVS 修改请求的目标 IP 地址为后端服务器的 IP 地址,并将请求转发。

后端服务器处理请求后,将响应返回给 LVS。

LVS 再将响应的源 IP 地址修改为自己的 IP 地址,返回给客户端。

优势:

配置简单:NAT 模式相对容易配置,适合初学者或简单场景。

隐藏后端服务器:后端服务器的真实 IP 地址对客户端不可见,增强了安全性。

支持跨网段:LVS 和后端服务器可以位于不同的网络段,适合分布式部署。

劣势:

性能瓶颈:LVS 需要处理所有进出流量,可能成为性能瓶颈,尤其是在高流量场景下。

单点故障:LVS 是唯一的入口和出口,一旦故障,整个系统将不可用。

网络开销:LVS 需要修改每个数据包的 IP 地址,增加了网络开销。

2. DR 模式

工作原理:

客户端请求发送到负载均衡器(LVS)。

LVS 将请求转发给后端服务器,但不修改 IP 地址,仅修改 MAC 地址。

后端服务器直接响应客户端,不经过 LVS。

优势:

高性能:LVS 只处理入站流量,出站流量由后端服务器直接返回客户端,减少了 LVS 的负载,性能更高。

低延迟:响应数据包不经过 LVS,减少了网络延迟。

扩展性强:适合高流量、高并发的场景,能够轻松扩展后端服务器。

劣势:

配置复杂:DR 模式需要后端服务器配置 VIP(Virtual IP),并且需要确保后端服务器不响应 ARP 请求,配置较为复杂。

网络限制:LVS 和后端服务器必须在同一局域网(LAN)内,不能跨网段。

暴露后端服务器:后端服务器的真实 IP 地址可能暴露给客户端,存在一定的安全风险。

二、基于 openEuler 构建 LVS-DR 群集

1、实验环境

|-------------|----------------|-----------------|
| 主机名 | IP地址 | 角色 |
| openEuler-2 | 192.168.183.11 | Director Server |
| openEuler-1 | 192.168.183.12 | Real Server1 |
| openEuler-3 | 192.168.183.13 | Real Server2 |
| openEuler-4 | 192.168.183.14 | Client |

2、安装nginx服务器并设置静态页面(两台RS上配置一致)

复制代码
[root@openEuler-1 ~]# yum install nginx -y
 
[root@openEuler-1 ~]# echo "web test page, ip is `hostname -I`." > /usr/share/nginx/html/index.html
 
[root@openEuler-1 ~]# systemctl enable --now nginx
 
[root@openEuler-1 ~]# curl localhost
web test page, ip is 192.168.183.12 .

3、添加VIP的相关配置

在两台RS和DS上:

复制代码
[root@openEuler-2 ~]# nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.183.10/32
Connection 'dummy-dummy1' (c54d631d-3f2f-463c-b808-bd0f483e51fc) successfully added.
[root@openEuler-2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:29:96:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.183.11/24 brd 192.168.183.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe29:9640/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 52:0d:11:f4:39:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.183.10/32 scope global noprefixroute dummy1
       valid_lft forever preferred_lft forever
    inet6 fe80::8a3f:23b2:85a2:66d6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

4、配置arp抑制(两台RS上配置)

复制代码
[root@open-1 ~]# vim /etc/sysctl.conf 
在最后加上四行
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy1.arp_ignore = 1
> net.ipv4.conf.dummy1.arp_announce = 2

#使配置生效
[root@open-1 ~]# sysctl -p

5、LVS配置(DS上配置)

复制代码
[root@openEuler-2 ~]# yum install ipvsadm -y
[root@openEuler-2 ~]# ipvsadm -At 192.168.183.10:80 -s rr
[root@openEuler-2 ~]# ipvsadm -at 192.168.183.10:80 -r 192.168.183.12:80 -g
[root@openEuler-2 ~]# ipvsadm -at 192.168.183.10:80 -r 192.168.183.13:80 -g
[root@openEuler-2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.183.10:80 rr
  -> 192.168.183.12:80            Route   1      0          0
  -> 192.168.183.13:80            Route   1      0          0

6、clinet上测试

复制代码
[root@openEuler-4 ~]# for ((i=1;i<=6;i++))
> do
> curl 192.168.183.10
> done
web test page, ip is 192.168.183.13 .
web test page, ip is 192.168.183.12 .
web test page, ip is 192.168.183.13 .
web test page, ip is 192.168.183.12 .
web test page, ip is 192.168.183.13 .
web test page, ip is 192.168.183.12 .
相关推荐
小徐不徐说5 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang5 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3276 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102167 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷7 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang7 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj5208 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵9 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy110 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++