LVS详解

一、概念简述

1.1LVS概念简述

1.1.1 LVS

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。LVS基于内核网络层工作,有着超强的并发处理能力,单台LVS可以承受上万的并发连接。LVS是基于4层的负载均衡软件,因此LVS在所有负载均衡软件中性能最强,稳定性最高,消耗CPU和内存少。LVS是工作在4层,所以它可以对应用层的所有协议作负载均衡,包括http、DNS、ftp等。

1.1.2 LVS分层及组成

LVS负载均衡分为3层:

第一层(Load Balancer),它负责负载均衡,有一台或多台调度器,是整个集群的总代理。它有两个网卡,一个网卡面向访问网站的客户端,一个网卡面向集群内部。负责将客户的请求发送到服务器上执行。

第二层(Server Array),这一层是真正执行客户请求的服务器,可以当做WEB服务器。

第三层(Shared Storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

1.1.3 工作原理

1、用户请求的数据包到达负载均衡器的内核空间,首先经过的是内核的PREROUTING链

2、因为请求的数据包的目的地址一定是本机,然后将数据包送到INPUT链

3、ipvs就工作在INPUT链上,ipvs利用ipvsadm定义的规则工作,ipvs对数据包进行检查,如果目的地址和端口不在规则里边,则将数据包送往用户空间

4、如果目的地址和端口在规则里边,则将数据包的目的地址和端口修改为后端真实服务器,然后将修改后的数据包送往POSTROUTING链

5、最后经过POSTROUTING链将数据包转发给后端服务器。

1.2集群Cluster

1.2.1 概念简述

集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统

1.2.2 常见类型

LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问

HA:High Availiablity(高可用)

MTBF:Mean Time Between Failure 平均无故障时间,正常时间

MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间

A=MTBF/(MTBF+MTTR)

SLA:Service level agreement(服务等级协议)

SLA是在一定开销下为保障服务的性能和可用性,服 务提供商与用户间定义的一种双方认可的协定。

HPC:High-performance computing(高性能计算)

1.2.3 LVS集群类型

|-------------|----------------------|
| lvs-nat | 修改请求报文的目标IP,多目标的DNAT |
| lvs-dr | 操纵新封装的MAC地址 |
| lvs-tun | 再远请求IP报文之外新加一个IP首部 |
| lvs-fullnat | 修改请求报文的源和目标IP |

1.3 分布式

1.3.1 概念简述

分布式是将一个业务被拆成多个子业务或将本身就是不同的业务部署在多台服务器上。在分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。

1.3.2集群和分布式的区别

集群是将同一个业务部署在多台服务器上,每一台服务器实现的功能没有差别,数据和代码都是一样的;分布式中每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率

二、LVS运行原理

2.1 nat模式

2.1.1概念

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发

RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

支持端口映射,可修改请求报文的目标PORT

VS必须是Linux系统,RS可以是任意OS系统

2.1.2 数据逻辑

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)

2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口

3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)

4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)

5.VS服务器把修改过报文的响应数据包回传给客户端

6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

2.2 DR模式

2.2.1 概念

DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

2.2.2 DR模式数据传输过程

1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC

2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC

3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC

2.2.3 DR模式的特点

1.Director和各RS都配置有VIP

2.确保前端路由器将目标IP为VIP的请求报文发往Director

3.在前端网关做静态绑定VIP和Director的MAC地址

4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;

5.RIP的网关不能指向DIP,以确保响应报文不会经由Director

6.RS和Director要在同一个物理网络

7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

8.不支持端口映射(端口不能修败)

9.RS可使用大多数OS系统

2.3 TUN模式

2.3.1 概念

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)

2.3.2TUN模式传输数据过程

1.客户端发送请求数据包,包内有源IP+vip+dport

2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含

TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1

3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+port,响应数据包通过网络直接回传给client

2.3.3 TUN模式特点

1.DIP, VIP, RIP都应该是公网地址

2.RS的网关一般不能指向DIP

3.请求报文要经由Director,但响应不能经由Director

4.不支持端口映射

5.RS的OS须支持隧道功能

2.4 LVS类型总结

|-----------|----------|-------|-------|
| | NAT模式 | TUN模式 | DR模式 |
| RS操作系统 | 不限 | 支持隧道 | 禁用arp |
| 调度器和服务器网络 | 可跨网络 | 可跨网络 | 不可跨网络 |
| 调度服务器数量 | 少 | 多 | 多 |
| RS服务器网关 | 指向调度器DIP | 指向路由 | 指向路由 |

lvs-nat与lvs-fullnat:请求和响应报文都经由Director

