NameServer本身的负载均衡是用LVS实现的,前边已经介绍过LVS这里就不再赘述,这里主要阐述一下NameServer对DataServer的负载均衡调度算法。
负载均衡主要有两种负载均衡算法,一种是静态负载均衡另外一种是动态负载均衡。静态负载均衡是完全根据先验知识做出决策而并不考虑实时的系统负载情况,也就是说一个任务的分配跟服务器的负载情况是无关的,一般用在任务比较确定的情况下。静态负载均衡是通过任务的划分和任务分配(排队法、概率法、随机法、图论法)来达到调节负载的目的。静态负载均衡实现起来比较简单,但是这种策略不考虑当前系统中的负载状况,具有一定的盲目性所以决策准确度比较低。此外,决定静态负载效率的一个重要因素就是对系统和任务的特征如任务通信和执行代价等是否了解充分,如果对这些先验知识没有充分了解或者有些偏差,那这种策略的效率会更低。
动态负载均是根据系统实时的负载情况动态地将任务在各处理机之间调整,以达到调节系统负载的目的,一般用于任务不确定的情况。系统中任务是动态到达各个服务器的,所以服务器上的负载有时会突发地减少或者增加。在服务器超载时,应将其部分任务迁移到负载较轻的服务器上,或者由负载较轻的服务器主动提出申请将超载服务器部分任务转移过去。动态负载均衡策略就具有更大的针对性和灵活性,可根据系统实时的负载状况进行有针对性的调整,对系统负载和任务执行进行动态的调整。尽管在收集分析系统负载时会有一定的开销,但是针对性的调整之后系统性能将取得更大地改善。
在NameServer对DataServer的负载调度中我们采用的是动态负载均衡,调度依据是服务器的综合指数,综合指数有容量、Block文件数等综合计算来的。NameServer每次选择一个指数最低的调度写入文件,写入文件后会更新服务器的综合指数,为下一次调度做动态调整。
数据一致性
因为在NameServer集群中每台服务器对等,因此就需要在每一台NameServer进程中都有一份BlockId-DataServerId的映射表、Server的注册表等数据内容,这些内容要求集群内部的数据要一致,否则可能会出现系统错误。因此系统用到了Zookeeper,Zookeeper通过Paxos来实现数据一致性,在数据持久化上使用了高性能的Key-Value数据库Redis。
图表 25 NameServer数据一致性模型
当其中一台数据有变化是将通过Zookeeper来同时更新其他NameServer以达到数据的一致性。
DataServer设计
DataServer是由一组服务器组成的集群,其主要负责数据的存储、Block的维护、文件名的生成等。
存储结构
存储由多个DataServer组成,每个DataServer上有多个Block文件,Block文件包含数据文件和索引文件,数据文件中按空间存放数据,Index文件中存储数据的Meta信息和文件在数据文件中的偏移地址等信息。数据文件根据设置初始化时预分配相应的连续空间,假设我们设每个数据文件大小为10GB,在初始化是将创建一个10GB的数据文件,Index文件的Current Offset为0,每写入一个文件都要跟新Current Offset并且在Index文件中增加一条记录,Index文件中的索引部分数据并不大考虑到运行效率问题所以Index文件的所以部分全部加在到内存中并以Hashmap的数据结构存储。
图表 26 DataServer文件结构
每两台DataServer组成一组,组内的两台DataServer中的Block文件进行互备,关于数据备份的内容后文会有详细说明。
维普论文检测系统文章欢迎转载,转载请以链接形式标明本文地址。