LVS 负载均衡

LVS 负载均衡

1. LVS 简介

LVS(Linux Virtual Server)即 Linux 虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前已被集成到 Linux 内核模块中。LVS 在 Linux 内核中实现了基于 IP 的数据请求负载均衡调度方案。

终端互联网用户从外部访问公司的负载均衡服务器,其 Web 请求会发送给 LVS 调度器。调度器根据预设的算法(如轮询算法)将请求分发至后端的某台 Web 服务器。即使请求被转发到后端真实服务器,只要这些服务器连接相同的存储并提供相同的服务,用户所获得的服务内容就是一致的,整个集群对用户是透明的。

根据工作模式的不同,真实服务器会选择不同的方式将数据发送给终端用户。LVS 支持三种工作模式:NAT 模式、TUN 模式和 DR 模式。

VIP :虚拟 IP(Virtual IP)
RIP:真实 IP(Real IP)

官方站点:http://www.linuxvirtualserver.org


2. 体系结构

使用 LVS 架设的服务器集群系统由三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。

  • 负载均衡层(Load Balancer):位于集群最前端,由一台或多台负载调度器(Director Server)组成。LVS 模块安装在 Director Server 上,其作用类似于路由器,根据设定的路由表将用户请求分发给后端的 Real Server。同时,Director Server 还安装有监控模块 Ldirectord,用于检测 Real Server 的健康状态,并在服务器不可用时将其从路由表中剔除。
  • 服务器群组层(Server Array):由一组实际运行应用服务的机器(Real Server)组成,可以是 Web、Mail、FTP、DNS 或视频服务器等。Real Server 之间通过高速 LAN 或 WAN 相连。Director Server 也可兼任 Real Server 的角色。
  • 共享存储层(Shared Storage):为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

Director Server 是 LVS 的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。


3. LVS 管理工具

ipvs

  • 内核中实现的协议栈,基于 IP 层的负载均衡。
  • 结构包括 IP 包处理、负载均衡算法、系统配置管理模块,以及虚拟服务器与真实服务器链表。
  • 可同时管理多个集群服务,但可能影响调度性能。
  • 每个服务至少应有一个 Real Server。

ipvsadm

用户空间的命令行工具,用于管理集群服务:

常用选项:
  • -A:添加集群服务
  • -E:修改集群服务
  • -D:删除虚拟服务
  • -C:清空整个表
  • -R:从标准输入重载
  • -S:保存到标准输出
  • -a:添加 Real Server
  • -e:修改 Real Server
  • -d:删除 Real Server
  • -L/-l:列出表
  • -t:TCP 服务地址 host[:port]
  • -u:UDP 服务地址 host[:port]
  • -r:Real Server 地址和端口(仅支持端口映射类型)
  • -g:DR(direct routing default) 模式(默认)
  • -i:TUN 模式
  • -m:NAT 模式
  • -w:实际服务器容器,指定权重
  • -n:以数字格式显示 IP 和端口(须在 -L 之后使用)
常用命令示例:
Ipvsadm核心功能

集群服务管理:增、删、改

集群服务的RS管理:增、删、改

bash 复制代码
ipvsadm -A -t IP:PORT -s rr
ipvsadm -a -t IP:PORT -r IP:PORT -g/-m/-i
ipvsadm -Ln
保存与重载配置:
bash 复制代码
#保存
#建议保存在 /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
ipvsadm -Sn > /etc/sysconfig/ipvsadm
#重载
ipvsadm -R < /etc/sysconfig/ipvsadm
systemctl restart ipvsadm

4. LVS 工作模式及原理

NAT模式:

通过网络地址转换实现的虚拟服务器

大并发访问时,调度器的性能成为瓶颈

DR模式:

直接使用路由技术实现虚拟服务器

节点服务器需要配置VIP,注意MAC地址广播

TUN模式:

通过隧道方式实现虚拟服务

NAT 模式(Network Address Translation)

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

注意事项

  • Real Server 的网关必须指向 LVS。
  • 所有请求和响应都经过 LB,易成为性能瓶颈,一般最多支持 10-20 个节点。
  • 只需在 LB 上配置公网 IP。
  • 支持端口转换。

特点

  • NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候 LB 负载均衡调度器有比较大的瓶颈,一般要求最多只能 10-20 台节点
  • 只需要在 LB 上配置一个公网 IP 地址就可以了。
  • 每台内部的 realserver 服务器的网关地址必须是调度器 LB 的内网地址。
  • NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。

NAT模式的优缺点

优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址

缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!