lvs-nat:RIP的网关要指向DIP

lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client

lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发

lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

2.5 LVS的调度算法

2.5.1 lvs调度算法类型

ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法

静态方法:仅根据算法本身进行调度,不考虑RS的负载情况

动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

2.5.2 lvs静态调度算法

1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐

2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少

3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定

4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

2.5.3 lvs动态调度算法

主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度

1、LC:least connections(最少链接发)

适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)

2、WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

3、SED:Shortest Expection Delay,初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight,但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接

4、NQ:Never Queue,第一轮均匀分配,后续SED

5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理

6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS

2.5.4 新增调度算法

1.FO(Weighted Fai Over)调度算法:常用作灰度发布。在FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载的且权重最高的真实服务器,进行调度当服务器承接大量链接,我们可以对此服务器进行过载标记,那么vs调度器就不会把链接调度到有过载标记的主机中。

2.OVF(Overflow-connection)调度算法:基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动 连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关 联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:

1.未过载(未设置IP_VS_DEST_F OVERLOAD标志)

2.真实服务器当前的活动连接数量小于其权重值

3.其权重值不为零

三、LVS命令

3.1 lvs软件相关信息

程序包:ipvsadm Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config ipvs

调度规则文件:/etc/sysconfig/ipvsadm

3.2 ipvsadm命令

3.2.1命令参数

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

-A #添加

-E #修改

-t #tcp服务

-u #udp服务

-s #指定调度算法,默认为WLC

-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver

-f #firewall mask 火墙标记,是一个数字

ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]

-a #添加realserver

-e #更改realserver

-t #tcp协议

-u #udp协议

-f #火墙标签

-r #realserver地址

-g #直连路由模式

-i #ipip隧道模式

-m #nat模式

-w #设定权重

-Z #清空计数器

-C #清空lvs策略

-L #查看lvs策略

-n #不做解析

--rate :输出速率信息

bash 复制代码
Ipvsadm -Ln #查看策略并加载/etc/sysconfig/ipvsadm中的策略内容
Ipvsadm -Ln --rate	#查看具体数据
Ipvsadm-save  -n > /etc/sysconfing/ipvsadm	#保存策略 -n表示不做解析
Ipvsadm-restore > /etc/sysconfing/ipvsadm		#恢复策略
Rm /etc/sysconfig/ipvsadm #删除数据 

四、项目实战

4.1 nat模式

4.1.1实验环境

