一、工作原理
1.1 数据流向
LVS-NAT模型是利用了NAT的特性,NAT为”Network Address Translation”的缩写,译为”网络地址转换”。
LVS-NAT模型的结构示意图:
从上图可以看出,LVS服务器是直接面向客户端的,所以,LVS服务器必须有一个公网IP,才能服务在互联网上,我们称配置在LVS服务器上的公网IP为VIP,即Virtual IP,在LVS-NAT模型中,负载均衡集群内部的主机都是通过内网IP通讯的,也就是说,LVS-NAT集群内部的主机需要在相同网段的内网中,而集群中的每个主机均配置有一个内网IP,LVS服务器当然也属于负载均衡集群内部的主机,所以它也需要配置一个内网IP,我们称配置在LVS服务器上的内网IP为DIP,可以理解为Director IP,也就是负责调度的导演IP,而每个RealServe上都有一个与DIP在同一网段的内网IP,我们称配置在RealServer上的内网IP为RIP,我们将客户端的IP简称为Client IP ,即CIP。
既然LVS-NAT模型是利用了”网络地址转换”的特性,那么,在整个过程中,报文的IP到底发生了怎样的转换呢?通过如下示意图,即可明白报文IP的 转换过程,为了使示意图更加简洁明了,图中只画出了一个RealServer,同时,我们可以配合图下方的描述,来理解报文中IP被转换的整个过程。
正如上图所示,客户端的请求会发往LVS主机,此时,客户端请求报文的源IP为CIP,目标IP为LVS的VIP,当LVS收到客户端的请求报文时,会将请求报文中的目标IP修改为后端某个RealServer的RIP,就以上图为例,当LVS收到客户端的请求报文时,会将报文中的VIP修改为RIP1或者RIP2,具体将VIP修改为哪个RealServer的RIP,取决于LVS使用的具体算法,最好理解的负载均衡算法就是轮询算法了,用大白话说,轮询算法就是如果这次将报文的目标IP修改为RIP1,那么下次就将目标IP修改为RIP2,再下次就再将目标IP修改为RIP1,以此类推,当然,除了轮询算法,还有很多别的算法可供我们选择,但是此处我们暂时先不考虑这么多,当客户端请求报文的目标IP被修改为对应的RIP后,请求报文的源IP为CIP,目标IP已经改为RIP,那么报文自然会被LVS转发到对应的RealServer中,当RealServer收到对应的请求报文时,会发现报文的目标IP就是自己的RIP,于是就会接收报文,处理后进行响应,因为RealServer收到请求报文时,源IP为CIP,目标IP为RIP,所以RealServer在进行响应时,响应报文的源IP则为RIP,目标IP则为CIP,但是CIP对于RealServer来说肯定不在一个网络内,因为CIP是一个公网IP,所以,我们要将所有RealServer的网关指向DIP,当RealServer产生响应报文时,会将响应报文发往网关DIP,而DIP就是LVS的内网IP,当LVS收到对应的响应报文时,响应报文的源IP为RIP,目标IP为CIP,此时,LVS会将响应报文的源IP修改为VIP,修改后的响应报文的源IP为VIP,目标IP为CIP,于是响应报文被发往客户端,客户端则会收到响应报文,其实上述整个过程是一个DNAT的过程,所以,此种LVS模型被称之为LVS-NAT模型。
1.2 功能实现的依赖
LVS由两部分组成,ipvs 与 ipvsadm,好比iptables与netfilter的关系,ipvs是LVS的核心实现,但是不能直接操作ipvs,需要借助管理工具ipvsadm定义LVS集群规则,ipvs再根据我们定义好的规则进行工作。
ipvsadm:LVS管理工具,管理员通过 ipvsadm 定义或管理集群规则。
ipvs:LVS 核心实现,根据定义好的集群规则进行工作。
其实,ipvs 是与 netfilter 结合在一起使用的,2.4.X版本以后的内核中,ipvs 作为 netfilter 的模块存在。
当客户端访问服务时,会访问VIP+端口,所以,客户端的请求报文会发往调度器,请求报文会先经过
PREROUTING
链,然后进行路由判断,由于此刻报文的目标IP为VIP,而VIP对于调度器来说,就是本身的IP,所以报文会经过INPUT
链,此刻,如果IPVS发现报文访问的VIP+端口与我们定义的LVS集群规则相符,ipvs则会根据定义好的规则与算法,将报文直接发往POSTROUTING
链,然后报文则会发出,最后到达后端的RealServer中。
二、配置部署
2.1 LVS Server
step1 开启内核的核心转发功能
# LVS 主要负责分发请求到后端主机,所以它需要转发报文,需要将ip_foward的值设置为1,才能够转发报文到别的主机。
# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
# 永久生效
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 # 添加或修改
systemctl restart network
或
sysctl -p
step2 安装 ipvsadm 命令
yum -y install ipvsadm
step3 添加规则
- 创建对外暴露的前端lvs集群服务
ipvsadm -A -t VIP:PORT -s rr
-A 表示添加一条虚拟服务器记录,即创建一个LVS集群。
-t 表示创建LVS集群服务为tcp服务。
VIP:PORT 表示LVS服务对外暴露的IP和端口号。
-s 为Scheduling(调度)之意,用于指定具体的调度算法,可用算法有 rr 、wrr 、lc 、wlc 、lblc 、lblcr 、dh 、sh 、sed 、nq ,而rr算法就是Round-Robin的缩写,表示轮询算法。
- 为lvs集群服务添加后端的realserver
ipvsadm -a -t VIP:PORT -r RIP1:PORT -m
-a 表示添加一个realserver 到lvs集群中。
-t 表示lvs集群服务为tcp服务,"VIP:PORT"用户关联前端的lvs集群服务。
-r 表示要添加的realserver的IP及服务端口号。
-m 表示LVS集群的工作模式为LVS-NAT模式,当然,如果想要LVS工作于其他模式,那么在添加Realserver时,则不能使用-m选项,而需使用其他对应选项。
... ... 如果有多台realserver只要将命令中的RIP替换为具体的realserverIP即可。
ipvsadm -a -t VIP:PORT -r RIP2:PORT -m
ipvsadm -a -t VIP:PORT -r RIPN:PORT -m
step4 保存规则
- 永久保存规则
# 查看规则
ipvsadm -Ln
# 保存规则
ipvsadm-save -n > /etc/sysconfig/ipvsadm
# 服务开机自启动
systemctl restart ipvsadm
systemctl enable ipvsadm
2.2 RealServer
step1 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
step2 启动需要被反向代理的服务
step3 网关指向 LVS 的 DIP
三、常用命令
-A/--add-service | 添加一条新的虚拟服务 |
-E/--edit-service | 编辑虚拟服务 |
-D/--delete-service | 删除虚拟服务 |
-C/--clear | 清除所有的虚拟服务规则 |
-R/--restore | 恢复虚拟服务规则 |
-S/--save | 保存虚拟服务器规则 |
-a/--add-server | 在一个虚拟服务中添加一个新的真实服务器 |
-e/--edit-server | 编辑某个真实服务器 |
-d/--delete-server | 删除某个真实服务器 |
-L/-l/--list | 显示内核中的虚拟服务规则 |
-Z/--zero | 将转发消息的统计清零 |
--set tcp/tcpfin/udp | 配置三个超时时间(tcp/tcpfin/udp) |
--start-daemon | 启动同步守护进程。 |
--stop-daemon | 停止同步守护进程 |
-h/--help | 显示帮助信息 |
-t/--tcp-service service-address | TCP协议的虚拟服务 |
-u/--udp-service service-address | UDP协议的虚拟服务 |
-f/--fwmark-service fwmark | 说明是经过iptables 标记过的服务类型。 |
-s/--scheduler scheduler | 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc. |
-p/--persistent [timeout] | 持久稳固的服务。 |
-M/--netmask | 指定客户地址的子网掩码 |
-r/--real-serverserver-address | 真实的服务器 |
-g/--gatewaying | 指定LVS 的工作模式为直接路由模式 |
-i/--ipip | 指定LVS 的工作模式为隧道模式 |
-m/--masquerading | 指定LVS 的工作模式为NAT 模式 |
-w/--weightweight | 真实服务器的权值 |
--mcast-interface interface | 指定组播的同步接口 |
-c/--connection | 显示ipvs中目前存在的连接 |
-6: | 如果fwmark用的是ipv6地址需要指定此选项。 |
管理虚拟服务:
- 添加一个虚拟服务192.168.1.100:80,使用轮询算法:
ipvsadm -A -t 192.168.1.100:80 -s rr
- 修改虚拟服务的算法为加权轮询:
ipvsadm -E -t 192.168.1.100:80 -s wrr
- 删除虚拟服务:
ipvsadm -D -t 192.168.1.100:80
管理真实服务:
- 添加一个真实服务器192.168.1.123,使用DR模式,权重2:
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
- 修改真实服务器的权重:
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5
- 删除真实服务器:
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123
查看统计:
- 查看当前配置的虚拟服务和各个RS的权重:
ipvsadm -Ln
- 查看当前ipvs模块中记录的连接(可用于观察转发情况):
ipvsadm -lnc
- 查看ipvs模块的转发情况统计:
ipvsadm -Ln --stats | --rate