LVS负载均衡(1)-- LVS概述及LVS网络模型
1. 负载均衡集群概述
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统。
-
LB:Load Balancing,负载均衡集群
将用户的请求按照一定的比例均匀的发布到不同的服务器上,该系统使负载可以在计算机群集中尽可能平均地分摊处理。
-
负载均衡集群按照工作的协议层次可以分为四层传输层负载均衡和七层应用层负载均衡。
-
四层负载均衡
在传输层进行负载均衡,仅需要对客户端的请求在TCP/UDP层进行包转发就可以实现。
四层负载均衡的性能极好,因为只需要在TCP层进行处理,无需解析应用层,理解应用层复杂的逻辑。
常用的解决方案为:
-
LVS
内核级实现,不需要装服务器软件,处理并发访问的调度能力极高,可达到400万的并发量,但由于工作在四层模式,对上层协议支持能力较弱,实际中较少使用,在大规模站点中有时会使用两层调度机制,LVS做为第一层调度,然后使用nginx或haproxy做第二次调度。
-
nginx的stream模块
-
haproxy的tcp模式
-
-
七层负载均衡
在应用层进行负载均衡,需要解析应用层报文,根据应用层信息进行负载。七层负载均衡可以完成应用方面的协议请求,比如nginx实现的http层负载,可以实现http头信息的改写,安全应用规则控制,URI匹配控制,rewrite等功能。
七层负载均衡相比四层性能会比较差,因为需要解析应用层信息。
常用的解决方案为:
-
nginx
可以当http和fastcgi的负载和代理服务器,不能代理mysql
-
haproxy
-
-
-
使用负载均衡集群存在的问题:
-
会话保持。服务器通过cookie识别用户,用户在该站点的行为会使用session机制记录保存于服务器端内存中,因此需要在进行集群调度时要保证该session可用。
解决方案:
-
1.session sticky:同一用户调度到固定的一台服务器上,有两种用户识别方式
Source IP:LVS sh算法(对某一特定服务而言)
Cookie 该方式会更加精准识别用户
-
2.session replication:会话复制,每台服务器拥有全部session,会使得集群中的服务器一直在实时同步session信息,对性能造成影响
session multicast cluster
-
3.session server:使用专门的session服务器
例如:Memcached,Redis
-
-
上传资源需要对所有用户可以。客户端使用POST或PUT方式上传资源到服务器上时,需要保证集群中的每台服务器都需要能够访问用户上传的资源,可以使用共享存储方式解决,图片和视频等无结构类型资源使用共享文件系统存储,例如nfs,cifs等方式,对于结构化数据则使用mysql服务器方式存储。
-
负载均衡器单点故障隐患,使用高可用技术解决,例如keepalived,heartbeat,coresync等技术。
-
2. LVS理论基础
LVS的英文全称是 Linux Virtual Server ,即 Linux 虚拟服务器。它是一种Cluster 集群技术,主要用于四层负载均衡,将用户请求均匀的调度到不同的服务器上
执行。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
内核级实现,不需要装服务器软件,处理并发访问的调度能力极高,可达到400万的并发量,但由于工作在四层模式,对上层协议支持能力较弱,一般在大规模站点中使用两层调度机制,LVS做为第一层调度,然后使用nginx或haproxy做第二次调度。
官方网站 http://www.linuxvirtualserver.org/
2.1 LVS常用术语
-
VS:Virtual Server,Director Server(DS) ,Dispatcher(调度器),Load Balancer
负载调度器,是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的
-
RS:Real Server(lvs), upstream server(nginx),backend server(haproxy)
是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等
-
CIP:Client IP
客户端ip地址
-
VIP: Virtual serve IP
调度服务器对外的IP地址
-
DIP: Director IP VS
调度服务器对于内网的IP地址
-
RIP: Real server IP
集群中提供服务的服务器IP地址
以上术语关系的示意图如下:
2.2 LVS数据调度原理
lvs需要借助iptables/netfilter,通过修改内核参数,在INPUT链前增加一个LVS功能模块,转发数据包。
Lvs工作在内核空间,在input链上设置规则,强行改变报文生命周期,将报文直接转发至POSTROUTING链中处理。
lvs: 由ipvsadm/ipvs两部分组成
-
ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及相关的RealServer;
-
ipvs:工作于内核空间的netfilter的INPUT钩子之上的框架;
2.3 LVS工作模型
LVS 负载均衡模型有四种工作模型: NAT、DR、TUN、FULL-NAT ,较为常见的模型有 NAT、DR ,使用最为广泛的模型是 DR模型。
2.3.1 NAT模型
lvs-nat转发方式本质是多目标IP的DNAT,通过将客户端请求报文中的目标地址和目标端口修改为根据调度算法挑出的RS的RIP和PORT实现转发。
RS的返回数据必须要流经LVS设备返回给客户端,因为客户端请求的的VIP地址而部署RIP,因此必须由VIP返回给客户端,否则客户端会丢弃返回报文。
NAT模型特点如下:
-
因为涉及到ip头的更改,需要启用LVS设备的ip_forword转发功能。
-
lvs服务器与RS服务器之间使用交换机或路由器都可以,RIP和DIP应使用私网地址(可以为公网,较浪费),当LVS和RS为直连网段时,RS的网关需要指向LVS,当LVS和RS之间存在路由设备时,需要把RS的网关指向路由器,但数据必须流经LVS再返回给客户端,要做好路由的规划。
-
请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
-
支持端口映射,可修改请求报文的目标PORT
-
LVS必须是Linux系统,RS可以是任意OS系统
ip数据包的转发过程如下图:
在LVS上把目的IP由VIP替换为RIP。
2.3.2 DR模型
Direct Routing,直接路由;LVS通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;
DR模型特点如下:
-
源IP/PORT,以及目标IP/PORT均保持不变,传输层不动,不支持端口映射,LVS不需要启用Ip_forword转发;
-
当请求到达服务器时,网络层不动,只修改数据链路层的mac地址;
-
请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client,因此Director和各RS都得配置使用VIP,此时会产生VIP冲突的问题;
-
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,应该指向出口路由器,以确保响应报文不会经由Director;
-
Director和各RS都配置有VIP,需要解决地址冲突问题;
-
RS可使用大多数OS系统;
ip数据包的转发过程如下图:
2.3.3 TUNNEL模型
转发方式:
不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
tunnel模型特点如下:
-
DIP, VIP, RIP都应该是公网地址
-
RS的网关一般不能指向DIP
-
请求报文要经由Director,但响应不经由Director
-
不支持端口映射
-
RS的OS须支持隧道功能
TUN模式IP包调度过程如下:
2.3.4 FULL-NAT模型
此类型kernel默认不支持,多用于调度器和RS不在同一网络的场景中。
lvs-fullnat转发方式:
通过同时修改请求报文的源IP地址和目标IP地址进行转发
-
CIP --> DIP
-
VIP --> RIP
网络配置要求:
-
VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
-
RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client。
-
请求和响应报文都经由Director
-
支持端口映射
2.3.5 四种模型的比较
-
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
- lvs-nat:RIP和DIP未必在同一网络,但是RIP回包要经过DIP
- lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
-
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
- lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
- lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
2.4 ipvsadm包组成
2.4.1 ipvsadm包结构
LVS内置在内核层面,无需安装软件包,但是我们需要安装ipvs的命令行管理工具软件ipvsadm工具。
-
安装ipvsadm
[root@lvs-01 ~]# yum install ipvsadm
-
ipvsadm的文件组成:
[root@lvs-01 ~]# rpm -ql ipvsadm /etc/sysconfig/ipvsadm-config <==配置文件 /usr/lib/systemd/system/ipvsadm.service <==systemd的unit文件 /usr/sbin/ipvsadm <==主程序文件 /usr/sbin/ipvsadm-restore <==ipvs规则恢复工具 /usr/sbin/ipvsadm-save <==ipvs规则保存工具 /usr/share/doc/ipvsadm-1.27 /usr/share/doc/ipvsadm-1.27/README /usr/share/man/man8/ipvsadm-restore.8.gz /usr/share/man/man8/ipvsadm-save.8.gz /usr/share/man/man8/ipvsadm.8.gz
-
使用[root@Centos8 ~]# grep -C 10 -i "ipvs" /boot/config-4.18.0-147.el8.x86_64命令可以查看内核编译时是否编译lvs模块。
2.4.2 ipvsadm工具使用
ipvsadm 的用法大概分类如下两类
-
管理集群服务(定义负载均衡配置)
-
管理后端RS(定义负载均衡后端节点的增删改查)
-
管理集群服务:增、改、删
-
1.增、改:-A表示增加,-E表示修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
2.删除:-D表示删除
ipvsadm -D -t|u|f service-address
-
参数说明
service-address:vip服务的地址及端口号
-t:TCP协议的端口,VIP:TCP_PORT
-u:UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字
[-s scheduler]:指定集群的调度算法,默认为wlc
[-p [timeout]]:超时时长
-
-
管理集群上的RS:增、改、删
-
1.增、改:-a表示增加,-e表示修改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-
2.删:-d表示删除
ipvsadm -d -t|u|f service-address -r server-address
-
其他参数说明
-r server-address[:port]:RS的ip地址,如省略port,不作端口映射
server-address:vip的地址及端口
lvs工作模型:
-g:gateway, dr类型,默认
-i:ipip, tun类型
-m:masquerade, nat类型
-w weight:权重
-
-
清空定义的所有内容
- ipvsadm -C
-
清空计数器
- ipvsadm -Z [-t|u|f service-address]
-
查看规则
- 语法格式:ipvsadm -L|l [options]
options:
-
--numeric, -n:以数字形式输出地址和端口号
ipvsadm -Ln必须L在前,不然语法错误
-
--exact:扩展信息,精确值
-
--connection,-c:当前IPVS连接输出
IPVS connection entries pro expire state source virtual destination |协议|连接过期时间|连接状态| 客户端地址 | vip地址 | 响应的RS TCP 01:58 TIME_WAIT 172.20.124.254:41326 172.20.125.0:80 192.168.50.105:80
-
--stats:统计信息
[root@lvs-01 ~]# ipvsadm -Ln --stats Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes |连接| 收到包 | 发送包 |收到大小|发送大小|
-
--rate :输出速率信息
[root@lvs-01 ~]# ipvsadm -Ln --rate IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS |每秒连接数|收到报文|发出报文|收到字节|发出字节
-
ipvs规则保存文件:
/proc/net/ip_vs
显示内容与ipvsadm -Ln相似,只是将ip地址以16进制显示
-
ipvs连接保存文件
/proc/net/ip_vs_conn
-
保存策略
三种方式:
-
ipvsadm-save > /PATH/TO/IPVSADM_FILE
-
ipvsadm -S > /PATH/TO/IPVSADM_FILE
-
ipvsadm-save -n > /etc/sysconfig/ipvsadm
重定向至指定目录,可以自定义,推荐保存于/etc/sysconfig/ipvsadm中,当记载ipvsadm.service服务时会自动读取/etc/sysconfig/ipvsadm中保存的规则,自动加载。
[root@lvs-01 ~]# cat /usr/lib/systemd/system/ipvsadm.service [Unit] Description=Initialise the Linux Virtual Server After=syslog.target network.target [Service] Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" ExecStop=/sbin/ipvsadm -C RemainAfterExit=yes [Install] WantedBy=multi-user.target
-
-
重载策略
三种方式:
-
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
-
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
-
systemctl restart ipvsadm.service
-