|---------|----------------|-----------------|-----------|
| 主机名 | ip | vip | 角色 |
| lvs | 172.25.254.100 | 192.168.124.100 | 调度器(VS) |
| server1 | 192.168.124.10 | null | 真实服务器(RS) |
| server2 | 192.168.124.20 | null | 真实服务器(RS |
| client | 172.25.254.200 | null | 测试机 |

4.1.2 实验步骤

4.1.2.1 网络设置

lvs上需配置两块网卡一个nat模式,一个仅主机模式

bash 复制代码
vmset.sh eth0 172.25.254.100 lvs timinglee.org    #IP
vmset.sh eth1 192.168.124.100 lvs timinglee.org    #VIP
vim /etc/NetworkManager/system.connections/eth1.nmconnection
nmcli connection reload    #重载网络链接
nmcli connection up eth1    #激活网络连接
nmcli connection up eth1    #激活网络连接
#网络链接配置文件修改后需要重新加载并激活链接

rs上的网卡是仅主机模式

bash 复制代码
#rs1配置命令
vmset.sh eth0 192.168.124.10 webserver1.timinglee.org
vim /etc/NetworkManager/system.connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
dnf install httpd
echo webserver1 -192.168.124.10 >/var/www/html/index.html
systemctl enable --now httpd

#rs2配置命令
vmset.sh eth0 192.168.124.20 webserver2.timinglee.org
vim /etc/NetworkManager/system.connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
dnf install httpd
echo webserver2 -192.168.124.20 >/var/www/html/index.html
systemctl enable --now httpd

cilent上的网卡是nat模式

bash 复制代码
vmset.sh eth0 172.25.254.200 cilent.timinglee.org
vim /etc/NetworkManager/system.connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
4.1.2.2 打开内核路由功能
bash 复制代码
sysctl -a | grep ip_forward	#查看内核路由功能
vim /etc/sysctl.conf	#编辑配置文件,打开内核路由功能
net.ipv4.ip_forward=1	#打开内核路由功能
sysctl -p	#使更改后的内核参数立即生效
4.1.2.3 测试httpd服务是否正常相应
bash 复制代码
curl 192.168.124.10	#检测http服务是否能正常响应
curl 192.168.124.20	#检测http服务是否能正常响应
4.1.2.4 下载lvs软件
bash 复制代码
dnf install ipvsadm -y    #安装lvs软件
systemctl start ipvsadm

4.1.3 输入策略测试

bash 复制代码
Ipvsadm -Ln #查看策略并加载/etc/sysconfig/ipvsadm中的策略内容
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -E -t 172.25.254.100:80 -s wrr
ipvsadm -a -t 172.25.254.100:80 -r192.168.0.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r192.168.0.20:80 -m
Ipvsadm-save  -n > /etc/sysconfing/ipvsadm	#保存策略 -n表示不做解析
Ipvsadm-restore > /etc/sysconfing/ipvsadm		#恢复策略
Rm /etc/sysconfig/ipvsadm  
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2		#权重为2
服务开启后添加的策略重启后不会保存,需要在/etc/sysconfig/ipvsadm文件中添加

4.2 DR模式

4.2.1 实验环境

|---------|-----------------|-----------------|-----------------|-----------|
| 主机名 | ip | vip | 网关 | 角色 |
| lvs | 192.168.124.200 | 192.168.124.50 | 192.168.124.100 | 调度器(VS) |
| server1 | 192.168.124.10 | 192.168.124.50 | 192.168.124.100 | 真实服务器(RS) |
| server2 | 192.168.124.20 | 192.168.124.50 | 192.168.124.100 | 真实服务器(RS |
| router | 172.25.254.100 | 192.168.124.100 | null | 路由器 |
| client | 172.25.254.200 | null | 172.25.254.100 | 测试机 |

4.2.2 实验步骤

4.2.2.1 网络设置

client :nat模式

router:nat+仅主机模式

lvs:仅主机模式

server1、server2:仅主机模式

bash 复制代码
#server1配置命令
vmset.sh eth0 192.168.124.10 webserver1.timinglee.org
vim /etc/NetworkManager/system.connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
dnf install httpd
echo webserver1 -192.168.124.10 >/var/www/html/index.html
systemctl enable --now httpd

#server2配置命令
vmset.sh eth0 192.168.124.20 webserver2.timinglee.org
vim /etc/NetworkManager/system.connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
dnf install httpd
echo webserver2 -192.168.124.20 >/var/www/html/index.html
systemctl enable --now httpd

4.2.2.2 在路由器中打开内核路由功能
bash 复制代码
sysctl -a | grep ip_forward	#查看内核路由功能
vim /etc/sysctl.conf	#编辑配置文件,打开内核路由功能
net.ipv4.ip_forward=1	#打开内核路由功能
sysctl -p	#使更改后的内核参数立即生效
4.2.2.3 测试httpd服务
bash 复制代码
curl 192.168.124.10	
curl 192.168.124.20	
4.2.2.4下载lvs软件
bash 复制代码
dnf install ipvsadm -y    
systemctl start ipvsadm
4.2.2.5 添加vip
bash 复制代码
lvs和rs上都需要添加vip
ip add a 192.168.124.50/32 dev lo    #临时在环回接口lo上添加vip
ip add del 192.168.124.50/32 dev lo    #配置错误可用此命令删除ip
4.2.2.6 使rs主机中vip不对外响应
bash 复制代码
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#上述代码为临时修改每次重启都得再echo一遍,防止穿透

sysctl -a | grep arp_ignore
sysctl -a | grep arp_announce #永久修改参数将查到的参数复制到/etc/sysctl.conf文件中
vim /etc/sysctl.conf

4.2.3 输入策略测试

bash 复制代码
ipvsadm -a -t 192.168.124.50:80 -r 192.168.124.10:80 -g -w 1 #-g表示直连路由
ipvsadm -a -t 192.168.124.50:80 -r 192.168.124.20:80 -g -w 2

五、防火墙标签解决轮询问题

bash 复制代码
yum install mod_ssl    
systemctl restart httpd

bash 复制代码
iptables -t mangle -A PREROUTING -d 192.168.124.50 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
#防止访问不同端口都调用到一台主机,使主机压力过大
[root@apache ~]# ipvsadm -A -f 66 -s rr
[root@apache ~]# ipvsadm -a -f 66 -r 192.168.124.10 -g
[root@apache ~]# ipvsadm -a -f 66 -r 192.168.124.20 -g
[root@apache ~]# ipvsadm -E -f 66 -s rr-p

相关推荐
正在走向自律1 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
了一li3 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
码农君莫笑3 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
明 庭3 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
BUG 4043 小时前
Linux——Shell
linux·运维·服务器
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程