DR 模式(Direct Routing)

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

特点:

  • 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

  • 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS

  • RS发现请求报文中的目的MAC是自己,就会将此报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意事项

  • 需设置 lo 接口的 VIP 不响应 ARP 请求。
  • LB 和 Real Server 必须在同一局域网。

TUN 模式(Tunneling)

LVS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器

特点:

  • 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

  • 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

  • RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理此请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

优缺点

优点:LB 只分发请求,响应直接返回,性能高,支持跨地域。

缺点:Real Server 需有合法 IP,且需支持 IP 隧道协议(通常仅限 Linux)。


5. LVS 调度算法

静态调度算法(4 种):

  1. 轮询(rr):均等的对待每一台服务器,不管服务器上的实际连接数和系统负载
  2. 加权轮询(wrr):调度器可以自动问询真实服务器的负载情况,并动态调整权值
  3. 源地址散列(sh):与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
  4. 目标地址散列(dh):该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

动态调度算法(6 种):

  1. 最少连接(lc) :动态地将网络请求调度到已建立的连接数最少的服务器上
    如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
  2. 加权最少连接(wlc) :调度器可以自动问询真实服务器的负载情况,并动态调整权值
    带权重的谁不干活就给谁分配,机器配置好的权重高
  3. 基于局部性的最少连接(lblc):这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
  4. 复杂的基于局部性的最少连接(lblcr):记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高
  5. 最少期望延迟(sed):不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
  6. 永不排队(nq):无需队列,如果有realserver的连接数为0就直接分配过去

6. 配置 LVS-NAT 模式的 HTTP 负载集群

环境说明:

主机名称 网卡信息(ens160为nat、ens192为仅主机) 安装应用 系统
Client(客户端) 192.168.100.200 (ens160) Rocky Linux 9
DR DIP:192.168.100.10 (ens160) ipvsadm Rocky Linux 9
VIP:172.16.30.10 (ens192)
RS1 RIP:192.168.100.20 (ens160) httpd Rocky Linux 9
gw:192.168.100.10
RS2 RIP:192.168.100.30 (ens160) httpd Rocky Linux 9
gw:192.168.100.10

步骤:

  1. 关闭防火墙和 SELinux(DR、RS1、RS2)。
bash 复制代码
[root@dr ~] systemctl stop firewalld
[root@dr ~] systemctl disable firewalld
[root@dr ~] cat /etc/sysconfig/selinux 
SELINUX=disabled

[root@rs1 ~] systemctl stop firewalld
[root@rs1 ~] systemctl disable firewalld
[root@rs1 ~] cat /etc/sysconfig/selinux 
SELINUX=disabled

[root@rs2 ~] systemctl stop firewalld
[root@rs2 ~] systemctl disable firewalld
[root@rs2 ~] cat /etc/sysconfig/selinux 
SELINUX=disabled

2.配置 IP 信息(注意网关指向)。

bash 复制代码
DR:
添加ens192网卡信息仅主机
[root@dr ~] nmcli connection add con-name ens192 ifname ens192 type ethernet
[root@dr ~] vim /etc/sysconfig/network-scripts/ifcfg-ens160
.....省略
IPADDR=192.168.100.10
PREFIX=24
DNS1=8.8.8.8

[root@dr ~] vim /etc/sysconfig/network-scripts/ifcfg-ens192
IPADDR=172.16.30.10
PREFIX=24
DNS1=8.8.8.8
[root@dr ~] systemctl restart NetworkManager
[root@dr ~] nmcli connection up ens160
[root@dr ~] nmcli connection up ens192

