LVS的介绍与配置
1. LVS简介
Llvs是Linux Virtual Server的简写,意思是Linux虚拟服务器,是一个虚拟的服务器集群系统;是一个基于四层、具有强大性能的反向代理服务器。
如下图所示:终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式
2. lvs的三种工作模式
2.1 第一种工作模式基于NAT模式的LVS模式负载均衡
NAT即网络地址转换,就是通过修改数据报头,使企业内容的私有IP转换为可以访问外网,以及外部用户可以访问企业内部的私有IP地址。就使多个目标的DNAT(也就是源、目IP转换);客户端访问服务器的请求与响应都需要经过调度器。
2.1.1LVS-NAT的优点与缺点
优点:
- 支持端口映射
- RS可以使用任意操作系统
- 节省公有IP地址
缺点: - 请求和响应报文都要经过调度器进行转发,到负载过高时,就会影响整个集群。
2.2 第二种工作模式基于TUN的LVS负载均衡
TUN是基于隧道封装技术。我们知道NAT模式在集群环境中,由于所有的数据的请求和响应的数据包都需要经过LVS调度器进行转发,所以如果后端的服务器达到一定的数量,则调度器就会成为整个系统的瓶颈。我们知道,数据包请求远小于响应数据包的大小。因为响应数据包中含有客户端需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实的服务器响应数据包直接返回给客户端。
2.2.1 TUN的优点与缺点
优点:
RIP,VIP,DIP都应该使用公网地址,且RS网关不指向DIP
缺点:
- 因为不指向调度器所以不支持端口映射。
- RS的OS必须支持隧道功能
- 隧道技术会额外花费性能,增大开销。
2.3 第三种工作模式基于DR的LVS负载均衡
在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
2.3.1 DR的优缺点
优点:
- RIP可以使用私有地址,也可以使用公网地址。(在同一网段即可)
- 请求报文经过调度器,但是响应报文不经过调度器。
- RS可以使用大多数OS
缺点:
- 不支持端口映射
- 不能跨局域网
三种模式各有优缺点,但是由于追求性能和便捷,DR是目前用得最多的LVS模式。
3. LVS的八种调度方法
3.1 静态调度方法:仅依据算法本身进行轮询调度
- RR:轮询调度(一个接一个,自上而下)
- WRR:加权论调(加权,能者多劳)
- SH:将来自同一个地方的IP地址请求调度到同一个realserver上
- DH:不管IP,请求的特定的东西,都发往同一个RS
3.2 动态调度方法:
- LC(最小链接数)链接最少,也就是over head最小就调度给谁。如果一样就根据配置的RS进行自上而下的调度
- WLC(加权最小连接数)这个是LVS的默认算法
- SED(最小期望延迟)WLC算法改进的
- NQ:SED算法改进。根据SED算法每台主机第一次至少要均分配一次,然后再按SED算法来挑选。
环境说明:
系统 | 主机名 | IP地址 | 角色 |
---|---|---|---|
Redhat8.2 | Redhat8 | 192.168.182.141(DIP) 192.168.85.129(VIP) | Director |
centos7.5 | centos7 | 192.168.182.130 | RealServer |
centos7.5 | centos7-1 | 192.168.182.131 | RealServer |
NAT模式
三台服务器分别配置了对应的本地静态地址DIP和VIP,且在一个内网中。
DR有两块网卡,一块IP是内网的DIP,另一块IP是公网IP的VIP
RS的网关指向DIP
4. 配置LVS-NAT
//DR这台需要两块,一块IP作为内网DIP,另一块作为公网IP的VIP
[root@redhat8 ~]# ip a
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:18:28:7e brd ff:ff:ff:ff:ff:ff
inet 192.168.182.141/24 brd 192.168.182.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe18:287e/64 scope link
valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:18:28:88 brd ff:ff:ff:ff:ff:ff
inet 192.168.85.129/24 brd 192.168.85.255 scope global dynamic noprefixroute ens224
centos7网关指向DR
若没有route命令请执行yum -y install net-tools命令
[root@centos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
PREFIX=24
IPADDR=192.168.182.130
GATEWAY=192.168.182.141
DNS1=192.168.182.2
[root@centos7 ~]# ifdown ens33 ; ifup ens33
成功断开设备 'ens33'。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@centos7 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.182.141 0.0.0.0 UG 100 0 0 ens33
192.168.182.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
centos7-1网关指向DR
[root@centos7-1 ~]# ifdown ens33 ; ifup ens33
成功断开设备 'ens33'。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@centos7-1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
PREFIX=24
IPADDR=192.168.182.131
GATEWAY=192.168.182.141
DNS1=192.168.182.2
DR上开启IP转发
[root@redhat8 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@redhat8 ~]# sysctl -p
net.ipv4.ip_forward = 1
DR上配置LVS-NAT的转发机制
[root@redhat8 ~]# yum -y install ipvsadm.x86_64
[root@redhat8 ~]# ipvsadm -At 192.168.85.129:80 -s rr
[root@redhat8 ~]# ipvsadm -at 192.168.85.129:80 -r 192.168.182.130:80 -m
[root@redhat8 ~]# ipvsadm -at 192.168.85.129:80 -r 192.168.182.131:80 -m
保存配置信息并查看规则
[root@redhat8 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@redhat8 ~]# 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.85.129:80 rr
-> 192.168.182.130:80 Masq 1 0 0
-> 192.168.182.131:80 Masq 1 0 0
在RealServer主机上安装httpd,进行测试
[root@centos7 ~]# yum -y install httpd
[root@centos7 ~]# echo 'centos1' > /var/www/html/index.html
[root@centos7 ~]# systemctl restart httpd.service
[root@centos7-1 ~]# yum -y install httpd
[root@centos7-1 ~]# echo 'centos2' > /var/www/html/index.html
[root@centos7-1 ~]# systemctl restart httpd.service
5. LVS-DR模式
DR配置
LVS是被编译进内核中,主要分为两部分ipvs和ipvsadm,ipvs是LVS软件核心,是运行在LB上的,这是个基于ip层的负载均衡;ipvsadm是用户空间的集群管理工具。
要想起到负载均衡效果,那么所有请求报文必须发往LVS服务器(DS),然后DS根据指定算法分发到后端服务器上,因此DS必须配置VIP地址,VIP是与公网client通信地址,这样DS才能接受到请求报文进行分发。
一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告。
DR的VIP 和 RS 必须在同一个网段,不然广播后所有的包都会丢掉: 提前确认LVS/硬件LB 是什么模式,是否需要在同一个网段 所有的RS都必须绑定VIP的IP地址,否则RS收到package后发现dst 不是自己的IP,所有包都会丢掉。 RS处理完包后直接把package 通过dst IP 发送给 client ,不通过LVS/迎接IP 了这样的LVS /VIP 效率会更高一点。
配置(Director)上IP
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
DEVICE=ens160
NAME=ens160
IPADDR=192.168.182.142
IPADDR1=192.168.182.110
PREFIX=24
GATEWAY=192.168.182.2
DNS1=192.168.182.2
重启网卡使其生效
[root@DR ~]# ifdown ens160 ; ifup ens160
在RealServer主机上配置内核参数,两台rs同样的操作
[root@rs1 ~]# vim /etc/sysctl.conf
[root@rs1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@rs2 ~]# vim /etc/sysctl.conf
[root@rs2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
在RS上配置VIP
一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告。
将DR服务器IP为192.168.182.110作为VIP
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
PREFIX=24
IPADDR=192.168.182.130
IPADDR1=192.168.182.110
GATEWAY=192.168.182.2
DNS1=192.168.182.2
[root@rs1 ~]# ifdown ens33 ; ifup ens33
[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
PREFIX=24
IPADDR=192.168.182.131
IPADDR1=192.168.182.110
GATEWAY=192.168.182.2
DNS1=192.168.182.2
[root@rs2 ~]# ifdown ens33 ; ifup ens33
在DR上配置DR转发规则
首先安装ipvsadm
[root@DR ~]# yum -y install ipvsadm.x86_64
[root@DR ~]# ipvsadm -A -t 192.168.182.110:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.182.110:80 -r 192.168.182.130:80
[root@DR ~]# ipvsadm -a -t 192.168.182.110:80 -r 192.168.182.131:80
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.182.110:80 -s rr
-a -t 192.168.182.110:80 -r 192.168.182.130:80 -g -w 1
-a -t 192.168.182.110:80 -r 192.168.182.131:80 -g -w 1
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl enable --now ipvsadm.service
安装httpd并测试
[root@rs1 ~]# yum -y install httpd
[root@rs1 ~]# echo 'rs1' > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd
[root@rs2 ~]# yum -y install httpd
[root@rs2 ~]# echo 'rs2' > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd