LVS负载均衡

释放双眼,带上耳机,听听看~!

LVS负载均衡

  • Linux cluster

    • LVS
  • LVS体系结构

  • LVS集群类型以及调度算法
    * LVS-NAT
    * LVS-DR
    * LVS-tun
    * LVS-fullnat
    * LVS调度算法

    
    
    1
    2
    1  * ipvsadm
    2
  • lvs-nat

  • 实现NAT类型的https访问

    
    
    1
    2
    1      * LVS-DR
    2
  • VIP和DIP处在同一网段实现
    * VIP和DIP不处在同一网段实现

Linux cluster

Linux集群简单来说就是部署许多计算机(服务器)来共同协作完成一个任务。一个计算机称作集群的一个节点。
集群的优势:

  • 易于扩展,管理可以方便的对服务器进行增、删
  • 高可用性,当集群中的某一个节点失效,会有其它节点的机器自动顶上去。不会影响业务的进行
  • 高性能,负载均衡的机器可以将请求均衡的分发至各个服务器,大大减轻服务器承载的压力

常见的集群方式:

  • LB集群(Load Balancing):负载均衡集群,就是将用户的请求合理的分发至各个服务器上
  • HA集群(High Availiablity):高可用集群,当某台服务器出现单点故障时,服务不会中断,而是交由其它运行正常的服务器接管。
  • HP集群(High Performance):高性能的集群是当某一项任务计算量非常大的时候,由一个计算机集群共同来完成这项任务,这种 处理方式我们称为并行处理机制。一般高性能集群用于科研工作方面

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。从linux内核的2.4版本之后内置了LVS的各个模块。可以直接使用。
LVS工作在网络模型的第四层,直接在内核中实现各种功能,也就无需监听套接字,所以摆脱了套接字数量的限制。
lvs的优缺点(转载):
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,保证了均衡器IO的性能不会受到大流量的影响;

2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;

3、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;

4、应用范围比较广,可以对所有应用做负载均衡,不管是http还是ssh协议都可以使用lvs;

5、软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。

6、如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。

7、性能非常卓越,已经在多个公司使用可靠性也非常不错,并且是开源项目,可以修改源代码定制自己的需求

LVS体系结构

LVS负载均衡
结合上图来解释LVS的构建结构

  • Director Server:最前端的服务器,用来接收用户的请求报文,然后根据调度算法将用户的请求分发至后面的Real Server上。此处非常重要,因为它的健康与否直接影响了用户的访问结果,所以它一般都为两台,一台用来为用户提供服务,一台用来监听服务的那台机器。一旦服务的那台机器挂掉,就需要另一台立马顶上,并拥有它所有的资源。
  • Real Server:提供服务的真正主机。它可以是web服务,ftp服务等。如何来监控它们的健康状态。可以在Director Server上安装Ldirectord来监听Real Server的健康状况。
  • 数据:共享存储,假如用户在Real Server1上访问时,往购物车里加物品。第二次再访问时却分发到了Real Server2上。如果没有共享存储,用户会发现购物车里之前添加的东西都没有了。所以共享存储主要是为了各个服务器之间的资源统一性。

Director Server必须是linux或者freeBSD。而Real Server可以是大部分操作系统。

LVS集群类型以及调度算法

由于LVS是直接工作在内核中,跟iptables类似,需要用一个应用程序专门向内核中传递参数以达到添加规则的方法。lvs在内核中是由ipvs模块来实现的。利用ipvsadm程序来向ipvs模块中定义规则。为了后面便于书写,将如下名称简化:

VS
Virtual Server 调度器,也叫Director
RS
Real Server
CIP
客户端IP
VIP
Virtual IP , 虚拟IP
RIP
后端主机IP
DIP
Director IP,与RS通信的IP

当用户请求资源时,调度器(VS)是怎么将资源发送给后方的RS节点的以及RS在响应时怎么响应?LVS集群类型主要以下几种类型:

LVS-NAT

