构建负载均衡服务器之二 LVS详解及应用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

在上一篇中介绍了负载均衡及集群的原理,本篇主要介绍下下实现负载均衡的软件之LVS的原理及应用。

一、LVS的介绍

1、  LVS的定义

一般来说,LVS采用三层结构:负载调度器、服务器池、共享存储。工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛选,可想而知,这就需要在内核的模块来完成,而这样的过滤转发规则又是由管理员进行定义的,所以,LVS就是两段式的架构设计,在内核空间中工作的是"ipvs",而在用户空间中工作的,用来定义集群服务规则的是"ipvsadm"。这就很容易想到iptablesLVS正好工作在iptablesinput链上。

2、  LVS的组成

ipvsadm:用于管理集群服务的命令行工具,工作于Linux系统中的用户空间。

ipvs:为lvs提供服务的内核模块,工作于内核空间 (相对于是框架,通过ipvsadm添加规则,来实现ipvs功能)

注:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以使用此功能。

3、  LVS中每个主机IP地址的定义

VIPDirector用来向客户端提供服务的IP地址,也是DNS解析的IP

RIP:集群节点(后台真正提供服务的服务器)所使用的IP地址

DIPDirector用来和RIP进行交互的IP地址

CIP:公网IP,客户端使用的IP

4、  LVS的三种转发模式

LVS-NAT:网络地址转换 NetworkAddress Translation

LVS-DR:直接路由 Direct Routing

LVS-TUNIP隧道 IP Tunneling

5、  LVS的三种转发模式特点

NAT

a、  集群节点跟director必须在同一个网段上面

b、  RIP通常是私有地址,仅用于个集群

c、  支持口映射

d、  realsever可以使用任意OS(操作系统)

e、  较大规模应用场景中director已成为系统瓶颈

wKioL1VljlHx4-_EAAHz5UrkKy4793.jpg


DR

a、集群节点跟director必须在同一个物理网络中

bRIP可以使用公网地址.实现便捷的远程控制服务器

cdirector只负责处理入站请求,相应报文则有realserver直接发往客户端

drealserver不能将网关指向DIP

edirector不支持端口映射

f、大多数操作系统都能应用在realserver

gDRNAT能处理更多的realserver

wKioL1VlkBvigNtLAAI2zqAH7C4417.jpg


TUN

a、各集群节点可以跨越不同的网络

bRIP必须是公网地址

cdirector只负责处理入站请求,相应报文则有realserver直接发往客户端

drealserver网管不能指向director

e、只有支持隧道共跟那个的os才能用户realserver

不支持端口映射

注:在实际应用中用的不多这里就不再具体演示!

wKiom1Vljr2SMG_QAAI2zqAH7C4164.jpg


1、  LVS的调度算法

静态调度算法(4种):

(1)rr : round robin :轮叫,轮询  

说明:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。

(2)wrr: weight round robin :加权轮询(以权重之间的比例实现在各主机之间进行调度 

说明:由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

(3)sh : source hashing : 源地址hash 实现会话绑定sessionaffinity  

说明:简单的说就是有将同一客户端的请求发给同一个real server,源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。

(4)dh : destination hashing : 目标地址hash  

说明:将同样的请求发送给同一个server,一般用户于缓存服务器说,简单的说,LB集群后面又加了一层,在LBreal server之间加了一层缓存服务器,当一个客户端请求一个页面时,LB发给cache1,当第二个客户端请求同样的页面时,LB还是发给cache1,这就是我们所说的,将同样的请求发给同一个server,来提高缓存的命中率。目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

动态调度算法(6种):

(1)lc :leash-connection 最少连接 

说明:最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差,通过加权重来区分性能,所以有了下面算法wlc

简单算法:active*256+inactive (谁的小,挑谁)

(2)wlc :加权最少连接  

加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。由于服务器的性能不同,我们给性能相对好的服务器,加大权重,即会接收到更多的请求。

简单算法:(active*256+inactive/weight(谁的小,挑谁)

(3)sed :最少期望延迟  

说明:不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq

基于wlc算法,简单算法:(active+1)*256/weight (谁的小选谁)

(4).nq :never queue 永不排队   

说明:在上面我们说明了,由于某台服务器的权重较小,比较空闲,甚至接收不到请求,而权重大的服务器会很忙,所此算法是sed改进,就是说不管你的权重多大都会被分配到请求。简单说,无需队列,如果有台real server的连接数为0就直接分配过去,不需要在进行sed运算。

(5).LBLC :基于局部性的最少连接  

说明:基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。

(6).LBLCR :基于局部性的带复制功能的最少连接   

说明:基于局部性的带复制功能的最少连接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

注:LVS默认调度算法是 wlc 

2、  定义集群服务规则的ipvsadm命令

(1)管理集群服务   

ipvsadm –A|E|D  -t |u|f server-adddress [-s scheduler] 

-t :tcp协议的集群         service-address后面必须写成ip:port 

-u :udp协议的集群        service-address后面必须写成ip:port 

-f :fwm 防火墙的标记     service-address后面必须写成marknumber 

-s :指定调试算法       

-A添加 –E 修改 –D删除

(2)管理集群服务中的realserver

ipvsadm –a|e|d  -t|u|f server-adddress -r server-address  [-g|i|m]  [-w weight] 

 -t|u|f service-address 实现定义好的某集群服务 

 -rserver-address rs的地址在nat模型中可使用ip:port实现端口映射 

 [-g|i|m] lvs类型

 -g :DR   -i : TUN -m : NAT   [-w weight] 指定权重

 -a添加  -e修改 –d删除

(3).查看

ipvsadm -L | ipvsadm  -l ....

-n        显示主机地址和端口为数字格式 

--stats     显示进出站数据 

--rate      显示速率 

--timeout  显示每一个tcp  tcpfin udp 的超时时间值 

--deamon  显示进程信息 

--sort     显示排序规则默认是升序的 

-c        显示多少个客户连接进来

(4).删除所有集群服务 

清空ipvs规则    

ipvsadm –C

(5).保存定义的规则

service ipvsadm save 

ipvsadm -S    > /path/to/somefile

(6).载入此前的规则 

ipvsadm -R 

ipvsadm -R < /path/to/somefile


二、LVS-NAT模式演示

简单实验拓扑如下:

wKiom1VhpH6SpWSOAAHJ_M2bq7I129.jpg


Web Server 1测试页

wKioL1VhpeyBMnOUAABfvrEid30516.jpg

Web Server 2测试页

wKiom1VhpGDQMQHWAABfgfbVpZI040.jpg

lvs主机上的操作:

1
2
3
4
5
6
[root@lvs ~] # yum -y install kernel-devel  popt-static gcc libnl* libpopt* (请根据实际情况安装)
[root@lvs ~] # ln -s/usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[root@lvs ~] # wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@lvs ~] # tar -zxf ipvsadm-1.24.tar.gz
[root@lvs ~] # cd ipvsadm-1.24
[root@lvs ipvsadm-1.24] # make &&make install

开启ip转发

1
2
3
[root@lvs ~] # vim /etc/sysctl.conf
把net.ipv4.ip_forward = 0改为net.ipv4.ip_forward= 1
[root@lvs ~] # sysctl –p

配置lvs-nat模型

1
2
3
4
5
6
7
8
9
10
11
[root@lvs ~] # ipvsadm -A -t192.168.2.200:80 -s rr
[root@lvs ~] # ipvsadm -a -t192.168.2.200:80 -r 192.168.1.10 -m -w 3
[root@lvs ~] # ipvsadm -a -t192.168.2.200:80 -r 192.168.1.20 -m -w 1
[root@lvs ~] # ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP 192.168.2.200:80 rr
  -> 192.168.1.20:80             Masq    1      0         0        
  -> 192.168.1.10:80             Masq    3      0         0        
[root@lvs ~] #

保存lvs规则

1
2
3
4
5
6
7
[root@lvs ~] # /etc/init.d/ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm :               [确定]
[root@lvs ~] # cat /etc/sysconfig/ipvsadm
-A -t 192.168.2.200:80 -s rr
-a -t 192.168.2.200:80 -r 192.168.1.20:80-m -w 1
-a -t 192.168.2.200:80 -r 192.168.1.10:80-m -w 3
[root@lvs ~] #

通过VIP访问

wKioL1VhpliTRtf0AABj2FP2-TU936.jpg

刷新(由于设置的权重一样,所以刷一下会变一下。)

wKiom1VhpM2znUc9AABpsnVw8Bw445.jpg


三、LVS-DR 模式演示


wKioL1VlkGXiezlLAAI2zqAH7C4302.jpg

1、  IP规则

Director:

eth0 192.168.1.100 DIP

eth0:0 192.168.1.188 VIP

RS1:

eth0: 192.168.1.10 RIP

lo0:0 192.168.1.188 VIP

RS2:

eth0: 192.168.1.20 RIP

lo0:0 192.168.1.188 VIP

2、关闭arp响应

web1上:

1
2
3
4
5
6
[root@web1 ~] # sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web1 ~] # sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~] # echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web1 ~] # echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore

web2上:

1
2
3
4
5
6
[root@web2 ~] # sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web2 ~] # sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~] # echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web2 ~] # echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore

说明:

arp_ignore: 定义接收到ARP请求时的响应级别;

 0:只要本地配置的有相应地址,就给予响应;

 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;

arp_ignore = 1

arp_announce:定义将自己地址向外通告时的通告级别;

 0:将本地任何接口上的任何地址向外通告;

 1:试图仅向目标网络通告与其网络匹配的地址;

 2:仅向与本地接口上地址匹配的网络进行通告;

arp_announce = 2

3、配置VIP

directory上:

1
[root@lvs ~] # ifconfig eth0:0 192.168.1.188 netmask 255.255.255.0

web1上:

1
[root@web1 ~] # ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up

web2上:

1
[root@web2 ~] # ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up

4、增加路由

directory上:

1
[root@lvs ~] # route add -host 192.168.1.188  dev eth0:0

web1上:

1
[root@web1 ~] # route add -host 192.168.1.188  dev lo:0

web2上:

1
2
[root@web2 ~]
route add -host 192.168.1.188  dev lo:0

5、配置lvs-dr

1
2
3
4
5
6
7
8
9
10
11
[root@lvs ~] # ipvsadm -A -t192.168.1.188:80 -s wlc
[root@lvs ~] # ipvsadm -a -t192.168.1.188:80 -r 192.168.1.10 -g -w 2
[root@lvs ~] # ipvsadm -a -t192.168.1.188:80 -r 192.168.1.20 -g -w 1
[root@lvs ~] # ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP 192.168.1.188:80 wlc
  -> 192.168.1.20:80             Route   1      0         0        
  -> 192.168.1.10:80             Route   2      0         0        
[root@lvs ~] #

6、测试

刷新访问VIP 192.168.1.188

wKioL1VhpryC9cdoAABfeKqe9JM139.jpg

wKiom1VhpTGjiPVtAABhO0h4kM4171.jpg

NAT模式中,real server的网关必须要指定为DIP;DR模式中一般不指定网关(网关指定为DIP也是ok的)



本文转自Jacken_yang 51CTO博客,原文链接:http://blog.51cto.com/linuxnote/1654750,如需转载请自行联系原作者

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
运维 应用服务中间件 网络安全
自动化运维的利器:Ansible在服务器管理中的应用
【8月更文挑战第28天】本文深入探讨了Ansible在简化和自动化服务器管理工作中的强大功能及其实际应用。通过浅显易懂的语言和具体示例,展示了如何利用Ansible进行批量配置、部署应用以及执行系统管理任务,旨在为读者提供一套完整的解决方案,以便更好地理解和应用Ansible,从而提高工作效率和减轻运维负担。
|
3天前
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
16 2
|
19天前
|
存储 弹性计算 缓存
惊爆!企业级 ECS 集群构建的巅峰对决:谁能主宰未来的命运?
【8月更文挑战第13天】在数字化商业环境中,构建企业级ECS集群对提高业务稳定性、扩展性和性能至关重要。与传统物理服务器相比,ECS可根据需求快速伸缩资源,提升效率和响应速度。选择云服务商时需考量服务广度、成本及网络覆盖。配置ECS实例要考虑业务特性,如计算或内存需求。网络架构方面,软件定义网络(SDN)比传统三层架构更灵活高效。存储方案的选择也影响性能和扩展性。综上所述,构建高效稳定的ECS集群需综合考量多种因素,以支持业务发展。
30 3
|
1天前
|
JavaScript 前端开发 UED
服务器端渲染新浪潮:用Vue.js和Nuxt.js构建高性能Web应用
【8月更文挑战第30天】在现代Web开发中,提升应用性能和SEO友好性是前端开发者面临的挑战。服务器端渲染(SSR)能加快页面加载速度并改善搜索引擎优化。Vue.js结合Nuxt.js提供了一个高效框架来创建SSR应用。通过安装`create-nuxt-app`,可以轻松创建新的Nuxt.js项目,并利用其自动路由功能简化页面管理。Nuxt.js默认采用SSR模式,并支持通过`asyncData`方法预取数据,同时提供了静态站点生成和服务器端渲染的部署选项,显著提升用户体验。
|
2天前
|
存储 Ubuntu 搜索推荐
构建多用户的 Jupyter 服务器 —— 利用 JupyterHub
【8月更文第29天】**摘要** JupyterHub 是一个易于使用的、可伸缩的、多用户的 Jupyter Notebook 服务器。它允许您在一个集中式服务器上托管多个独立的 Jupyter Notebook 会话,非常适合团队协作和教学环境。本文将详细介绍如何安装和配置 JupyterHub,以及如何利用它来构建一个多用户 Jupyter 服务器环境。
8 0
|
10天前
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。
|
18天前
|
存储 文件存储
用 Raspberry Pi 5 构建文件服务器(NAS)
用 Raspberry Pi 5 构建文件服务器(NAS)
31 0
|
16天前
|
机器学习/深度学习 编解码 人工智能
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析
随着人工智能、大数据和深度学习等领域的快速发展,GPU服务器的需求日益增长。阿里云的GPU服务器凭借强大的计算能力和灵活的资源配置,成为众多用户的首选。很多用户比较关心gpu云服务器的收费标准与活动价格情况,目前计算型gn6v实例云服务器一周价格为2138.27元/1周起,月付价格为3830.00元/1个月起;计算型gn7i实例云服务器一周价格为1793.30元/1周起,月付价格为3213.99元/1个月起;计算型 gn6i实例云服务器一周价格为942.11元/1周起,月付价格为1694.00元/1个月起。本文为大家整理汇总了gpu云服务器的最新收费标准与活动价格情况,以供参考。
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析
|
6天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
在云计算领域,阿里云凭借其强大的技术实力和丰富的产品线,为用户提供了一系列高效、便捷的云服务器产品。其中,轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、产品优势以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
|
10天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
阿里云轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、最新活动价格以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
下一篇
云函数