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:
  1. 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模型
  1. 原理:多目标IPDNAT,通过将请求报文中的目标IP地址和目标端口修改为某RSRIPPORT实现转发;<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. 1.DirectorRS需在一个私网IP网络,且RS的网关必须是DIP
  2. 2.请求和响应报文都需由Director来转发,Director易成为系统瓶颈;
  3. 3.支持端口转换,可以修改请求报文的Dport
  4. 4.Director必须是LinuxRS可以是任意操作系统;

LVS-DR模型
  1. 原理:所有的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. 1.必须保证前端路由通过ARP地址解析将数据包转发至 Director,数据报文不能直接被 RS 接收;
  2. 2.RS可以使用私网地址也可以使用公网地址;
  3. 3.Director只负责调度;
  4. 4.DirectorRS必须在一个物理网络;
  5. 5.不支持端口映射;
  6. 6.RS的网关为路由器;
  7. 7.RS必须为能拒绝ARP广播的系统;

LVS-TUN模型
  1. 原理:请求报文经由DirectorDirector通过IP隧道在报文头部添加一个IP首部转发给RSRS将响应报文直接返回给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. 1. RIPVIP必须为公网IP
  2. 2. RS网关不能指向Director
  3. 3. 不支持端口映射;
  4. 4. RSOS必须支持隧道技术;
  5. 5. DirectorRSRS1RS2都可以跨网段;
  6. 6. 请求报文由Director转发至RSRS直接响应Client
  7. 7. 一般用于外网环境;00

总结:

  1. 1. lvs-nat类型网关要指向DIP,并且响应报文要经过Director
  2. 2. lvs-drlvs-tun类型请求报文经过Director,但响应报文由RS直接返回给Client
  3. 3. lvs-dr类型通过重新封装MAC地址,实现二层网络转发;
  4. 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

管理集群服务
  1. ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
  2. -A:添加一个集群服务;
  3. -E:修改一个集群服务;
  4. -s:使用哪种调度算法;
  5. -p:定义持久连接;
  6. -tTCP协议端口;
  7. -uUDP协议端口;
  8. -ffirewall MASK,防火墙标记;
  9. ipvsadm -L|l [option] #查看一个集群服务;
  10. -n:以数字形式显示IP地址;
  11. -exact:精确的显示计数器的值;
  12. --connection,-c:当前连接状态,当前的连接数;
  13. --stats:统计数据;
  14. --rate:速率数据,统计数据/时间(s);
  15. ipvsadm -D -t|u|f service-address #删除一个集群服务;
  16. ipvsadm -C #清空所有;
  17. ipvsadm -Sipvsadm-save #保存当前配置;
  18. ipvsadm -Ripvsadm-restore #重载;

管理集群上的RS
  1. ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  2. -a|e:添加或者修改一个RS
  3. -rRS的地址;
  4. -gGateWayingLVS-DR集群类型;
  5. -iIPIP,LVS-Tun集群类型;
  6. -mmasqueradeLVS-NAT集群类型;
  7. -w:权重;
  8. ipvsadm -d -t|u|f service -r server-address #删除一个RS;

LVS实战

NAT模型负载PHP应用(WordPress)
  1. 1. **设计要点:**
  2. 1. RIPDIP在同一网络,且DIP是各RS的网关;
  3. 2. 支持端口映射
  4. 3. Director需要开启核心转发
  5. 2. **环境准备:**
  6. 1. Director(192.168.10.11 , 172.16.0.68) , RS1(192.168.10.12) , RS2(192.168.10.13)
  1. 在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

  1. 4. **开启Director核心转发,并配置LVS-NAT**
  2. ```bash
  3. [root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
  4. [root@director ~]# yum install -y ipvsadm
  5. ipvsadm -A -t 172.16.0.68:80 -s rr
  6. ipvsadm -a -t 172.16.0.68:80 -r 192.168.10.12:80 -m
  7. ipvsadm -a -t 172.16.0.68:80 -r 192.168.10.13:80 -m

DR模型
  1. 设置要点:
    1. 在各RS修改内核参数,限制arp响应和通告级别:
      ``` 限制响应级别:arp_ignore 0:默认值,在本机任意一接口上响应到达本机任意一接口的报文;目的IP与直连接口不在同一网络,而是其他接口,也予以响应; 1:仅在请求目的IP是本机接收到报文接口的IP,才予以响应;

限制通告级别:arp_announce 0:默认值,将本机所有接口信息向每一个接口进行通告; 1:尽量避免向非直连网络进行通告; 2:必须避免向非直连网络通告自己的信息;

  1. 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. 2. **配置各网卡信息,并抑制RS发送响应和请求arp**
  3. ```bash
  4. #在Director上配置
  5. ifconfig ens33:0 192.168.10.99 netmask 255.255.255.255 broadcast 192.168.10.99 up
  6. #配置ens33虚拟地址为192.168.10.99 且其掩码为32为,表示其网段内只有自己这一可用IP
  7. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #抑制RS1上的网卡发送ARP
  8. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  9. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  10. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  11. ifconfig lo:0 192.168.10.99 netmask 255.255.255.255 broadcast 192.168.10.99 up
  12. route add -host 192.168.10.99 dev lo:0 #将地址是192.168.10.99的报文从lo:0接口发出
  13. #RS1与RS2配置一致
  14. ipvsadm -A -t 192.168.10.99:80 -s rr
  15. ipvsadm -a -t 192.168.10.99:80 -r 192.168.10.11 -g
  16. ipvsadm -a -t 192.168.10.99:80 -r 192.168.10.12 -g