LVS负载均衡

  • 客户端CIP通过网络中的路由到达处在公网的VIP
  • VIP接收到用户请求,进入自己的防火墙规则,发现访问的是本机进程。直接在INPUT链上进行lvs策略转换
  • lvs将客户端CIP访问的目标地址VIP,转变为后端真正实现服务的RIP地址上。所以变成了src:CIP,dest:RIP。经过POSTROUTING到达后端的real server
  • real server响应的时候,仍然原路返回,此时的src:RIP,dest:CIP。等到从VIP网卡出去的时候,会将RIP该为VIP进行响应。这是因为客户端就访问的VIP,我们仍然用VIP来响应。RIP虽然也可以进行响应,但是客户端只是想访问VIP,我们如果用RIP的话,客户端不会接受响应。

根据上述有以下几点:

  • VIP必须是公网,可以接受用户的访问
  • RIP和DIP必须在一个本地网络,且应该使用私网地址,RS的网关需要指向DIP,如果都指向了公网,就没有意义了,用户可以直接访问到RS。 这是不被允许的。

这就有一个问题,不管响应还是请求,都要经过调度器,这样调度承载的压力就大大增加。压力越大,越容易崩溃。

LVS-DR

LVS负载均衡
用户向VIP发起请求,调度器在源目标CIP和目标VIP之外在封装一个源DIPMAC地址和目标RIPMAC地址(为挑选出来的RSMAC地址)。然后在将这四个地址一起发送给挑选出来的RS。响应时,RS先拆除两个MAC地址,发现请求的目标VIP是本机地址,然后直接将结果返回给CIP。而不再经过调度器。
dr类型有以下几个要点:

  • vs和各RS上都要有VIP
  • 确保用户的请求目标为VIP的报文发送给调度器,因为RS上也有VIP,所以要对RS上VIP进行限制,以防用户发送的请求直接发到了RS上。后面示例会写到。直接调整内核参数即可。
  • RS的RIP可以是私网地址,也可以是公网地址,但是RIP和VIP要在同一个物理网段上,RIP的网关不能指向DIP,以确保RS可以直接响应用户,而不是由Director响应。
  • RS上的VIP要设置回环接口lo上,使用ARP限制VIP。稍后配置会说到。

LVS-tun

LVS负载均衡
tun模型也称为隧道模型,由调度器把请求报文发送至某一个Real Server上。然后由Real Server直接响应给客户。有以下几个要点:

  • DIP在向RS发送请求报文时,对最原始的源CIP/目标VIP不进行修改,而是在外面在添加一层IP,即源DIP和目标RIP。
  • DIP,RIP,VIP应该都是公网地址,并且RS可以处在不同的地方。
  • RS的网关不会指向DIP
  • 请求可以经过VS,但是响应不能经由VS。

LVS-fullnat

LVS负载均衡
简单来说就是将请求报文和响应报文全部进行修改。根据上图进行解释:

  • 用户发起请求,源目标CIP/目标VIP
  • 调度发现用户请求需要发送给RS,然后修改源CIP/目标VIP成源DIP/目标RIP(RS1)
  • RS1收到请求后,将响应报文原路返回,这时源RIP/目标DIP
  • 调度器将响应报文再次修改,最后变成源VIP/目标CIP响应给客户

fullnat由几个要点:

  • VIP是公网地址,DIP和RIP都是私网地址,且不再同一段网络,RIP的网关不要指向DIP
  • RS收到的源地址IP是DIP,响应也一定要给DIP,最后由DIP转发给VIP响应给客户。
  • 请求和响应报文都要流经VS

LVS调度算法

根据其调度时是否考虑各RS当前的负载状态,分为静态方法和动态方法:
静态方法:根据算法本身进行调度

  • RR:轮询(roundrobin),即1:1进行分配,不考虑负载均衡。比如三台服务器,每一台都有10个请求,即使后两台都已经处理完,第一台仍在处理请求。进来最新的请求也会发送给第一台
  • WRR:加权轮询(weight RR)。比如两台服务器,两台的权重比2:1,那么发送的请求就是212。
  • SH:源地址哈希(Source Hashing) 。将来自于同一个IP的请求始终发往第一次挑中的RS,实现会话绑定。
  • DH:目标地址哈希(Destination Hashing)。将发往同一个目标地址的请求始终转发至第一次挑中的RS。

