构建 LVS-DR 群集

一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。

一、NAT模式的优势

  1. 配置简单:NAT模式的配置相对容易,适合初学者和小型网络环境。因为所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转换,就可以实现负载均衡功能。

  2. 安全性高:在NAT模式下,后端服务器的IP地址被隐藏,客户端无法直接访问后端服务器,只能看到负载均衡器的公网IP地址,这在一定程度上提高了系统的安全性。

  3. 支持端口映射:NAT模式允许将一个端口的流量映射到多个后端服务器的不同端口或服务上,增加了配置的灵活性。

  4. 操作系统兼容性好:后端服务器可以使用任意操作系统,无需特殊支持。

  5. 工作透明:对客户端和服务器来说,NAT模式的工作是透明的,不需要对现有系统做任何修改即可实现负载均衡。

二、DR模式的优势

  1. 高性能:在DR模式下,请求报文经过调度器后,响应报文直接从后端服务器返回给客户端,减少了数据传输的路径,降低了延迟,提高了整体性能。

  2. 可扩展性强:适合大规模集群和高并发场景,能够有效分散流量。

  3. 无需地址转换:不修改报文的源IP和目标IP地址,减少了地址转换带来的性能开销。

  4. 支持公网IP:后端服务器可以使用公网IP,便于从互联网直接访问。

  5. 对网络依赖小:只需要保证负载均衡器和后端服务器之间的网络连接正常,并且能够进行正确的路由配置即可。

  6. 服务器可扩展性好:添加或删除后端服务器节点对整个系统的影响较小,只需要在负载均衡器上进行相应的配置调整。

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

1. 环境准备

  • client (CIP)192.168.46.140/24
  • LVS调度器(DIP)192.168.46.100/24

  • 真实服务器1(RIP1)192.168.46.120/24

  • 真实服务器2(RIP2)192.168.46.130/24

  • 虚拟IP(VIP)192.168.46.150/32

2. 配置真实服务器

方法一:手动配置

(1)安装nginx,提供一个默认主页

[root@openEuler ~]# yum install -y nginx
# 默认主页存放位置index.html
[root@openEuler ~]# ls /usr/share/nginx/html/
404.html  50x.html  index.html  nginx-logo.png

# 编写默认主页内容
[root@openEuler ~]# echo "web test page, ip is `hostname -I`. "
web test page, ip is 192.168.46.120 .

# 覆盖原主页内容
[root@openEuler ~]# echo "web test page, ip is `hostname -I`. " > /usr/share/nginx/html/index.html

