其他分享
首页 > 其他分享> > #####LVS负载均衡#####

#####LVS负载均衡#####

作者:互联网

###LVS(Linux虚拟机服务器)###

  1. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链

  2. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链

  3. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

###LVS DR模式和与原理###
.DR(Direct Routing)模式的网络结构:
1.重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
在这里插入图片描述
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
配置实验环境:

三台机器:
Director节点: (eth0: 172.25.46.1 vip eth0 172.25.46.100)
Real server2: (eth0: 172.25.46.2 vip lo 172.25.46.100)
Real server3: (eth0: 172.25.46.3 vip lo 172.25.46.100)

server2主机:
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
server2
[root@server2 html]# systemctl start httpd

server3主机:
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html
server3
[root@server3 html]# systemctl start httpd

[root@server1 ~]# ipvsadm -l   
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server1 ~]# ipvsadm -A -t 172.25.46.100:80 -s rr  ##-A添加一条新的虚拟服务  -t TCP协议的虚拟服务  -s 对后端主机的调度算法:轮巡
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.2:80 -g  ##给server2加vip
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.3:80 -g  ##给server3加vip
[root@server1 ~]# ipvsadm -l  ##显示调度次数
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.46.100:http rr
  -> 172.25.46.2:http             Route   1      0          0         
  -> 172.25.46.3:http             Route   1      0          0         

添加vip
给所有服务器把VIP地址配在各自的网络设备上

server1主机:

 [root@serve[root@server1 ~]# ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:d9:67:4d brd ff:ff:ff:ff:ff:ff
    inet 172.25.46.1/24 brd 172.25.46.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fed9:674d/64 scope link 
       valid_lft forever preferred_lft forever
[root@server1 ~]# ip addr add 172.25.46.100/24 dev eth0
[root@server1 ~]# ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:d9:67:4d brd ff:ff:ff:ff:ff:ff
    inet 172.25.46.1/24 brd 172.25.46.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.25.46.100/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fed9:674d/64 scope link 
       valid_lft forever preferred_lft forever
server2主机:
[root@server2 html]# ip addr add 172.25.46.100/24 dev eth0

server3主机:
[root@server3 html]# ip addr add 172.25.46.100/24 dev eth0

测试:
server2、server3都可能被访问到 (此时设置的轮询策略还没开始实施,当调度器发送请求时两个主机都会抢请求)
在这里插入图片描述

[root@foundation46 ~]# arp -an | grep 172.25.46.100  ##查看绑定的MAC地址
? (172.25.46.100) at 52:54:00:41:f0:9f [ether] on br0
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# arp -d 172.25.46.100  ##删除MAC绑定的地址
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# curl 172.25.46.100
server3
[root@foundation46 ~]# arp -an | grep 172.25.46.100
? (172.25.46.100) at 52:54:00:41:f0:9f [ether] on br0
[root@foundation46 ~]# arp -d 172.25.46.100
[root@foundation46 ~]# curl 172.25.46.100
server2

server1主机:  
[root@server1 ~]# ipvsadm -l  ##显示调度
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http rr
  -> 172.25.46.2:http             Route   1      0          0     ##请求并未经过调度器,而是server3自己抢占成功
  -> 172.25.46.3:http             Route   1      0          0         

为了避免以上情况的发生(抢占),就要绑定调度器的MAC地址编写调度策略轮询
给server2、server3安装 arptables.x86_64
为arptables网络的用户控制过滤的守护进程

server2主机
[root@server2 html]# yum install -y arptables.x86_64
[root@server2 html]# arptables -A INPUT -d 172.25.46.100 -j DROP  
[root@server2 html]# arptables -A OUTPUT -s 172.25.46.100 -j mangle --mangle-ip-s 172.25.46.2
[root@server2 html]# arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server2 

Chain OUTPUT (policy ACCEPT)
-j mangle -s server2 --mangle-ip-s server2 

Chain FORWARD (policy ACCEPT)

server3主机:
[root@server3 html]# yum install -y arptables.x86_64
[root@server3 html]# arptables -A INPUT -d 172.25.46.100 -j DROP
[root@server3 html]#  arptables -A OUTPUT -s 172.25.46.100 -j mangle --mangle-ip-s 172.25.46.3
[root@server3 html]#  arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server3 

Chain OUTPUT (policy ACCEPT)
-j mangle -s server3 --mangle-ip-s 172.25.46.2 
-j mangle -s server3 --mangle-ip-s server3 

Chain FORWARD (policy ACCEPT)

测试:
在这里插入图片描述
在这里插入图片描述
调度算法:加权轮询
调度器server1 编辑,server2、server3不变

[root@server1 ~]# ipvsadm -C  #删除所有策略
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server1 ~]# ipvsadm -A -t 172.25.46.100:80 -s wrr  ##加权调度策略
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.2:80 -g -w 3  ##设置3次
[root@server1 ~]# ipvsadm -a -t 172.25.46.100:80 -r 172.25.46.3:80 -g -w 1  ##一次
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http wrr
  -> 172.25.46.2:http             Route   3      0          0         
  -> 172.25.46.3:http             Route   1      0          0  
       [root@server1 ~]# ipvsadm -S
-A -t server1:http -s wrr
-a -t server1:http -r 172.25.46.2:http -g -w 3
-a -t server1:http -r 172.25.46.3:http -g -w 1

测试:
在这里插入图片描述
在这里插入图片描述
###DR模式下的LVS健康检查(ldirectord)###
为什么需要健康检查?
如果后端真实服务器出现问题,那么在测试端测试的时候会返回一个错误页面;对后端服务器作健康检查可以保证只返回正确的页面
server3httpd关闭出现错误页面:(不做健康检查时)
在这里插入图片描述
安装ldirectord
先配置HighAvailability的yum源
在这里插入图片描述
在这里插入图片描述
安装 ldirectord-3.9.5-3.1.x86_64.rpm

[root@server1 ~]# ls
ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 
[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm   #安装成功自动生成以下配置文件
warning: ldirectord-3.9.5-3.1.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 7b709911: NOKEY
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.5
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz

编辑配置文件

[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http wrr
  -> 172.25.46.2:http             Route   3      0          0         
  -> 172.25.46.3:http             Route   1      0          0         
[root@server1 ha.d]# ipvsadm -C
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# vim ldirectord.cf 
#Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
#logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no

 #Sample for an http virtual service
virtual=172.25.46.100:80
        real=172.25.46.2:80 gate
        real=172.25.46.3:80 gate
        fallback=127.0.0.1:80 gate
        service=http
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        #receive="Test Page"
        #virtualhost=www.x.y.z

[root@server1 ha.d]# systemctl start ldirectord #开启服务
测试:
后端真实服务器都正常的时候:实行轮询
在这里插入图片描述
server3宕机
[root@server3 html]# systemctl stop httpd
只会调度server2
在这里插入图片描述
给server1安装httpd并设置前端访问页面,将所有的服务都宕掉server1会顶替
在这里插入图片描述
开启server3的服务,会自动跳转到server3
[root@server3 html]# systemctl start httpd

在这里插入图片描述

标签:负载,LVS,server1,server3,服务器,172.25,#####,46.100,root
来源: https://blog.csdn.net/weixin_44821839/article/details/92800827