动态方法:根据每RS当前的负载状态以及调度算法进行调度

  • LC:最少连接数(least connections ),简单来说就是将新的请求发送给目前连接组少的服务器
  • WLC:加权最少连接数(Weighted LC),是LC的升级版,将新请求平均分配到服务器上,以符合服务器之间的权重比。
  • SED:最短期望延时(Shortest Expection Delay),基于WLC算法
  • NQ:从不排队(Never Queue),直接将新请求发送给空闲的RS
  • LBLC:基于局部性的最少连接数(Locality-Based LC),相当于DH和LC算法的集合,用来将目标地址IP调度到同一个服务端,如果该服务端负载正常,则继续发往该服务器端。如果该服务端负载已经超过一半以上,就按照LC规则发送到最少连接数上的一个服务器上。
  • LBLCR:带复制功能的LBLC(LBLC with Replication)

ipvsadm

用来向集群服务定义规则。常用选项如下:

-A
添加一条新的虚拟服务
-E
编辑虚拟服务
-D
删除虚拟服务
-C
清楚虚拟服务的规则
-R
恢复虚拟服务的规则
-a
在一个新的虚拟服务上面添加一条新的服务器
-e
编辑某个真实的服务器
-d
删除某个真实的服务器
-L|l
显示内核中的虚拟服务器的规则
-n
以数字形式显示ip端口
-c
显示ipvs目前以存在的连接
-Z
将转发的消息计数清零
-p
配置持久化时间
-A
添加一条新的虚拟服务
-t|-u
tcp或udp的虚拟服务协议
-g|-m|-i
lvs模型:DR,NAT,TUN
-w
配置真实服务器的权重
-s
配合均衡负载算法

  • -timeout

显示配置的tcp/udp超时时间

  • -stats

显示历史消息转发统计

  • -rate

显示转发速率信息

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

  • 增/改:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
  • 删:ipvsadm -D -t|u|f service-address

示例:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2[root@directory ~]# ipvsadm -A -t 192.168.199.146:80 -s rr
3[root@directory ~]# ipvsadm -ln
4IP Virtual Server version 1.2.1 (size=4096)
5Prot LocalAddress:Port Scheduler Flags
6  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
7TCP  192.168.199.146:80 rr
8添加一条新的虚拟服务,算法是轮询
9
10[root@directory ~]# ipvsadm -D -t 192.168.199.146:80
11[root@directory ~]# ipvsadm
12IP Virtual Server version 1.2.1 (size=4096)
13Prot LocalAddress:Port Scheduler Flags
14  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
15删除虚拟服务
16
17

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

  • 增,改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  • 删: ipvsadm -d -t|u|f service-address -r server-address

示例:


1
2
3
4
5
6
7
8
9
10
11
12
13
1[root@directory ~]# ipvsadm -a -t 192.168.199.146:80 -r 192.168.199.230:80 -g
2[root@directory ~]# ipvsadm -ln
3IP Virtual Server version 1.2.1 (size=4096)
4Prot LocalAddress:Port Scheduler Flags
5  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
6TCP  192.168.199.146:80 rr
7  -> 192.168.199.230:80           Route   1      0          0        
8添加集群上的一条RS服务
9
10[root@directory ~]# ipvsadm -d -t 192.168.199.146:80 -r 192.168.199.230:80
11删除集群上的某条RS服务
12
13

lvs-nat

使用ipvsadm实现lvs-nat
LVS负载均衡
实现NAT模型有以下几点:

  • VS机器上有两张网卡,VIP接收用户请求,DIP向RS发送请求
  • RIP和DIP应该都在私网上,并且RIP网关指向DIP

VIP
192.168.199.157
DIP
192.168.192.129
RIP1
192.168.192.130
RIP2
192.168.192.128


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
1#准备好后端httpd主机准备好网页,以及主机的网关指向
2[root@http1 ~]# route -n
3Kernel IP routing table
4Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
50.0.0.0         192.168.192.129 0.0.0.0         UG    0      0        0 ens33
6
7[root@httpd2 ~]# route -n
8Kernel IP routing table
9Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
100.0.0.0         192.168.192.129 0.0.0.0         UG    0      0        0 ens33
11
12[root@http1 ~]# curl http://192.168.192.130
13httpd1
14
15[root@httpd2 ~]# curl http://192.168.192.128
16httpd2
17
18
19#添加lvs主机策略。
20[root@lvs ~]# ipvsadm -A -t 192.168.199.157:80 -s rr      添加以轮询方式访问
21#添加后端真正服务器
22[root@lvs ~]# ipvsadm -a -t 192.168.199.157:80 -r 192.168.192.130 -m
23[root@lvs ~]# ipvsadm -a -t 192.168.199.157:80 -r 192.168.192.128 -m
24
25[root@lvs ~]# ipvsadm -Ln
26IP Virtual Server version 1.2.1 (size=4096)
27Prot LocalAddress:Port Scheduler Flags
28  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
29TCP  192.168.199.157:80 rr
30  -> 192.168.192.128:80           Masq    1      0          0        
31  -> 192.168.192.130:80           Masq    1      0          0  
32
33#测试访问
34[root@client ~]# curl http://192.168.199.157
35httpd2
36[root@client ~]# curl http://192.168.199.157
37httpd1
38[root@client ~]# curl http://192.168.199.157
39httpd2
40[root@client ~]# curl http://192.168.199.157
41httpd1
42
43
44

NAT类型的端口映射


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1#首先将128主机上的web端口改为8080
2[root@httpd2 ~]# cat /etc/httpd/conf/httpd.conf | grep Listen
3Listen 8080
4
5[root@httpd2 ~]# ss -ntl | grep 8080
6LISTEN     0      128         :::8080                    :::*  
7
8#将策略修改成以下
9[root@lvs ~]# ipvsadm -Ln
10IP Virtual Server version 1.2.1 (size=4096)
11Prot LocalAddress:Port Scheduler Flags
12  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
13TCP  192.168.199.157:80 rr
14  -> 192.168.192.128:8080         Masq    1      0          0        
15  -> 192.168.192.130:80           Masq    1      0          0
16
17# 测试访问
18[root@client ~]# curl http://192.168.199.157
19httpd2
20[root@client ~]# curl http://192.168.199.157
21httpd1
22[root@client ~]# curl http://192.168.199.157
23httpd2
24[root@client ~]# curl http://192.168.199.157
25httpd1
26
27
28

实现NAT类型的https访问

这里不构建私有CA,直接创建自签证书,由于更换了IP,重新写一下IP地址

client
175
lvs
157(VIP)和 192.168.192.129(DIP)
httpd1
192.168.192.131
httpd2
192.168.192.128

1)在httpd主机上创建存放自签证书的目录/etc/httpd/tls


1
2
3
4
1[root@httpd2 httpd]# mkdir tls
2
3
4

2)在/etc/pki/tls/certs直接make生成自签证书。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1[root@httpd2 certs]# make ydong.com.crt
2umask 77 ; \
3/usr/bin/openssl req -utf8 -new -key ydong.com.key -x509 -days 365 -out ydong.com.crt
4Enter pass phrase for ydong.com.key:
5You are about to be asked to enter information that will be incorporated
6into your certificate request.
7What you are about to enter is what is called a Distinguished Name or a DN.
8There are quite a few fields but you can leave some blank
9For some fields there will be a default value,
10If you enter '.', the field will be left blank.
11-----
12Country Name (2 letter code) [XX]:CN
13State or Province Name (full name) []:beijing
14Locality Name (eg, city) [Default City]:beijing
15Organization Name (eg, company) [Default Company Ltd]:ydong.com                                
16Organizational Unit Name (eg, section) []:opt
17Common Name (eg, your name or your server's hostname) []:www.ydong.com
18Email Address []:
19[root@httpd2 certs]# ll
20total 20
21lrwxrwxrwx. 1 root root   49 Jan 13 23:35 ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
22lrwxrwxrwx. 1 root root   55 Jan 13 23:35 ca-bundle.trust.crt -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
23-rwxr-xr-x. 1 root root  610 Oct 30  2018 make-dummy-cert
24-rw-r--r--. 1 root root 2516 Oct 30  2018 Makefile
25-rwxr-xr-x. 1 root root  829 Oct 30  2018 renew-dummy-cert
26-rw-------  1 root root 1330 Apr  5 05:04 ydong.com.crt
27-rw-------  1 root root 1766 Apr  5 05:03 ydong.com.key
28
29
30
31

3)安装ssl模块