# 设置开机自启动该服务
[root@openEuler ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

# 查看是否能访问
[root@openEuler ~]# curl localhost
web test page, ip is 192.168.46.120 .
[root@openEuler ~]#

(2) 绑定VIP

# 添加虚拟地址
[root@openEuler ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.46.150/32

# 查看地址添加是否成功
[root@openEuler ~]# ip addr

(3) 修改相应的arp内核 --- RS端抑制ARP响应

[root@openEuler ~]# 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@openEuler ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
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@openEuler ~]#

提示:也可以使用 arptables 实现抑制 arp

bash 复制代码
arptables -A INPUT -d $VIP -j DROP
arptables -A OUTPUT -s $VIP -j mangle --mangle-ip-s $RIP
# arptables-save > /etc/sysconfig/arptables
# systemctl enable --now arptables

方法二:脚本配置

配置脚本如下:

bash 复制代码
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.46.150
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep lo:10 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-DR-RIP Server is already running !"
else
/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:10
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch $LOCK
echo "starting LVS-DR-RIP server is ok !"
fi
}
stop() {
/sbin/route del -host $VIP dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
rm -rf $LOCK
echo "stopping LVS-DR-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RIP Server is already running !"
else
echo "The LVS-DR-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
bash 复制代码
# 创建开机自启动脚本lvs_dr
[root@openEuler ~]# vim /etc/init.d/lvs_rs

# 设置编辑权限
[root@openEuler ~]# chmod +x /etc/init.d/lvs_rs

# 修改脚本内容
[root@openEuler ~]# vim /etc/init.d/lvs_rs
VIP=192.168.46.150

echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce

echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce


# 将 lvs_dr 服务添加到系统的服务列表中
[root@openEuler ~]# chkconfig --add lvs_rs

# 将 lvs_dr 服务设置为在系统运行级别 3、4 和 5 时自动启动
[root@openEuler ~]# chkconfig lvs_rs on

# 启动该服务
[root@openEuler ~]# systemctl start lvs_rs.service

# 查看服务是否启动
[root@openEuler ~]# systemctl status lvs_rs.service

# 查看是否运行脚本,存在VIP
[root@openEuler ~]# ip ad
bash 复制代码
# 查看是否配置成功
[root@openEuler ~]# route -n

[root@openEuler ~]# cat /proc/sys/net/ipv4/conf/ens160/arp_ignore
1
[root@openEuler ~]# cat /proc/sys/net/ipv4/conf/lo/arp_ignore
1

配置成功!

3. LVS调度器(DIP)

方法一:手动配置

(1)绑定VIP

# 添加虚拟地址
[root@openEuler ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.46.150/32

# 查看地址添加是否成功
[root@openEuler ~]# ip addr

(2)安装 ipvsadm

[root@openEuler yum.repos.d]# yum install -y ipvsadm

(3)添加相关配置

# 查看是否配置
[root@openEuler ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

# 进行配置
[root@openEuler ~]# ipvsadm -At 192.168.46.150:80 -s rr
[root@openEuler ~]# ipvsadm -at 192.168.46.150:80 -r 192.168.46.120:80 -g
[root@openEuler ~]# ipvsadm -at 192.168.46.150:80 -r 192.168.46.130:80 -g

# 查看
[root@openEuler ~]# 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.46.150:80 rr
  -> 192.168.46.120:80            Route   1      0          0
  -> 192.168.46.130:80            Route   1      0          0
[root@openEuler ~]#

方法二:脚本配置

配置脚本如下:

bash 复制代码
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
RIP1=192.168.95.11
RIP2=192.168.95.12
DipName=ens33
. /etc/rc.d/init.d/functions
start() {
PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
if [ $PID -gt 0 ];
then
echo "The LVS-DR Server is already running !"
else
#Set the Virtual IP Address
/sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask
255.255.255.255 up
/sbin/route add -host $VIP dev ${DipName}:10
#Clear IPVS Table
/sbin/ipvsadm -C
#Set Lvs
/sbin/ipvsadm -At $VIP:80 -s rr
/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g
/bin/touch $LOCK
#Run Lvs
echo "starting LVS-DR Server is ok !"
fi
}
stop() {
#clear Lvs and vip
/sbin/ipvsadm -C
/sbin/route del -host $VIP dev ${DipName}:10
/sbin/ifconfig ${DipName}:10 down >/dev/null
rm -rf $LOCK
echo "stopping LVS-DR server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR Server is already running !"
else
echo "The LVS-DR Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
bash 复制代码
# 创建开机自启动脚本lvs_dr
[root@openEuler ~]# vim /etc/init.d/lvs_dr

# 设置编辑权限
[root@openEuler ~]# chmod +x /etc/init.d/lvs_dr

# 修改脚本内容
[root@openEuler ~]# vim /etc/init.d/lvs_dr
VIP=192.168.46.150
RIP1=192.168.46.120
RIP2=192.168.46.130
DipName=ens160

# 将 lvs_dr 服务添加到系统的服务列表中
[root@openEuler ~]# chkconfig --add lvs_dr

# 将 lvs_dr 服务设置为在系统运行级别 3、4 和 5 时自动启动
[root@openEuler ~]# chkconfig lvs_dr on

# 启动该服务
[root@openEuler ~]# systemctl start lvs_dr.service

# 查看服务是否启动
[root@openEuler ~]# systemctl status lvs_dr.service

# 查看是否运行脚本,存在VIP
[root@openEuler ~]# ip ad
# 查看是否配置成功
root@openEuler ~]# ipvsadm -Ln

配置成功!

4. client **(CIP)**进行测试

[root@openEuler ~]# for ((i=1;i<=10;i++))

> do

> curl 192.168.46.150

> done

实验到此结束!

相关推荐
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
小金的学习笔记2 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
风口上的猪20153 小时前
thingboard告警信息格式美化
java·服务器·前端
Natsuagin3 小时前
轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
linux·windows·ubuntu·grub
我们的五年3 小时前
【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
linux·网络·http
xing.yu.CTF5 小时前
Web入侵实战分析-常见web攻击类应急处置实验2
运维·服务器·windows·web安全·apache·php漏洞·phpstudy后门漏洞
小池先生5 小时前
阿里云子账号管理ECS权限配置全指南
服务器·阿里云·云计算
我们的五年5 小时前
【Linux网络】TCP/IP地址的有机结合(有能力VS100%???),IP地址的介绍
linux·运维·网络·tcp/ip
davenian6 小时前
< OS 有关 > Ubuntu 24 SSH 服务器更换端口 in jp/us VPSs
linux·ubuntu·ssh