一篇读懂分布式架构下的负载均衡

一篇读懂分布式架构下的负载均衡,第1张

百度词条里的解释是:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个 *** 作单元上进行执行,共同完成工作任务。
它的目的就通过调度集群,达到最佳化资源使用,最大化吞吐率,最小化响应时间,避免单点过载的问题。

负载均衡可以根据网络协议的层数进行分类,我们这里以ISO模型为准,从下到上分为:
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
当客户端发起请求,会经过层层的封装,发给服务器,服务器收到请求后经过层层的解析,获取到对应的内容。

二层负债均衡是基于数据链路层的负债均衡,即让负债均衡服务器和业务服务器绑定同一个虚拟IP(即VIP),客户端直接通过这个VIP进行请求,那么如何区分相同IP下的不同机器呢?没错,通过MAC物理地址,每台机器的MAC物理地址都不一样,当负载均衡服务器接收到请求之后,通过改写>作业调度器(job
scheduler)是一个使公司能够调度并且,在某些情况下,能管理计算机“批”作业(执行单位,例如一个职工工资表程序的运行)的程序。
作业调度器(job
scheduler)是一个使公司能够调度并且,在某些情况下,能管理计算机“批”作业(执行单位,例如一个职工工资表程序的运行)的程序。作业调度器可以自动地通过处理准备好的作业控制语言语句或通过和一个人类 *** 作者进行同等作用的交互来初始化和管理作业。现在的作业调度器一般都提供一个图形化的用户接口,以及在分布式计算机网络中对所有的 *** 作提供一个单点控制。

在作业调度器(job
scheduler)中可以找到的一些特征包括:
对作业以及完成通告的持续自动的监控
事件驱动的作业的调度
性能监控
报告调度
处理器调度(Multiple-Processor
Scheduling):如果多个CPU,则负载分配(load
sharing)。其中主要讨论处理器功能相同(或同构)的系统,可以将任何处理器用于运行队列内的任何进程
多处理器调度方法:在一个多处理器中,CPU调度的一种方法是让一个处理器(主服务器)处理所有的调度决定、I/O处理以及其他系统活动,其他的处理器只执行用户代码。这种非对称处理(asymmetric
multiprocessing)方法更为简单,因为只有一个处理器访问系统数据结构,减轻了数据共享的需要。另一种方法是使用对称多处理(symmetric
multiprocessing,SMP)方法,即每个处理器自我调度。所有进程可能处于一个共同的就绪队列中,或每个处理器都有自己的私有就绪队列。无论如何,调度通过每个处理器检查共同就绪队列并选择一个进程来执行。如果多个处理器试图访问和更新一个共同数据结构,那么每个处理器必须仔编程:必须确保两个处理器不能选择同一进程,且进程不会从队列中丢失。
处理器亲和性:进程移到其他处理器上时,被迁移的第一个处理器的缓存中的内容必须为无效,而将要迁移的第二个处理器上的缓存需重新构建。由于使缓存无效或重构的代价高,因而SMP努力的使一个进程在同一个处理器上运行,这被称为处理器亲和性,即一个进程需有一种对其他运行所在的处理器的亲和性。软亲和性(soft
affinity, *** 作系统具有设法让一个进程保持在同一个处理器上运行的策略,但不能做任何保证)—硬亲和性(hard
affinity,允许进程指定它不允许移至其他处理器)。
负载平衡(load
balancing):设法将工作负载平均地分配到SMP系统中的所有处理器上。通常只是对那些拥有自己私有的可执行的进程的处理器而言是必要的。两种方法:push
migration(一个特定的任务周期性地检查每个处理器上的负载,如果发现不平衡,即通过将进程从超载处理器移到(或推送到)空闲或不太忙的处理器,从而平均地分配负载,当空闲处理器从一个忙的处理器上推送pull一个等待任务时,发生pull
migration)和pull
migration。会抵消处理器亲和性。达到限额。
对称多线程:提供多个逻辑(而非物理的)处理器来运行几个线程,称为对称多线程(SMT),或超线程(hyperthreading)技术。即使系统仅有单处理器,每个逻辑处理器都有它自己的架构状态,包括通用目的和机器状态寄存器。每个逻辑处理器负责自己的中断处理,这意味着中断被送到并被逻辑处理器所处理,每个逻辑处理器共享其物理处理器的资源,如缓存或总线。SMT是硬件而非软件提供的。硬件应该提供每个逻辑处理器的架构状态的表示以及中断处理方法。调度程序首先设法把不同线程分别调度到每个物理处理器上,而不是调度到同一个物理处理器的不同逻辑处理器上。

线程调度:用户线程---内核线程
系统调度的是内核线程,而不是进程。用户线程由线程库管理,内核并不了解它们。用户线程最终必须映射到相应的内核级线程。轻量级线程(LWP)。
竞争范围:用户线程和内核线程的区别之一是它们是如何被调度的。在执行多对一模型和多对多模型系统上,线程库调度用户级线程到一个有效的LWP上运行,这被称为进程竞争范围(process-contention
scope,PCS)方法,因为CPU竞争发生在属于相同进程的线程之间。为了决定调度哪个内核线程到CPU,内核采用系统竞争范围(system-contention
scope,SCS)方法来进行,竞争CPU发生在系统所有线程中,采用一对一的模型的系统,调度仅使用SCS方法。
PCS是根据优先级完成的。
Pthread调度:在线程生成过程中允许指定是PCS或SCS的。

设计1 进程管理
设计内容
进程的创建和控制
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。每个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。修改以编写的程序,将每个进程输出一个字符改为每个进程输出一句话。
进程的软中断通信
使用系统调用fork()创建两个子进程,使用系统调用signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕上的显示结果,并分析原因。
进程的管道通信
使用系统调用pipe()建立一个管道;两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上。
记录屏幕上的显示结果,并分析原因。
设计2 进程的同步与互斥
设计内容
用程序实现生产者-消费者问题
问题描述: 一个仓库可以存放K件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。
设计3 存储管理
设计内容
将指令序列转换为用户虚存中的请求调用页面流。
页面大小为1K
用户内存容量为4页到40页
用户外存的容量为40k
在用户外存中,按每K存放10条指令,400条指令在外存中的存放方式为:
0-9条指令为第0页
10-19条指令为第1页
。。。。。
390-399条指令为第39页
按以上方式,用户指令可组成40页
通过随机数产生一个指令序列,共400个指令(0-399)
模拟请求页式存储管理中页面置换算法
执行一条指令,首先在外存中查找所对应的页面和页面号,然后将此页面调入内存中,模拟并计算下列各述算法在不同内存容量下的命中率(页面有效次数/页面流的个数)
先进先出的算法(FIFO)
最久未使用算法(LRU)
提示
随机指令的产生
rand() 或srand()
用户内存中页面控制结构采用链表
页面控制结构
struct p_str{
int pagenum; / 页号 /
int count; / 访问页面的次数 /
struct p_str next; / 下一指针 /
}p_str;
#define false 0
#define true 1
#define n 4
#define m 10
struct
{
char type[10];
int count;
int remain;
int address;
}equiptype[n];
struct
{
int number;
int status;
int remain;
char jobname[4];
int lnumber;
}equipment[m];
allocate(J,type,mm)
char J,type;
int mm;
{
int i,t,j;
i=0;
while(i<n&&strcmp(equiptype[i]type,type)!=0)
i++;
if(i>=n)
{
printf("该类设备,设备配失败");
return(false);
}
if(equiptype[i]remain<1)
{
printf("该类设备足配失败");
return(false);
}
t=equiptype[i]address;
while(!(equipment[t]status==1 && equipment[t]remain==0))
t++;
equiptype[i]remain--;
equipment[t]remain=1;
strcpy(equipment[t]jobname,J);
equipment[t]lnumber=mm;
}
reclaim (J,type)
char J,type;
{
int i,t,j,k,nn;
i=0;
while(i<n&&strcmp(equiptype[i]type,type)!=0)
i++;
if(i>=n)
{
printf("该类设备,设备收失败");
return(false);
}
t=equiptype[i]address;
j=equiptype[i]count;
k=0;
nn=t+j;
for(;t<nn;t++)
if(strcmp(equipment[t]jobname,J)==0&&equipment[t]remain==1)
{
equipment[t]remain=0;
k++;
}
equiptype[i]remain= equiptype[i]remain+k;
if(k==0)
printf("该作业没使用该类设备\n");
}
main( )
{
char J[4];
int i,mm,a;
char type[10];
strcpy(equiptype[0]type,"input");
equiptype[0]count=2;
equiptype[0]remain=2;
equiptype[0]address=0;
strcpy(equiptype[1]type,"printer");
equiptype[1]count=3;
equiptype[1]remain=3;
equiptype[1]address=2;
strcpy(equiptype[2]type,"disk");
equiptype[2]count=4;
equiptype[2]remain=4;
equiptype[2]address=5;
strcpy(equiptype[3]type,"tape");
equiptype[3]count=1;
equiptype[3]remain=1;
equiptype[3]address=9;
for(i=0;i<10;i++)
{
equipment[i]number=i;
equipment[i]status=1;
equipment[i]remain=0;
}
while(1)
{
printf("\n0-退1-配2-收3-显示");
printf("\n选择功能项(0~3):");
scanf("%d",&a);
switch(a)
{
case 0 :
exit(0);
case 1 :
printf("输入作业名、作业所需设备类设备相号");
scanf("%s%s%d",J,type,&mm);
allocate(J,type,mm);
break;
case 2:
printf("输入作业名作业归设备类");
scanf("%s%s",J,type);
reclaim(J,type);
break;
case 3:
printf("\n输设备类表\n");
printf(" 设备类型 设备总量 空闲设备\n");
for(i=0;i<n;i++)
printf("%9s%8d%9d\n",equiptype[i]type,equiptype[i]count, equiptype[i]remain);
printf("输设备表:\n");
printf("绝号 /坏 已/未配 占用作业名 相号\n");
for(i=0;i<m;i++)
printf("%3d%8d%9d%12s%8d\n",equipment[i]number, equipment[i]status,equipment[i]remain,equipment[i]jobname,
equipment[i]lnumber);
}
}
}