RS1: 
[root@rs1 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens160
.....省略
IPADDR=192.168.100.20
PREFIX=24
GATEWAY=192.168.100.10
DNS1=8.8.8.8
[root@rs1 ~] systemctl restart NetworkManager
[root@rs1 ~] nmcli connection up ens160

RS2: 
[root@rs2 ~] vim /etc/sysconfig/network-scripts/ifcfg-ens160
.....省略
IPADDR=192.168.100.20
PREFIX=24
GATEWAY=192.168.100.10
DNS1=8.8.8.8
[root@rs2 ~] systemctl restart NetworkManager
[root@rs2 ~] nmcli connection up ens160

3.在 RS1 和 RS2 上安装并启动 httpd。

bash 复制代码
RS1:
[root@rs1 ~] yum -y install httpd
[root@rs1 ~] echo RS1 > /var/www/html/index.html
[root@rs1 ~] systemctl restart httpd
[root@rs1 ~] systemctl enable httpd

RS2:
[root@rs2 ~] yum -y install httpd
[root@rs2 ~] echo RS1 > /var/www/html/index.html
[root@rs2 ~] systemctl restart httpd
[root@rs2 ~] systemctl enable httpd

4.在 DR 上开启 IP 转发,安装 ipvsadm,添加规则。

bash 复制代码
(1)开启IP转发功能
[root@dr ~] vim /etc/sysctl.con
net.ipv4.ip_forward = 1
[root@dr ~] sysctl -p
net.ipv4.ip_forward = 1

(2)安装ipvsadm并添加规则
[root@dr ~] yum -y install ipvsadm
[root@dr ~] ipvsadm -A -t 172.16.30.10:80 -s rr
[root@dr ~] ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.20:80 -m
[root@dr ~] ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.30:80 -m
[root@dr ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.10:80 rr
  -> 192.168.100.20:80            Masq    1      0          0         
  -> 192.168.100.30:80            Masq    1      0          0

[root@dr ~] ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@dr ~] systemctl restart ipvsadm.service
[root@dr ~] systemctl enable ipvsadm.service

5.客户端测试。

bash 复制代码
//配置好ip信息
测试:
[root@client ~] curl http://172.16.30.10
RS1
[root@client ~] curl http://172.16.30.10
RS2
[root@client ~] curl http://172.16.30.10
RS1
[root@client ~] curl http://172.16.30.10
RS2

7. 配置 LVS-NAT 模式的 HTTPS 负载集群

步骤:

  1. 在DR中生成一对密钥
bash 复制代码
[root@dr ~] mkdir  -p  /etc/pki/CA/private
[root@dr ~] cd /etc/pki/CA/
[root@dr CA] (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
....+++++
e is 65537 (0x010001)

[root@dr CA] openssl rsa -in private/cakey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzNr8CYxSRlURYJNuBfqI
1ZzjUVblHXZipOszi9lKLlX8FQ+a4pse+v5UZcyyG+UYQLK926qq07I/tZBV0kez
mLHf3/d+ihiUuG346MjbQQBBZy90yJ6L6h2prnBmc9LlRcvIwd5xC6yGDyywlbik
q0Hh4x/sWubSDor/XCn6A5N8K15MNOa6q1Ii6E8FDGG4nfti6a026xLoT9cD5Nel
/hNWvXG1CbVmRwttGOtMzPRQj8PC7Pg07l66L+F+EXyembllXkOjkK+GixF+CO6b
6xI8QKYIWytXM31vhyBDu9waId+TEipIjCJ8v7qKTd779Yrl6pLaQf+Ge98O9+Lp
4wIDAQAB
-----END PUBLIC KEY-----

[root@dr CA] openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:HY
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:chenyu
Email Address []:cy@example.com

[root@dr CA] touch index.txt && echo 01 > serial

2.在RS1中生成证书签署请求,并发送给CA

bash 复制代码
[root@rs1 ~] yum -y install mod_ssl
[root@rs1 ~] mkdir /etc/httpd/ssl
[root@rs1 ~] cd /etc/httpd/ssl/
[root@rs1 ssl] (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.................+++++
.................................+++++
e is 65537 (0x010001)
[root@rs1 ssl] openssl req -new -key httpd.key -days 1024 -out httpd.csr
Ignoring -days; not generating a certificate
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:HY
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:chenyu
Email Address []:cy@example.com        

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[root@rs1 ssl] ls
httpd.csr  httpd.key
[root@rs1 ssl] scp httpd.csr root@192.168.100.10:/root/
root@192.168.100.10's password: 
httpd.csr                                                                     100% 1029     2.4MB/s   00:00    

3.在DR中查看

bash 复制代码
[root@dr ~] ls
1                Desktop    Downloads  initial-setup-ks.cfg  Pictures  Templates
anaconda-ks.cfg  Documents  httpd.csr  Music                 Public    Videos
  1. CA签署证书并发给RS1
bash 复制代码
[root@dr ~] mkdir /etc/pki/CA/newcerts
[root@dr ~] touch /etc/pki/CA/index.txt
[root@dr ~] echo "01" > /etc/pki/CA/serial
[root@dr ~] openssl ca -in httpd.csr -out httpd.crt -days 1024
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 26 00:41:05 2022 GMT
            Not After : Jul 16 00:41:05 2025 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = HB
            organizationName          = HY
            organizationalUnitName    = linux
            commonName                = chenyu
            emailAddress              = cy@example.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                7C:21:ED:62:12:75:5D:D7:1E:E3:F6:2D:74:26:D0:EF:4A:0E:99:88
            X509v3 Authority Key Identifier: 
                keyid:37:A4:94:F4:F5:56:9F:4E:37:9B:0B:78:9D:50:74:CA:6C:D5:84:D0

Certificate is to be certified until Jul 16 00:41:05 2025 GMT (1024 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

[root@dr ~] ls
1                Desktop    Downloads  httpd.csr             Music     Public     Videos
anaconda-ks.cfg  Documents  httpd.crt  initial-setup-ks.cfg  Pictures  Templates

5.将CA签署的证书httpd.crt和服务器的证书cacert.pem发送给RS1

bash 复制代码
[root@dr ~] scp httpd.crt root@192.168.100.20:/etc/httpd/ssl
[root@dr ~] scp /etc/pki/CA/cacert.pem root@192.168.100.20:/etc/httpd/ssl

6.RS2配置https

bash 复制代码
[root@rs2 ~] yum -y install mod_ssl
[root@rs2 ~] mkdir /etc/httpd/ssl

7.RS1中把RS1的证书和密钥发送给RS2

bash 复制代码
[root@rs1 ssl] scp cacert.pem httpd.crt httpd.key root@192.168.100.30:/etc/httpd/ssl

8.在RS1中修改https的配置文件

bash 复制代码
[root@rs1 ssl] vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
SSLCACertificateFile /etc/httpd/ssl/cacert.pem
[root@rs1 ssl] systemctl restart httpd
[root@rs1 ssl] ss -tnl | grep 443
LISTEN    0         128                      *:443                    *:*       

9.在RS2中修改https的配置文件

bash 复制代码
[root@rs2 ssl] vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
SSLCACertificateFile /etc/httpd/ssl/cacert.pem
[root@rs2 ssl] systemctl restart httpd

10.在DR中添加规则

bash 复制代码
[root@dr ~] ipvsadm -A -t 172.16.30.10:443 -s rr
[root@dr ~] ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.20 -m
[root@dr ~] ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.30 -m
[root@dr ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.10:80 rr
  -> 192.168.100.20:80            Masq    1      0          0         
  -> 192.168.100.30:80            Masq    1      0          0         
TCP  172.16.30.10:443 rr
  -> 192.168.100.20:443           Masq    1      0          0         
  -> 192.168.100.30:443           Masq    1      0          0         
[root@dr ~] ipvsadm -Sn > /etc/sysconfig/ipvsadm

11.客户端测试

bash 复制代码
[root@client ~] curl -k https://172.16.30.10:443
RS2
[root@client ~] curl -k https://172.16.30.10:443
RS1
[root@client ~] curl -k https://172.16.30.10:443
RS2
[root@client ~] curl -k https://172.16.30.10:443
RS1

8. 配置 LVS-DR 模式的 HTTP 负载集群

环境说明:

  • Lvs服务器(DR) DIP 192.168.100.10 VIP 192.168.100.100
  • Apache服务器(RS1) RIP 192.168.100.20 VIP 192.168.100.100
  • Apache服务器(RS2) RIP 192.168.100.30 VIP 192.168.100.100
  • client客户端 IP 192.168.100.200

步骤:

配置httpd

RS1:

bash 复制代码
#关闭防火墙和selinux
[root@rs1 ~] systemctl stop firewalld
[root@rs1 ~] systemctl disable firewalld
[root@rs1 ~] cat /etc/sysconfig/selinux 
SELINUX=disabled
bash 复制代码
#安装httpd
[root@rs1 ~] yum -y install httpd
[root@rs1 ~] echo "RS1" > /var/www/html/index.html
[root@rs1 ~] systemctl restart httpd
[root@rs1 ~] systemctl enable httpd

RS2:

bash 复制代码
#关闭防火墙和selinux
[root@rs2 ~] systemctl stop firewalld
[root@rs2 ~] systemctl disable firewalld
[root@rs2 ~] cat /etc/sysconfig/selinux 
SELINUX=disabled
bash 复制代码
#安装httpd
[root@rs2 ~] yum -y install httpd
[root@rs2 ~] echo "RS2" > /var/www/html/index.html
[root@rs2 ~] systemctl restart httpd
[root@rs2 ~] systemctl enable httpd

LVS上配置ip

DR:

bash 复制代码
#关闭防火墙和selinux
[root@dr ~] systemctl stop firewalld
[root@dr ~] systemctl disable firewalld
[root@dr ~] cat /etc/sysconfig/selinux 
SELINUX=disabled
bash 复制代码
#添加ip
[root@dr ~] ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
[root@dr ~] ip a
bash 复制代码
#RS上配置arp内核参数,RS1和RS2上都需要操作
 vim /etc/sysctl.conf
#将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_ignore = 1
#将ARP请求的源IP设置为所有接口的IP,也就是RIP
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

RS上配置VIP

一定要先配置好内核参数,再配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告。
LVS服务器的ens160网卡的ip:192.168.100.100作为VIP

两台RS都要做

RS1:

bash 复制代码
[root@rs1 ~] ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up

RS2:

bash 复制代码
[root@rs2 ~] ifconfig lo 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up

添加路由信息

RS1:

bash 复制代码
[root@rs1 ~] route add -host 192.168.100.100/32 dev lo

RS2:

bash 复制代码
[root@rs2 ~] route add -host 192.168.100.100/32 dev lo

添加并保存规则

bash 复制代码
[root@dr ~] ipvsadm -A -t 192.168.100.100:80 -s rr
[root@dr ~] ipvsadm -a -t 192.168.100.100:80  -r  192.168.100.20:80 -g
[root@dr ~] ipvsadm -a -t 192.168.100.100:80  -r  192.168.100.30:80 -g
[root@dr ~] ipvsadm -Ln
[root@dr ~] ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@dr ~] systemctl restart ipvsadm
[root@dr ~] systemctl enable ipvsadm

客户端验证

RS2

bash 复制代码
[root@client ~] curl http://192.168.100.100

RS1

bash 复制代码
[root@client ~] curl http://192.168.100.100

RS2

bash 复制代码
[root@client ~] curl http://192.168.100.100

RS1

bash 复制代码
[root@client ~] curl http://192.168.100.100 

9. 配置 LVS-TUN 模式的 HTTP 负载集群

步骤:

DR:

关闭防火墙和selinux

bash 复制代码
#修改内核参数,开启IP转发 
[root@dr ~] vim /etc/sysctl.conf 
[root@dr ~] sysctl -p
net.ipv4.ip_forward = 1
[root@dr ~] 
[root@dr ~] yum -y install ipvsadm
[root@dr ~] ifconfig tunl0 192.168.100.55 broadcast 192.168.100.55 netmask 255.255.255.255 up

RS1和RS2(两台主机操作一样)

关闭防火墙和selinux,部署httpd

启用ipip模块

bash 复制代码
[root@rs2 ~] modprobe ipip
[root@rs2 ~] ifconfig tunl0 192.168.100.55 broadcast 192.168.100.55 netmask 255.255.255.255 up

修改内核参数为

bash 复制代码
[root@rs2 ~] sysctl -p
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

DR上添加规则

bash 复制代码
[root@dr ~] ipvsadm -A -t 192.168.100.55:80 -s rr
[root@dr ~] ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.20 -i
[root@dr ~] ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.30 -i
[root@dr ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags

启用ipip模块

bash 复制代码
[root@rs2 ~] modprobe ipip
[root@rs2 ~] ifconfig tunl0 192.168.100.55 broadcast 192.168.100.55 netmask 255.255.255.255 up

修改内核参数为

bash 复制代码
[root@rs2 ~] sysctl -p
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

DR上添加规则

bash 复制代码
[root@dr ~] ipvsadm -A -t 192.168.100.55:80 -s rr
[root@dr ~] ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.20 -i
[root@dr ~] ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.30 -i
[root@dr ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags

相关推荐
Akshsjsjenjd4 小时前
LVS:Linux 内核级负载均衡的架构设计、三种工作模式与十大调度算法详解
linux·负载均衡·lvs
再睡亿分钟!4 小时前
思考:客户端负载均衡和服务器负载均衡有什么区别?
java·开发语言·微服务·负载均衡
九河云5 小时前
华为云 ELB:智慧负载均衡,让您的应用永葆流畅体验
运维·服务器·科技·华为云·负载均衡
上海文顺负载箱5 小时前
燃料电池负载均衡测试:解锁高效供能密码
运维·负载均衡·燃料电池
-dcr6 小时前
16.Linux RAID 存储技术
linux·运维·服务器
斯普信专业组6 小时前
SkyWalking 核心概念与智能探针工作原理深度揭秘(上)
运维·skywalking
yuanManGan6 小时前
走进Linux的世界:gdb的使用
linux·运维·服务器
ZYMFZ6 小时前
Linux系统Nginx服务(二)
linux·运维·nginx
维尔切6 小时前
MySQL 主从复制
linux·运维·数据库·mysql·adb