LVS作为一款优秀的负载均衡软件,一直受到很多企业的青睐,虽然性能比不上价格昂贵的负载均衡硬件,但对于大部分的业务场景,LVS还是能出色地胜任的。LVS工作在网络的第四层,内核的tcp/ip栈上,这也决定了它在所有负载均衡软件中性能是最好的。
一、LVS
1. LVS的介绍
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
LVS主要由两部分组成,一个是工作在用户空间的ipvsadm,另一个是工作在内核上的ipvs。ipvsadm主要负载管理集群服务,包括添加、删除、修改集群服务、对数据包进行监控等,真正起到负载均衡的是ipvs。ipvs主要监听在INPUT钩子函数中,一旦发现用户请求的是集群服务,ipvs会将数据包forward到POSTROUTING的钩子函数上,然后转发给后端的realserver。
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
2. 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:主要是提高上一层数据和为上一层保持数据一致。
3. 专用术语
- VS:virtual server,director,dispatcher
- RS:real server
- CIP:客户读ip
- VIP:用于接受客户端通信的ip
- DIP:用于调度器与realserver通信的ip
-
RIP:用于提供真正服务的ip
4. LVS的四种模式
LVS的四种模式主要是为了实现服务器的负载均衡。
(1)VS/NAT模式
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肯定会不堪重负。
(2)VS/TUN隧道模式
VS/TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
(3)VS/DR直接路由模式
VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
(4)fullNAT模式
fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。fullNAT需要转化访问来源,访问目的ip需要编译内核,导致了效率的低下。
5. 十种调度算法
LVS负载均衡调度算法主要有轮询调度(rr)、加权轮询调度(wrr)、最小连接调度(lc)、加权最小连接调度(wlc)、基于局部的最少连接(lblc)、带复制的基于局部性的最少连接(lblcr)、目标地址散列调度(dh)、源地址散列调度U(sh)、最短的期望的延迟(sed)、最少队列调度(nq)
二、LVS中DR模式的部署
实验准备:
- 一台lvs调度器server1(安装ipvsadm)172.25.65.1
- 两台后端服务器(安装httpd)server2(172.25.65.2)和server3(172.25.65.3)
- 一台测试机
server1:
yum install -y ipvsadm
vim /etc/sysconfig/ipvsadm-config #修改为重启服务后写入策略
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
开启服务时,会报错,我们查看日志文件,找出错误。在开启服务之前,我们需要创建一个文件,服务会自动识别该服务,识别不到则会报错。
在lvs中添加策略,指定实现负载均衡的模式为DR直接路由模式,在添加过程中要注意的是,添加的策略要在服务重启后才能被写入,之前在ipvsdam-config配置文件中已经设置过了。
ipvsadm -A -t 172.25.65.100:80 -s rr #添加虚拟lvs的策略为轮询
ipvsadm -a -t 172.25.65.100:80 -r 172.25.65.2:80 -g #添加后端服务器
ipvsadm -a -t 172.25.65.100:80 -r 172.25.65.3:80 -g
#其中,-A:添加虚拟服务 -t:tcp -s:调度方式 -a:添加真实服务器 -r:真实服务器的ip -g:直接路由模式dr
ipvsadm -ln #不解析,查看策略
cat /etc/sysconfig/ipvsadm #查看策略文件
在调度器中添加vip(用户请求的入口ip)
server2和server3同时进行如下操作
yum install httpd -y
vim /var/www/html/index.html
systemctl restart httpd
ip addr add 172.25.65.100/24 dev eth0 #添加ip
测试机进行测试
curl 172.25.31.100 #测试网页
arp -an | grep 100 #查看该主机所访问到的mac地址
arp -d 172.25.31.100 #清除mac信息
我们会发现开始访问时,客户端一至访问的是server2的内容,没有进行轮询,那是因为lvs和两个后端服务器的vip均相同,客户端会直接请求后端服务器,而不经过lvs调度器,这样的情况是不允许的。而后通过mac地址的清理,页面的内容发生了改变,但这样的操作也不能实现我们的负载均衡目的,为此我们需要对后端服务器进行如下操作,使它不接收直接来自客户端的请求,以实现客户端访问lvs,lvs进行访问请求的分配。
server2和server3中同时进行如下操作
yum install -y arptables
arptables -A INPUT -d 172.25.65.100 -j DROP #将访问100的包丢弃
arptables -A OUTPUT -s 172.25.65.100 -j mangle --mangle-ip-s 172.25.65.2 #回包
# -d:目的ip -A:添加 -s:源地址 -j:动作
arptables -nL #查看策略是否写入
arptables-save > /etc/sysconfig/arptables #将策略写入文件
cat /etc/sysconfig/arptables #该文件存放策略
systemctl start arptablescat #必须先将策略存入文件,在开启,未存入,启动后策略会丢失
arptables -F #清除策略
测试机进行测试
curl 172.25.65.100
客户端发出请求,lvs调度器会接收该请求,并根据调度器中所写的策略,将客户请求分别发送到后端服务器上,以实现负载均衡。