基于 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 .
相关推荐
zh_xuan25 分钟前
c++ 单例模式
开发语言·c++·单例模式
rorg1 小时前
使用 Laravel 中的自定义存根简化工作
php·laravel
老胖闲聊1 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1181 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之1 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?2 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头2 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu2 小时前
java内存模型JMM
java·开发语言
我很好我还能学4 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿4 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习