决策模型类型有经济理性模型、有限理性模型和社会模型,共三类。决策模型是为管理决策而建立的模型,即为辅助决策而研制的数学模型。随着运筹学的发展,出现了诸如线性规则、动态规则、对策论、排队论、存贷模型、调度模型等有效的决策分析方法。
什么是经济理性模型?
经济理性模型认为决策者在任何方面都是完全理性的。相对于理性模型而言,西蒙的有限理性模型更加接近现实。与理性模型相对的另一端,是来自心理学的社会模型。根据弗洛伊德的理论,人类的行为主要是由无意识的需求来驱动的,人类没有办法进行有效的理性决策。虽然绝大多数组织行为学研究者不同意弗洛伊德对人类行为的描述,但是都同意心理对人的决策行为会产生重要影响。
什么是有限理性模型?
有限理性决策模型是相对于理性模型而言,西蒙的有限理性模型更加接近现实,该模型认为在选择备选方案时,决策者试图使自己满意,或者寻找令人满意的结果。满意的标准可以是足够的利润、市场份额、合适的价格等。决策者所认知的世界是真实世界的简化模型。他们满意于这样的简化,因为他们相信真实世界绝大部分都是空洞的。由于采用的是满意原则而非最大化原则,决策者在进行选择的时候不必知道所有的可能方案。
什么是社会模型?
社会决策模型是与理性模型相对的另一端,是来自心理学的社会模型。根据弗洛伊德的理论,人类的行为主要是由无意识的需求来驱动的,人类没有办法进行有效的理性决策。虽然绝大多数组织行为学研究者不同意弗洛伊德对人类行为的描述,但是都同意心理对人的决策行为会产生重要影响。

关于LVS负载均衡

一、什么是负载均衡:

    负载均衡集群提供了一种廉价、有效、透明的方法,来扩展网络设备和

服务器的负载、带宽、增加吞吐量、加强网络数据处理能力,提高网络的灵活性

和可用性。

二、搭建负载均衡服务的需求:

1)把单台计算机无法承受的大规模的并发访问或者数据流量分担到多台节点设备上

分别处理,减少用户等待响应的时间,提升用户体验。

2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备结束后,

将结果汇总,返回给用户,系统处理能力得到大幅度提升。

3)724的服务保证,任意一个或多个有限节点设备宕机,要求不能影响业务。

三、LVS的介绍:

    LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器

集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。

    该项目是在1998年5月由章文嵩博士组织成立的,是中国国内最早出现的自由

软件项目之一。

四、关于LVS的配置使用:

    LVS负载均衡调度技术是在Linux内核中实现的,因此,被称为Linux

虚拟服务器。我们使用该软件配置LVS时候,不能直接配置内核中的ipvs,

而需要使用ipvs的管理工具ipvsadm进行管理,ipvs的管理工具ipvsadm管理ipvs。

五、LVS技术点小结:

1)真正实现负载均衡的工具是ipvs,工作在linux内核层面。

2)LVS自带的ipvs管理工具是ipvsadm。

3)keepalived实现管理ipvs及对负载均衡器的高可用。

4)Red hat工具Piranha WEB管理实现调度的工具ipvs。

六、LVS体系结构与工作原理:

1)LVS集群负载均衡接收服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。

负载均衡(LB)有时也被称为LVS Director(简称 Director)

2)LVS虚拟服务器的体系结构如下图,一组服务器通过高速的局域网或者地理分布

的广域网相互连接,在他们的前端有一个负载调度器(Load Balancer)。负载调度器能

无缝地将网络请求调度到真正的服务器上,从而使得服务器集群的结构对客户是透明的,

客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序

不受服务器集群的影响不需做任何修改。系统的伸缩性通过在服务集群中透明地加入和删除

一个节点来达到,通过检测节点或服务进程故障和正确的重置系统达到高可用性。由于我们的负载调度技术在

linux内核中实现的,我们称之为linux虚拟服务器(Linux Virtual Server)。

七、LVS社区提供了一个命名的约定:

名称:                              缩写         

虚拟IP地址(Virtual IP Address)    VIP

说明:VIP为Director用于向客户端计算机提供服务的ip地址,

比如:>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13485822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-16
下一篇 2023-08-16

发表评论

登录后才能评论

评论列表(0条)

保存