LVS
LVS简介
一. LVS是什么?
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
二. lvs能做什么?
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
三.工作原理
1.Load Balancer
:这是LVS的核心部分,它好比我们网站MVC模型的Controller
。它负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server
组成。
2.Server Array
:该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server
等组成。注意,其实上层的Director Server
也可以当Real server
用的。
3.Shared Storage
:主要是提高上一层数据和为上一层保持数据一致。
四.负载均衡机制
前面我们说了LVS是工作在网络层。相对于其它负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上面,在Director Server虚拟一个对外访问的IP(VIP)。用户访问VIP,到达Director Server,Director Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。这些步骤产生了一些具体的问题,比如如何选择具体的Real Server,Real Server如果返回给客户端数据等等。IPVS为此有三种机制:
1.VS/NAT(Virtual Server via Network Address Translation),即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real Server。Real Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。
客户端要访问后端真实的服务器,由于服务器是公网的地址,所以客户端将请求发送给调度器的vip,调度器收到后将原来cip的基础之上封装了一下dip,然后把dip当做源把真实服务器的rip当做目标去访问服务器真实ip,真实服务器收到后会进行解封装,发现要访问的目标是自己,就会处理客户的请求封装成响应报文,然后把自己的rip当做源把调度器的cip当做目标回应给调度器的cip(dip),调度器在cip的基础上封装一层VIP发送给客户端的cip。
2.VS/TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
3.VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
DR模式的工作流程:
客户端的CIP向LVS的VIP发送请求,这里虽然调度器和RS上都有VIP,但是请求报文必须经过调度器,所以RS端需要配置关闭通告,所以只有调度器上的VIP才能接收客户端的请求,LVS服务器(调度器)收到请求后会进行封装,通过算法算出应该把请求发送给后端的哪一台RS服务器,RS服务器收到请求后会解封装,解封装后发现对方找的是VIP,刚好自己有VIP所以会处理请求,处理好请求后将封装成响应报文发送给客户端的CIP,此时不需要经过调度器,源ip为真实服务器的RIP目的IP为客户端的CIP。
Director:调度器要配置VIP,DIP
RSs:所有的Real Server都要配置RIP,VIP
lvs-dr的特点:
保证前段路由将目标ip为VIP的请求报文发送给director,解决方法:
- 静态绑定
- arptables
修改RS主机内核的2个参数:
arp_announce:是否接受并记录别人的通告以及是否通告自己的mac地址给别人。
arp_announce有三个可选值,0,1,2,其意义如下:
0(default 默认是0):通告自己所拥有的所有地址
1:尽量不通告与自己不再同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,但是尽量不通告,有可能还是会通告
2:总是不通告与自己不再同一个网段的地址,绝不通告。 - arp_ignore:是否相应arp请求(有9个可选值0-8)
0(default 默认是0):回应任何网络接口上对任何本地ip地址的arp请求
1:请求报文从那个接口进入的且请求的目标地址就是此接口配置的地址才响应,否则不响应
2:只回答目标ip地址是来访问网络接口 本地地址的arp查询请求,且来防ip必须在该网络接口的子网段内
3.不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应
4-7:保留未使用
8:不回应所有(本地地址)的arp查询
RS的RIP可以使用私有地址,也可以使用公网地址
RS跟Director必须在同一物理网段网络中,中间不能有路由器相隔
请求报文可以经过Director调度,但响应报文一定不能经过Director
不支持端口映射
RS的网关不能指向DIP
五. 具体配置操作
Lvs——Dr
环境说明:
角色 | ip地址 | 应用 | 操作系统 |
---|---|---|---|
Director | 192.168.100.100 | ipvsadm | centos7/redhat7 |
Rs1 | 192.168.100.200 | httpd/nginx | centos7/redhat7 |
Rs2 | 192.168.100.250 | httpd/nginx | centos7/redhat7 |
Vip | 192.168.100.111 | \ | \ |
Director端开启ip转发功能
echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/00-system.conf
Rs端关闭通告
# 在 /etc/sysctl.conf 文件下加上以下两行 ,Rs1和Rs2都要关
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 1
配置VIP
## 所有服务器都配置vip,网卡配置信息如下:
TYPE=Ethernet
BOOTPROTO=static
NAME=ens38
DEVICE=ens38
ONBOOT=yes
IPADDR=192.168.100.111
NETMASK=255.255.255.0
配置路由信息
# RS 和 Director端都要配置
[root@Director ~]# route add -host 192.168.10.111 dev ens38
[root@Director ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.111 0.0.0.0 255.255.255.255 UH 0 0 0 ens38
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.100.0 0.0.0.0 255.255.255.0 U 101 0 0 ens38
安装ipvsadm工具
# director 端配置即可
yum -y install ipvsadm
添加规则
[root@Director network-scripts]# ipvsadm -A -t 192.168.100.111:80 -s rr
[root@Director network-scripts]# ipvsadm -a -t 192.168.100.111:80 -r 192.168.100.200:80 -g
[root@Director network-scripts]# ipvsadm -a -t 192.168.100.111:80 -r 192.168.100.250:80 -g
[root@Director network-scripts]# 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.100.111:80 rr
-> 192.168.100.200:80 Route 1 0 0
-> 192.168.100.250:80 Route 1 0 0
# 保存规则
[root@Director network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@Director network-scripts]# systemctl enable ipvsadm
两台Rs安装httpd
# 或者是nginx也可
yum -y install httpd
echo "Im Rs1" > /var/www/html/index.html #Rs2输入Im Rs2
systemctl start httpd
验证:浏览器输入http://192.168.100.111/