1
2
3
1[root@httpd2 certs]# yum install -y mod_ssl
2
3

4)将crt文件移动到/etc/httpd/tls目录下。


1
2
3
1[root@httpd2 certs]# mv ydong.com.* /etc/httpd/tls/
2
3

5)配置ssl.conf文件,修改以下两项


1
2
3
4
1SSLCertificateFile /etc/httpd/tls/ydong.com.crt
2SSLCertificateKeyFile /etc/httpd/tls/ydong.com.key
3
4

6)重启服务


1
2
3
4
1[root@httpd2 conf.d]# ss -tnl | grep 443
2LISTEN     0      128         :::443                     :::*            
3
4

7)在lvs端添加策略


1
2
3
4
5
6
7
8
9
10
11
12
13
1[root@lvs ~]# ipvsadm -A -t 192.168.199.157:443 -s rr
2[root@lvs ~]# ipvsadm -a -t 192.168.199.157:443 -r 192.168.192.131 -m
3[root@lvs ~]# ipvsadm -a -t 192.168.199.157:443 -r 192.168.192.128 -m
4[root@lvs ~]# ipvsadm -Ln
5IP Virtual Server version 1.2.1 (size=4096)
6Prot LocalAddress:Port Scheduler Flags
7  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
8TCP  192.168.199.157:443 rr
9  -> 192.168.192.128:443          Masq    1      0          0        
10  -> 192.168.192.131:443          Masq    1      0          0        
11
12
13

8)客户端测试


1
2
3
4
5
6
7
1[root@client ~]# curl -k https://192.168.199.157
2httpd2
3[root@client ~]# curl -k https://192.168.199.157
4httpd1
5
6
7

LVS-DR

VIP和DIP处在同一网段实现

LVS负载均衡
DR模型有以下几个要点:

  • VIP仍是公网,接收用户请求,RIP可以是私网,也可以是公网,但是要跟DIP在同一段物理网络
  • RS上配置VIP,并且对VIP进行抑制配置。
  • RIP网关不能指向DIP

关于抑制vip通告和响应需要设置arp_ignore(响应)和arp_announce(通告)
LVS负载均衡
限制响应级别arp_ignore:

  • 0:默认值,表示可使用本地上任意接口上配置的任意地址进行响应。意思是主机在1.1接口上请求2.1的接口时,也会给予响应。
  • 1:仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应。意思是主机在1.1接口上请求2.1的接口时,不给予响应。只有主机亲自去2.2接口上请求才给予响应

限制通告级别arp_announce:

  • 0:默认值,把本机上所有接口的所有信息向每个接口上的网络进行通信,通告所有主机上本机的网络mac。意思是主机即使只在1.1接口上,但是它可以获得本机所有的网络mac地址,1.1的mac,2.1的mac,3.1的mac。它都会收到
  • 1:尽量避免向非直接连接网络进行通告;
  • 2:必须避免向非本网络通告;意思就是1.1只通告给连接在自己接口上的主机,其它的一律不通告。

在RS上配置VIP时,需要将它的响应设置为1,通告级别设置成2。

1)首先配置路由具有转发功能


1
2
3
4
5
6
7
1[root@route ~]# vim /etc/sysctl.conf
2
3[root@route ~]# sysctl -p
4net.ipv4.ip_forward = 1
5
6
7

2)测试客户端是否ping通路由的192网段


1
2
3
4
5
6
7
8
9
10
11
12
1[root@localhost ~]# ping 192.168.192.100
2PING 192.168.192.100 (192.168.192.100) 56(84) bytes of data.
364 bytes from 192.168.192.100: icmp_seq=1 ttl=64 time=0.274 ms
4
5
6跨路由访问lvs
7[root@localhost ~]# ping 192.168.192.132
8PING 192.168.192.132 (192.168.192.132) 56(84) bytes of data.
964 bytes from 192.168.192.132: icmp_seq=1 ttl=63 time=0.423 ms  #可以看到ttl是63,证明跨了一个路由。
10
11
12

