lvs
1.lvs 简介
LVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
2.lvs 特点
- 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
- 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
- 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
- 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
- 支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
- 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等
3.lvs 常见的术语
术语 | 解释 |
---|---|
ipvsadm | 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等 |
IPVS | 工作于内核上的netfilter INPUT HOOK之上的程序,可根据用户定义的集群实现请求转发 |
VS | Virtual Server ,虚拟服务 |
Director, Balancer | 负载均衡器、分发器 |
RS | Real Server 后端请求处理服务器 |
CIP | Client IP,客户端IP |
VIP | Director Virtual IP,负载均衡器虚拟IP |
DIP | Director IP,负载均衡器IP |
RIP | Real Server IP,后端请求处理服务器IP |
4.lvs 工作原理
工作原理:
- 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
- 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
- LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
- 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
- 最后经由POSTROUTING链发往后端服务器。
LVS有很多种模式来供我们选择,生产场景中一般使用的都是NAT模式和DR模式,当然,也并不是说其他模式并不会使用,还是要根据实际的生产场景来决定选择什么样的方案。
4.1 lvs-NAT模式
Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器。
工作流程:
- 当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
- POSTROUTING链通过选路,将数据包发送给Real Server。
- Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
- Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
4.2 lvs-DR模式
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
工作流程:
客户端的CIP向LVS的VIP发送请求,这里虽然调度器和RS上都有VIP,但是请求报文必须经过调度器,所以RS端需要配置关闭通告,所以只有调度器上的VIP才能接收客户端的请求,LVS服务器(调度器)收到请求后会进行封装,通过算法算出应该把请求发送给后端的哪一台RS服务器,RS服务器收到请求后会解封装,解封装后发现对方找的是VIP,刚好自己有VIP所以会处理请求,处理好请求后将封装成响应报文发送给客户端的CIP,此时不需要经过调度器,源ip为真实服务器的RIP目的IP为客户端的CIP。
4.3 lvs-TUN模式
TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
工作流程:
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现。
5.lvs 配置
- ipvsadm的用法:
**ipvsadm 的用法和格式如下:**
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
#添加/编辑一条新的虚拟服务器记录。
ipvsadm -D -t|u|f virtual-service-address
#删除一条记录
ipvsadm -C
#清除所有记录
ipvsadm -R
#恢复虚拟服务器规则
ipvsadm -S [-n]
#保存虚拟服务器规则
命令选项解释:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-s --scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask netmask persistent granularity mask
- 配置:
主机名 | ip | 服务名 |
---|---|---|
lvs | 192.168.206.129 | 负载均衡器 |
rs1 | 192.168.206.130 | 后端服务器 |
rs2 | 192.168.206.131 | 后端服务器 |
**lvs调度器主机:**
配置之前请先确保虚拟机有ip。
下载ipvsadm:
yum install -y ipvsadm
配置添加一个vip:
语法: ifconfig ens33:0 vip/32 broadcast vip up
ifconfig ens33:0 192.168.206.250/32 broadcast 192.168.206.250 up
**rs1主机:**
配置之前请确保虚拟机有ip。
配置rip:
vim /etc/sysctl.conf
加入以下内容:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
检查(出现添加内容为成功):sysctl -p
配置vip:
语法: ifconfig lo:0 vip/32 broadcast vip up
ifconfig lo:0 192.168.206.250/32 broadcast 192.168.206.250 up
**rs2主机:**
配置之前请确保虚拟机有ip。
配置rip:
vim /etc/sysctl.conf
加入以下内容:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
检查(出现添加内容为成功):sysctl -p
配置vip:
语法: ifconfig lo:0 vip/32 broadcast vip up
ifconfig lo:0 192.168.206.250/32 broadcast 192.168.206.250 up
**配置路由信息:**
lvs上:
语法: route add -host vip dev interface:0
route add -host 192.168.206.250 dev ens33:0
rs1上:
route add -host 192.168.206.250 dev lo:0
rs2上:
route add -host 192.168.206.250 dev lo:0
**在lvs上执行添加并保存规则:**
语法:ipvsadm -A(添加) -t(tcp) vip:port -s wrr(算法)
ipvsadm -A -t 192.168.206.250:80 -s wrr
语法:ipvsadm -a -t(tcp) vip:port -r rip:port -g(DR模式)
ipvsadm -a -t 192.168.206.250:80 -r 192.168.206.130:80 -g
ipvsadm -a -t 192.168.206.250:80 -r 192.168.206.131:80 -g
保存规则:
ipvsadm -S > /etc/sysconfig/ipvsadm
关闭防火墙:
systemctl stop firewalld
**rs1主机上:**
systemctl stop firewalld
yum install -y httpd
cd /var/www/html
echo "123456789" > index.html
systemctl restart httpd
**rs2主机上:**
systemctl stop firewalld
yum install -y httpd
cd /var/www/html
echo "987654321" > index.html
systemctl restart httpd
- 验证:
多次刷新: