当前位置: 首页 > article >正文

web集群(LVS-DR)

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是 www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在 Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已 经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。 使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用 的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。 LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩 的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点 播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站( w.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司( ww www.real.com)、全球最大的开 源网站(sourceforge.net)等。

LVS-DR模式工作原理

首先,来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将 请求发送到集群节点或真实服务器。然后,集群某个节点将回复该数据包,并将该数据包直接发送到客 户端计算机(不经过director),并且以此回复数据包使用的目的VIP 地址作为源IP地址。因此,实际上 是客户计算机被“欺骗”了,客户计算机始终认为它正与同一台计算机对话,而实际上它正在发送请求数 据包给一台计算机(LB),并从另一台计算机(RS)接收回复的数据包。

LVS-DR模式应用特点

1)所有集群节点RS必须和Director在相同的物理网段(即同一个局域网中);

2)所有客户端入站(而不是出站)请求由Director首先接收,并转发给集群节点RS;

3)集群节点RS通常来说最好带外部IP,而不使用Director及某固定机器作为默认网关,以便将数据包直 接回复给客户端计算机,且不会产生回包的瓶颈;

4)所有集群节点RS上必须在lo网卡上绑定VIP地址,以便验证通过目的IP非RS的数据包;

5)由于所有集群节点RS上必须在lo网卡上绑定VIP地址,因此,带来arp问题,即集群节点RS默认会相 应发往Director VIP的数据包。因此要对所有集群节点RS做ARP抑制处理,把响应VIP的请求交给LVS Director;

6)很多操作系统都可以用在集群内部的RS真实服务器上只要该操作系统能够实现ARP隐藏,如: Windows,linux,unix;

7)LVS/DR模式不需要开启调度器转发功能,这点和LVS/NAT模式是不同的。

8)LVS/DR Director(服务器数量100台)可以比LVS-NAT Director(服务器数量10-20台)承受更多的 并发请求和转发更多的服务器数量。

ipvsadm工具使用

ipvsadm工具常用的参数选项有:

-A --add-service添加一条新的虚拟服务

-E --edit-service编辑虚拟服务

-D --delete-service删除虚拟服务

-C --clear清除所有的虚拟服务规则

-R --restore恢复虚拟服务规则

-a --add-server在一个虚拟服务中添加一个新的真实服务器

-e --edit-server编辑某个真实服务器

-d --delete-server删除某个真实服务器

-L | -l --list显示内核中的虚拟服务规则

-n --numeric以数字形式显示IP端口

-c --connection显示ipvs中目前存在的连接,也可以用于分析调度情况

-Z --zero将转发消息的统计清零

-p --persistent配置持久化时间

--set tcp tcpfin udp配置三个超时时间(tcp/tcpfin/udp)

-t | -u TCP/UDP协议的虚拟服务

-g | -m | -i LVS模式为:DR | NAT | TUN-w配置真实服务器的权重

-s配置负载均衡算法,如:rr, wrr, lc等--timeout显示配置的tcp/tcpfin/udp超时时间

--stats显示历史转发消息统计(累加值)

--rate显示转发速率信息(瞬时值)

实验部分

手动配置部分

准备三台实验机:Rocky 8.10,IP地址192.168.126.13{0..132},其中130为DS服务器,其余为RS服务器

为了验证效果,先在131,132主机上面安装nginx服务

systemctl stop firewalld 
setenforce 0
dnf install nginx -y
echo "this is a test page which from ip:$(hostname -I)" > /usr/share/nginx/html/index.html
systemctl start nginx

 添加虚拟IP地址,这里有两种方式:

nmcli con add type dummy ifname lvsTest ipv4.method manual ipv4.addresses 192.168.126.140/32
ifconfig ens160:10 192.168.126.140 broadcast 192.168.126.140 netmask 255.255.255.255 up

 上面是两种不同的方式配置虚拟IP地址,选一种进行执行即可,一般建议不是脚本类执行的话可以考虑nmcli,否则ifconfig

  • nmcli:适用于创建虚拟接口和持久化配置,适合现代系统和复杂网络配置。

  • ifconfig:适用于在同一物理接口上绑定多个 IP 地址,适合临时配置和简单场景。

ARP抑制

在RS主机上面需要配置ARP抑制,要不然当ARP包寻求140这个虚拟主机时候,它会和DS一同响应。