3)在httpd主机上设置VIP,到时vip会绑在lo回环网卡上


1
2
3
4
5
6
1[root@httpd1 ~]# echo "2"  > /proc/sys/net/ipv4/conf/all/arp_announce
2[root@httpd1 ~]# echo "2"  > /proc/sys/net/ipv4/conf/lo/arp_announce
3[root@httpd1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
4[root@httpd1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
5
6

4)将VIP地址绑定在lo上


1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2[root@httpd1 ~]# ip address  add 192.168.192.132 dev lo
3
4[root@httpd1 ~]# ip a
51: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
6    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7    inet 127.0.0.1/8 scope host lo
8       valid_lft forever preferred_lft forever
9    inet 192.168.192.132/32 scope global lo
10       valid_lft forever preferred_lft forever
11    inet6 ::1/128 scope host
12       valid_lft forever preferred_lft forever
13
14

5)定制lvs策略


1
2
3
4
5
6
7
8
9
10
1[root@lvs ~]# ipvsadm -Ln
2IP Virtual Server version 1.2.1 (size=4096)
3Prot LocalAddress:Port Scheduler Flags
4  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
5TCP  192.168.192.134:80 rr
6  -> 192.168.192.131:80           Route   1      0          13        
7  -> 192.168.192.133:80           Route   1      0          4      
8
9
10

6)client测试


1
2
3
4
5
6
7
8
9
10
11
1[root@client ~]# curl http://192.168.192.134
2httpd1
3[root@client ~]# curl http://192.168.192.134
4httpd2
5[root@client ~]# curl http://192.168.192.134
6httpd1
7[root@client ~]# curl http://192.168.192.134
8httpd2
9
10
11

PS:
同一网段的主机其实没太大作用,因为你可以直接访问后端真正的服务器,没必要在通过lvs多次一举。上边演示有几个小问题。

  • LVS上的VIP不是物理网卡上的ip地址,而是在一张物理网卡上新添加的地址,两张物理网卡的话,在real server上添加VIP时,可能会导致lvs上会出现没有到主机路由的情况。从而导致访问失败。
  • Real Server的网管应该指向route,而lvs的网关可以随意指向。仅限同一网段。因为返回的报文是不经过lvs的。

VIP和DIP不处在同一网段实现

LVS负载均衡
1)配置各主机的ip地址以及网关指向,测试client端是否能ping通lvs的VIP。


1
2
3
4
5
6
7
1[root@client ~]# ping 192.168.192.132
2PING 192.168.192.132 (192.168.192.132) 56(84) bytes of data.
364 bytes from 192.168.192.132: icmp_seq=1 ttl=63 time=0.328 ms
4#ttl=63,证明是跨路由了
5
6
7

2)对后端real server进行抑制arp广播


1
2
3
4
5
6
7
1[root@httpd1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
2[root@httpd1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
3[root@httpd1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
4[root@httpd1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
5
6
7

3)在real server上添加vip地址


1
2
3
4
1[root@httpd1 ~]# ip a a 192.168.192.132/32 dev lo
2
3
4

4)配置lvs服务器


1
2
3
4
5
6
7
8
9
10
1[root@lvs ~]# ipvsadm -Ln
2IP Virtual Server version 1.2.1 (size=4096)
3Prot LocalAddress:Port Scheduler Flags
4  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
5TCP  192.168.192.132:80 wrr
6  -> 172.16.0.101:80              Route   2      0          0        
7  -> 172.16.0.102:80              Route   1      0          0          
8
9
10

5)测试


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1[root@client ~]# curl http://192.168.192.132
2httpd2
3[root@client ~]# curl http://192.168.192.132
4httpd1
5[root@client ~]# curl http://192.168.192.132
6httpd1
7[root@client ~]# curl http://192.168.192.132
8httpd2
9[root@client ~]# curl http://192.168.192.132
10httpd1
11[root@client ~]# curl http://192.168.192.132
12httpd1
13[root@client ~]# curl http://192.168.192.132
14httpd2
15
16
17

PS

  • RIP的网关应该指向route的172地址段。

给TA打赏
共{{data.count}}人
人已打赏
安全经验

独立博客怎样申请谷歌Adsense

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索