lvs应用结构
简介:
LVS是一个四层负载均衡器,支持TCP/UDP的负载均衡;LVS工作在用户空间的ipvsadm(LVS的命令行工具)与工作在内核空间的ipvs(LVS提供服务的内核模块)组成。用户通过ipvsadm添加规则,再由ipvs来实现功能,ipvs工作在netfilter的input链上;
lvs:Linux Virtual Server
VS:Virtual Server:根据请求报文的目标IP、协议以及端口将其转发至某RS,根据其调度算法来挑选RS;
RS:Real Server
作者:章文嵩;
LVS集群中的术语:
VS:VIrtual Server,Director,Balance;
RS:Real Server,Backend Server;
CIP:Client IP,客户端IP
VIP:Virtual server IP,Director向外部Client提供服务的IP;
DIP:Director IP,Director向内部RS提供负载均衡的IP;
RIP:Real server IP,后台真实提供服务的服务器IP;
iptables/netfilter:
iptables:用户空间的管理工具;<br /> netfilter:内核空间的架构;<br /> 流入:PREROUTING --> INPUT<br /> 流出:OUTPUT --> POSTROUTING<br /> 转发: PREROUTING --> FORWARD --> POSTROUTING<br /> DNAT:目标地址转换;<br /> SNAT:源地址转换;<br />![1581747950920.png](https://cdn.nlark.com/yuque/0/2021/png/12859857/1622693023210-9b978aaa-97c8-4698-b49e-5f6b037fe80e.png#clientId=u9f1adf1f-7701-4&from=drop&id=u58cda5cf&margin=%5Bobject%20Object%5D&name=1581747950920.png&originHeight=484&originWidth=796&originalType=binary&size=10972&status=done&style=stroke&taskId=u76629d04-2eb8-4a9c-84c2-c77d77bb059)
LVS的集群的类型
LVS-NAT模型
原理:多目标IP的DNAT,通过将请求报文中的目标IP地址和目标端口修改为某RS的RIP和PORT实现转发;<br />![lvs-nat.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/12859857/1622693075709-3216e54d-e616-40da-8e20-0417d8aa79bb.jpeg#clientId=u42e073f6-7124-4&from=drop&id=u28c0c08c&margin=%5Bobject%20Object%5D&name=lvs-nat.jpg&originHeight=819&originWidth=1415&originalType=binary&size=93940&status=done&style=stroke&taskId=ufb3658ee-b60b-466d-9b0c-29a8086233a)<br />特性:
1.Director和RS需在一个私网IP网络,且RS的网关必须是DIP;
2.请求和响应报文都需由Director来转发,Director易成为系统瓶颈;
3.支持端口转换,可以修改请求报文的Dport;
4.Director必须是Linux,RS可以是任意操作系统;
LVS-DR模型
原理:所有的RS都在lo上配置VIP,并且抑制lo响应和请求ARP广播,并且通过Director修改报文的二层数据帧的MAC地址指向一个经算法调度出的服务器,最后RS会直接响应Client的请求(RS上有VIP,直接使用VIP为响应报文的源IP),Linux会将先经由的网卡IP为报文的源IP;<br />![lvs-dr.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/12859857/1622693097848-b9483d51-328e-4331-ac3b-9a5f858b2d79.jpeg#clientId=u42e073f6-7124-4&from=drop&id=uc835fa72&margin=%5Bobject%20Object%5D&name=lvs-dr.jpg&originHeight=730&originWidth=1265&originalType=binary&size=104207&status=done&style=stroke&taskId=ufcdef6ab-93d9-4c1a-aab4-32ab2d6af67)<br />特性:
1.必须保证前端路由通过ARP地址解析将数据包转发至 Director,数据报文不能直接被 RS 接收;
2.RS可以使用私网地址也可以使用公网地址;
3.Director只负责调度;
4.Director与RS必须在一个物理网络;
5.不支持端口映射;
6.RS的网关为路由器;
7.RS必须为能拒绝ARP广播的系统;
LVS-TUN模型
原理:请求报文经由Director,Director通过IP隧道在报文头部添加一个IP首部转发给RS,RS将响应报文直接返回给Client;<br />![lvs-tun.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/12859857/1622693119382-6061c73e-df4b-4d34-b79a-9db498c3588e.jpeg#clientId=u42e073f6-7124-4&from=drop&id=ue8bb6c57&margin=%5Bobject%20Object%5D&name=lvs-tun.jpg&originHeight=876&originWidth=1396&originalType=binary&size=138395&status=done&style=none&taskId=u63194e24-8d31-4766-b5de-4223d45cb13)<br />特性:
1. RIP,VIP必须为公网IP;
2. RS网关不能指向Director;
3. 不支持端口映射;
4. RS的OS必须支持隧道技术;
5. Director与RS,RS1与RS2都可以跨网段;
6. 请求报文由Director转发至RS,RS直接响应Client;
7. 一般用于外网环境;00
总结:
1. lvs-nat类型网关要指向DIP,并且响应报文要经过Director;
2. lvs-dr、lvs-tun类型请求报文经过Director,但响应报文由RS直接返回给Client;
3. lvs-dr类型通过重新封装MAC地址,实现二层网络转发;
4. lvs-tun类型通过隧道方式添加一个IP首部,实现三层转发,远距离通信;
LVS负载均衡算法
静态算法
RR(Round Robin,轮询):把每次客户端的请求都轮流发送给服务器。它无需记录后端服务器的连接状态,是一种无状态的调度。他也不会考虑服务器的处理能力;
WRR(Weight Round Robin,加权轮询 ):由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
SH( Source Hashing,源地址hash):实现session sticky,源地址hash;将来自于一个IP地址的请求始终发往第一次访问的RS,从而实现会话绑定;
DH(Destination Hashing,目标地址hash):将发往同一个目标地址的请求始终发往第一次挑中的RS;典型使用场景是正向代理缓存场景中的负载均衡;
动态算法
- LC(Least Connection,最少连接):最少连接调度算法是把新的连接分配到连接数最小的服务器。最少连接调度是一种动态调度短算法,他通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数+1,当连接终止或超时时,其连接数-1。当服务器的权值为0时,表示该服务器不可用;
- active * 256 + inactive
- WLC(Weighted LC,加权最少连接):LC算法忽略了服务器的性能问题,加权重可以区分各服务器性能。服务器的缺省权值为1,可以动态的设置权值,权值越大收到的请求越多;
- ( active * 256 + inactive )/ weight
- SED(Shortest Expection Delay,最短期望延时):不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接受请求,但会出现问题,就是权重比较大的服务器会很忙,权重小的服务器很闲,甚至接收不到请求;
- ( active + 1 )* 256 / weight
NQ(never queue,永不排队):SED的改进,不管权重多大,都会被分配到请求。如果真是服务器的连接数为0就直接分配,不需要sed运算;
LBLC(Locality-Base LC,基于本地的最少连接):DH算法的动态版, 正向代理情形下的cache server的调度,该算法根据请求的目标IP地址找出该服务器,若该服务器可用且没有超载,则将请求发送到该服务器,命中该服务器缓存;否则就用LC算法选择可用服务器;
LBLCR(Locality-Base Least-Connection with Replication,带复制功能的LBLC):它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,且服务器组能相互复制缓存,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LVS工具ipvsadm
管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A:添加一个集群服务;
-E:修改一个集群服务;
-s:使用哪种调度算法;
-p:定义持久连接;
-t:TCP协议端口;
-u:UDP协议端口;
-f:firewall MASK,防火墙标记;
ipvsadm -L|l [option] #查看一个集群服务;
-n:以数字形式显示IP地址;
-exact:精确的显示计数器的值;
--connection,-c:当前连接状态,当前的连接数;
--stats:统计数据;
--rate:速率数据,统计数据/时间(s);
ipvsadm -D -t|u|f service-address #删除一个集群服务;
ipvsadm -C #清空所有;
ipvsadm -S,ipvsadm-save #保存当前配置;
ipvsadm -R,ipvsadm-restore #重载;
管理集群上的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a|e:添加或者修改一个RS;
-r:RS的地址;
-g:GateWaying,LVS-DR集群类型;
-i:IPIP,LVS-Tun集群类型;
-m:masquerade,LVS-NAT集群类型;
-w:权重;
ipvsadm -d -t|u|f service -r server-address #删除一个RS;
LVS实战
NAT模型负载PHP应用(WordPress)
1. **设计要点:**
1. RIP和DIP在同一网络,且DIP是各RS的网关;
2. 支持端口映射
3. Director需要开启核心转发
2. **环境准备:**
1. Director(192.168.10.11 , 172.16.0.68) , RS1(192.168.10.12) , RS2(192.168.10.13)
- 在RS上搭建lnmp并安装wordpress(两台RS配置一样)
```bash yum install -y nginx php php-fpm mariadb-server mariadb php-mysql
vim /etc/nginx/nginx.conf root /data/nginx location / { index index.php index.html; } location ~ .php$ { root /data/wordpress; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } systemctl restart nginx
vim /etc/php-fpm.d/www.conf user = nginx group = nginx
systemctl restart php-fpm
mkdir /data
tar -xf wordpress-4.9.4-zh_CN.tar.gz -C /data/
systemctl start mariadb
mysqladmin -u root password 123456 mysql -uroot -p123456 create database wordpress;
chown nginx.nginx /data/ -R chown nginx.nginx /data/* -R
wordpress 网页安装
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改网卡网关为DIP
GATEWAY=192.168.10.11
4. **开启Director核心转发,并配置LVS-NAT**
```bash
[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@director ~]# yum install -y ipvsadm
ipvsadm -A -t 172.16.0.68:80 -s rr
ipvsadm -a -t 172.16.0.68:80 -r 192.168.10.12:80 -m
ipvsadm -a -t 172.16.0.68:80 -r 192.168.10.13:80 -m
DR模型
- 设置要点:
- 在各RS修改内核参数,限制arp响应和通告级别:
``` 限制响应级别:arp_ignore 0:默认值,在本机任意一接口上响应到达本机任意一接口的报文;目的IP与直连接口不在同一网络,而是其他接口,也予以响应; 1:仅在请求目的IP是本机接收到报文接口的IP,才予以响应;
- 在各RS修改内核参数,限制arp响应和通告级别:
限制通告级别:arp_announce 0:默认值,将本机所有接口信息向每一个接口进行通告; 1:尽量避免向非直连网络进行通告; 2:必须避免向非直连网络通告自己的信息;
2. **实验环境:**<br /> Director(ens33 : 192.168.10.11 , ens33:0 : 192.168.10.99)<br /> RS1(ens33 : 192.168.10.12 , lo:0 192.168.10.99)<br /> RS1(ens33 : 192.168.10.13 , lo:0 192.168.10.99)<br /> LNMP环境与LVS-NAT一致
2. **配置各网卡信息,并抑制RS发送响应和请求arp**
```bash
#在Director上配置
ifconfig ens33:0 192.168.10.99 netmask 255.255.255.255 broadcast 192.168.10.99 up
#配置ens33虚拟地址为192.168.10.99 且其掩码为32为,表示其网段内只有自己这一可用IP
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #抑制RS1上的网卡发送ARP
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.10.99 netmask 255.255.255.255 broadcast 192.168.10.99 up
route add -host 192.168.10.99 dev lo:0 #将地址是192.168.10.99的报文从lo:0接口发出
#RS1与RS2配置一致
ipvsadm -A -t 192.168.10.99:80 -s rr
ipvsadm -a -t 192.168.10.99:80 -r 192.168.10.11 -g
ipvsadm -a -t 192.168.10.99:80 -r 192.168.10.12 -g