echo '1' >  /proc/sys/net/ipv4/conf/lvsTest/arp_ignore
echo '2' >  /proc/sys/net/ipv4/conf/lvsTest/arp_announce

 0 -(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。

1 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求。

2 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。

以上的内容请配置于所有的RS服务器

配置DS服务器

dnf install ipvsadm -y
nmcli con add type dummy ifname lvsTest ipv4.method manual ipv4.addresses 192.168.126.140/32
#添加规则
ipvsadm -At 192.168.126.140:80 -s rr -p20
ipvsadm -at 192.168.126.140:80 -r 192.168.126.131:80 
ipvsadm -at 192.168.126.140:80 -r 192.168.126.132:80 

[root@host130 ~]# 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.126.140:80 rr
  -> 192.168.126.131:80           Route   1      0          2
  -> 192.168.126.132:80           Route   1      0          3

 此时打开一个终端cmd,直接访问140这个IP地址

 以上就是反复在131和132之间访问,下面进行脚本部署

自动化脚本配置

先把RS服务的关于140的ARP服务给打开

echo '0' >  /proc/sys/net/ipv4/conf/lvsTest/arp_ignore
echo '0' >  /proc/sys/net/ipv4/conf/lvsTest/arp_announce

删除nmcli添加的虚拟IP,我们后续使用ifconfig配置

nmcli con del dummy-lvsTest
Connection 'dummy-lvsTest' (c6e1603c-640a-4a98-96f6-d36fadcf813c) successfully deleted.

 RS的系统服务脚本:在/etc/init.d/目录下面创建一个名为LVSRS的脚本

vim /etc/init.d/LVSRS


#!/bin/sh
#chkconfig: - 28 72
#description: Initialise the Linux Virtual Server for DR
#Provides: ipvsadm
#Required-Start: $local_fs $network $named
#Required-Stop: $local_fs $network $remote_fs
LOCK=/var/local/ipvsadm.lock
VIP=192.168.126.140
DevName=ens160
. /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 broadcast $VIP netmask 255.255.255.255 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/${DevName}/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/${DevName}/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/${DevName}/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/${DevName}/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

上面使用回环地址来创建,而不是直接创建一个虚拟接口,原因:

  • lo:10 是本地回环接口的别名,通常用于本地通信,数据包不会离开主机。

  • ens160:10 是一个物理网络接口的别名(虚拟接口),通常用于实际的网络通信。

我们的DS服务会使用ens160创建一个虚拟接口,vim /etc/init.d/LVSDS

 #!/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

 LOCK=/var/lock/ipvsadm.lock
 VIP=192.168.126.140
 RIP1=192.168.126.131
 RIP2=192.168.126.132
DipName=ens160
 . /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

以上脚本增加执行权限chmod + x

添加到系统服务chkconfig --add LVSRS

启动systemctl start LVSRS,下面就表示已经启动了。

 [root@host130 ~]# systemctl restart LVSDS
[root@host130 ~]# systemctl status LVSDS
● LVSRS.service - LSB: Initialise the Linux Virtual Server for DR
   Loaded: loaded (/etc/rc.d/init.d/LVSRS; generated)
   Active: active (exited) since Thu 2025-02-13 07:08:09 EST; 16s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2217 ExecStart=/etc/rc.d/init.d/LVSRS start (code=exited, status=0/SUCCESS)
Feb 13 07:08:09 host130 systemd[1]: Starting LSB: Initialise the Linux Virtual Server>
Feb 13 07:08:09 host130 LVSRS[2217]: The LVS-DR Server is already running !
Feb 13 07:08:09 host130 systemd[1]: Started LSB: Initialise the Linux Virtual Server >

 RS同上

验证效果:


http://www.kler.cn/a/546950.html

相关文章:

  • 【k8s应用管理】kubernetes lngress资源管理
  • Python学习笔记 ver1.0
  • (ICLR-2025)你只采样一次:通过自协作扩散 GAN 驯服一步文本到图像合成
  • HTML的入门
  • windows平台上 oracle简单操作手册
  • 【二叉树学习7】
  • Eclipse:关闭多余的工具条
  • Docker compose 以及镜像使用
  • Sprinig源码解析
  • [LeetCode]day21 15.三数之和
  • Machine Learning:Optimization
  • H5自适应响应式代理记账与财政咨询服务类PbootCMS网站模板 – HTML5财务会计类网站源码下载
  • HCIA项目实践---OSPF的基本配置
  • 在本地校验密码或弱口令 (windows)
  • DeepSeek免费部署到WPS或Office
  • Linux 内核 IPoIB 驱动中 sysfs 属性冲突问题的分析与解决
  • LAWS是典型的人机环境系统
  • 【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】
  • Unity使用iTextSharp导出PDF-04图形
  • 修改OnlyOffice编辑器默认字体