背景技术
分布式海量存储系统,又称为大规模分布式文件系统,主要是针对大规模的数据存储和数据访问而开发的。其主要的特点是文件系统中的内容可以存储在多台机器上,并通过网络来进行数据的共享和传输,具有很强的稳健性和可扩展性。一般都是一次存储,多次访问,所以对访问的并发性要求很高。如图1所示,分布式海量存储系统主要分为3个部分:主服务器(Master Server)、文件块存储服务器(Chunk Server)及客户端(Client)。
主服务器:管理文件的元数据,主要包括文件名字空间、文件到文件块(Chunk)的映射、文件块(Chunk)到文件块存储服务器(Chunk Server)的映射,部署在分布式服务器上。
文件块存储服务器(Chunk Server):管理每个分布式节点上的文件存储。根据主服务器的指令对文件块(Chunk)进行新建、删除和复制操作,部署在分布式节点上。
客户端:对应用端提供服务,提供文件的创建,读取,写入功能。它通过向主服务器、文件块存储服务器(Chunk Server)发送命令来提供服务,部署在应用端上。
在文件块存储服务器(Chunk Server)上,文件存储的基本组织单位是文件块(Chunk)。例如,可将一个文件块(Chunk)的大小设定为32MB。如果一个文件的大小超过32MB,则把这个文件分割成几个文件块(Chunk)来进行存储,每个文件块(Chunk)最大不超过32MB。文件系统对文件的读写最后都转化为对文件块(Chunk)的读写。对用户来说,文件块(Chunk)是不可见的。由于分布式海量存储系统为了实现高可靠性,都会进行文件块的备份,一般来说,一个文件块(Chunk)有两个副本,也就是说有三个相同的文件块(Chunk)分别存储在不同的文件块存储服务器(Chunk Server)上,所以当某台文件块存储服务器(ChunkServer)出现故障时,不会破坏文件。
分布式海量存储系统经过长时间的运行,某些文件块存储服务器(ChunkServer)可能会由于拥有较多的被频繁访问的文件块(Chunk)而导致负载过重,而另外一些原来负载较轻的文件块(Chunk)存储服务可能会因为自身一些性能参数的改变,如部分内存条失效导致内存减少,网络环境改变导致网络流量变少等等,而变得负载过重。也就是说,长时间运行的系统会出现文件块存储服务器(Chunk Server)负载不均的情况,需要对某些文件块存储服务器(ChunkServer)的负载进行重新分配。由于文件块存储服务器(Chunk Server)的一些与硬件相关的性能参数,如磁盘容量、CPU、内存、网络流量等都较难在短时间内改变,而连接数因为与客户端的访问相关,也不能轻易通过断绝连接的方式来减轻文件块存储服务器(Chunk Server)的负载。因此对某些负载过重的文件块存储服务器(Chunk Server)主要采用对存储在该文件块存储服务器(ChunkServer)上的文件块(Chunk)进行迁移来达到减轻其负载的目的,这就是文件块(Chunk)均衡策略。
主服务器(Master Server)根据各个文件块存储服务器(Chunk Server)的CPU的平均使用率、网络带宽的平均使用率、磁盘容量、客户端的平均访问量等参数即所有文件块存储服务器(Chunk Server)的负载量设定两个负载阈值——重载阈值和轻载阈值,负载高于重载阈值的文件块存储服务器(Chunk Server)为重载服务器,负载低于轻载阈值的为轻载服务器,然后计算出重载服务器中需要迁出的文件块和轻载服务器中需要迁入的文件块数量。对于其具体算法,需要视情况而定。例如,在《面向现代服务业的大规模分布式文件存储系统设计和实现》(硕士论文,作者:李武)的3.3.3节中介绍一种具体算法,其基本思路为:首先计算系统的整体平均负载(具体计算方法可以),假定为avg;设定系统的波动值为u,u值可以根据实际情况进行修改;那么系统的重载阈值为avg+u,记为hight;轻载阈值为avg-u,记为low;对于每一台重载服务器,计算出要进行迁出的文件块,形成重载服务器列表;假定某台重载服务器的负载为x,则迁出的文件块数=(x-hight)/每个文件块所占的负载,记为out_chunkQuantity;计算迁出的文件块数量后,需要定位到具体的文件块;海量分布式系统会记录每个文件在一段时间内的访问次数;系统一般分5个访问频率访问段,从每个频段里随机选择out_chunkQuantity/5个文件块作为要迁移的文件块;同样对于每一台轻载服务器,计算出要进行迁入的文件块数,形成轻载服务器列表;假定某台重载服务器的负载为y,则迁出的文件块数=(low-y)/每个文件块所占的负载,记为in_chunkQuantity。
设定好重载服务器和轻载服务器后,可以将重载服务器中的相应文件块迁移到轻载服务器进行均衡。但是如果应用现有的一些负载均衡算法,就有可能使得一个文件块(Chunk)连同它的2个副本被均衡到同一个文件块存储服务器(Chunk Server)上,假如碰巧这个文件块存储服务器(Chunk Server)出现死机或其它意外情况,那么因为这个文件块(Chunk)连同它的副本都失效而导致整个文件不能访问。
鉴于此,本发明提出了一种负载均衡方法来解决分布式文件服务器的各个节点间的负载均衡问题,该负载均衡算法始终保证一个文件块(Chunk)的3个文件块(Chunk)都分配在3台不同的文件块存储服务器(Chunk Server)上,在实现各个文件块存储服务器(Chunk Server)负载均衡的同时又保证了系统的可靠性。
发明内容
为了在进行负载均衡的同时保证一个文件块(Chunk)的不同副本保存在不同的文件块存储服务器(Chunk Server)上,本发明提供一种新的负载均衡方法。在设置好重载服务器和轻载服务器以后,该方法通过以下步骤实现:
(1)对文件块(Chunk)进行标识的方法,该文件块(Chunk)的标识信息含有该文件块(Chunk)的识别标记以及该文件块和其所有副本所在文件块存储服务器的标识。例如,可用一个数值或特征字符串作为该文件块(Chunk)的识别标记,如果该文件块(Chunk)还有2个副本,及该文件块(Chunk)一共有三个拷贝,则该文件块(Chunk)的标识信息还含有三个拷贝所在文件块存储服务器(Chunk Server)的标识。其中,所述的文件块存储服务器(Chunk Server)的标识信息含有该文件块存储服务器(Chunk Server)的识别标记以及该文件块存储服务器上(ChunkServer)所有文件块的识别标记。
(2)对重载服务器进行标识,该标识信息含有该重载服务器的识别标记、需要迁出的文件块(Chunk)的数量、需要迁出的文件块(Chunk)的标识。因为按照第(1)步所述,文件块(Chunk)的标识信息含有该文件块(Chunk)的识别标记以及该文件块和其所有副本所在文件块存储服务器的标识,因此重载服务器的标识信息同样也包含有需要迁出的文件块(Chunk)的标识中含有的这些信息。
(3)对轻载服务器进行标识,该标识信息含有该轻载服务器的识别标记、需要迁入的文件块(Chunk)数量。
(4)将重载服务器按照需要迁出的文件块(Chunk)的数量进行降序排序,将含有需要迁出的文件块(Chunk)的数量最多的重载服务器排在最前面,即第一个重载服务器。
(5)将轻载服务器按照需要迁入的文件块(Chunk)数量进行降序排序,将含有需要迁入的文件块(Chunk)数量最多的轻载服务器排在最前面,即第一个轻载服务器。
(6)将第一个重载服务器上所有需要迁出的文件块(Chunk)的标识信息中的所有文件块存储服务器(Chunk Server)的识别标记形成一个文件块存储服务器集合。对第一个轻载服务器加以判定,如果第一个轻载服务器不属于该文件块存储服务器集合,说明第一个重载服务器中需要迁出的文件块(Chunk)在第一个轻载服务器上没有副本存在,则将第一个重载服务器上需要迁出的文件块(Chunk)迁移到第一个轻载服务器中,然后重新循环进行第(4)步及后续步骤直至负载均衡完成;如果第一个轻载服务器属于该文件块存储服务器集合,说明第一个重载服务器中部分需要迁出的文件块(Chunk)的在第一个轻载服务器上有副本存在,则将那些在第一个轻载服务器有副本存在的文件块去除,将剩下的文件块迁移到第一个轻载服务器中,然后重新循环进行第(4)步及后续步骤直至负载均衡完成。
在执行上述负载均衡的过程中可能碰到的问题有,第一个重载服务器上需要迁出的文件块(Chunk)的数量大于第一个轻载服务器上需要迁入的文件块(Chunk)的数量,这样,便不能将第一个重载服务器上需要迁出的文件块(Chunk)全部迁移到第一个轻载服务器,这样便需要将第一个重载服务器上需要迁出的文件块(Chunk)迁移到多个轻载服务器。所采取的方法是,将轻载服务器进行降序排列后,选取排在前面的多个轻载服务器直至其需要迁入的文件块(Chunk)数量之和大于等于需要迁出文件块数量,按照所选取的轻载服务器需要迁入的文件块(Chunk)数量将第一个重载服务器上需要迁出的文件块分为数份,所分的份数与所选取的轻载服务器的数量一致。例如,第一个重载服务器上需要迁出的文件块(Chunk)的数量为10个,4个轻载服务器需要迁入的文件块(Chunk)数量依次为4个、3个、2个、1个,则将第一个重载服务器上需要迁出的文件块(Chunk)分为4份,第1份为4个文件块,第2份为3个文件块,第3份为2个文件块,第1份为1个文件块。然后依次将分为数份的文件块按照上述第(6)步的方法迁移到第一个轻载服务器,每执行一次迁移后对按照步骤(5)对轻载服务器进行降序排序。
本发明的优点是,在将文件块(Chunk)从负载超过重载阈值的重载服务器迁移到负载低于轻载阈值的轻载服务器的过程中,始终保证一个文件块(Chunk)的3个拷贝都分配在3台不同的文件块存储服务器(Chunk Server)上,这样既保证了各个文件块存储服务器(Chunk Server)的负载均衡,又保证了系统的可靠性。
具体实施方式
下面结合附图举例说明本发明的具体实施方式,如图2所示。在本实施例中,采用如下步骤实现负载均衡:
1.对文件块(Chunk)标识的方法
在对文件块进行标识时,用唯一的识别标记表示该文件块并需要表示该文件块的所有拷贝所在的文件块存储服务器(Chunk Server),例如,假定一个文件File含有n个不同的文件块:File={Fm_fb1,Fm_fb2,...,Fm_fbn},其中,Fm代表一个文件,Fm_fbn表示这个文件的某一个块,m和n可作为该文件块的识别标记,假定每个不同的文件块一共有三个拷贝,分别处于不同的文件块存储服务器(Chunk Server)上,则可以对文件块Fm_fbn进行如下标识:
Fm_fbn={chunkSi,chunkSj,chunkSk},(i,j,k)∈N
其中,(1)N表示整个分布式文件系统所用的Chunk Server数;(2)chunkSi是第i台Chunk Server的标识;(3){chunkSi,chunkSj,chunkSk}表示Fm_fbn文件块分别存储在chunkSi,chunkSj,chunkSk上。
chunkSi是第i台Chunk Server的标识,该标识具体为:chunkSi={...,m_n,...},表示第i个Chunk Server中包含的文件块为Fm_fbn等,其中,i为该Chunk Server的识别标记,m_n为文件块的识别标记。
2.对重载服务器进行标识
重载服务器的集合记为矩阵P。P={p1,p2,...,pi,...,pm},Pi表示具体某一台重载服务器,pi=[chunkServerId,Oi],Oi={File1_fb1,File2_fb3,...,Filej_fbk}。其中,(1)Pi是一个数据结构,表示第i台Chunk Server的识别标记(chunkServerId,即上述的i)以及要迁出的所有文件块的标识;(2)Oi表示第i台chunk Server要迁出的文件块为:{File1_fb1,File2_fb3,...,Filej_fbk},Filej_fbk即上述文件块的标识。
3.对轻载服务器进行标识
轻载服务器的集合记为矩阵R。R={r1,r2,...ri,...rn},Ri表示具体某一台轻载服务器,ri=[chunkServerId,chunkQuantity]。其中,chunkServerId为该轻载服务器的识别标记,chunkQuantity为该轻载服务器需要迁入的文件块数量。
4.负载均衡方法
以下为本发明负载均衡的具体算法,其中部分符号说明:(1)frst(P):表示矩阵P的第一个chunk Server的唯一标识以及要迁出的文件块;(2)first(R):表示矩阵R中的第一个chunk Server的唯一标识以及要迁入的文件块数;(3)size(first(P).O):表示P的第一个chunk Server要迁出的文件块数量。(4)p.O:表示某台Chunk Server要迁移出的文件块。
假设分布式海量存储系统总体负载在一开始时是稳定的,那么就有 负载越重的Chunk Server越迫切要进行Chunk的重平衡,把Chunk迁移到轻载Chunk Server上,把Chunk迁移到负载最轻的Chunk Server上更能体现整个文件系统的负载均衡。具体算法如下:
(1)将R按r.chunkQuantity降序排序,P按p.O中文件块数量降序排序;如果size(first(P).O)=0或者超时,则退出;
(2)if(size(first(P).O)<=first(R).chunkQuantity)
//第一个重载服务器上需要迁出的Chunk的数量小于第一个轻载服务器上需要
迁入的文件块的数量//
{
Set p=first(P),n=size(p.O),r=first(R);
//将第一个重载服务器上所有需要迁出的文件块(Chunk)的标识信息中
的所有Chunk Server的识别标记形成一个文件块存储服务器集合//
//第一个轻载服务器不属于该文件块存储服务器集合,说明第一个重载服务器中需要迁出的文件块(Chunk)在第一个轻载服务器上没有副本存在//
{
Master Server通知该p.chunkServerId和r.chunkServerId对应的两台
Chunk Server进行负载均衡,并删除p,r.chunkQuantity=
r.chunkQuantity-n;继续进行步骤(1);
}else
//第一个轻载服务器属于该文件块存储服务器集合,说明第一个重载服务器中部
分需要迁出的文件块(Chunk)的在第一个轻载服务器上有副本存在//
{
Set File_fbs=p.O-chunkSr.chunkServerId;
//将已经在第一个轻载服务器上有副本存在的Chunk去除,剩下的
文件块进行迁移//
Master Server通知该r.chunkServerId和p.chunkServerId对应的两台
Chunk Server进行负载均衡,把文件块File_fbs从p.chunkServerId
对应的Chunk Server迁移到r.chunkServerId对应的Chunk Server,
并令p.O=p.O∩chunkSr.chunkServerId,r.chunkQuantity=
r.chunkQuantity-size(File_fbs);继续步骤1;
}
}
(3)if(size(first(P).O)>first(R).chunkQuantity)
//第一个重载服务器上需要迁出的Chunk的数量大于第一个轻载服务器上需要
迁入的文件块的数量//
{
选取t,使得 Set p=first(P);按照
r.chunkQuantity的大小分p.O中的文件块为t份,按降序记为
p.O={O1,O2,...,Ot};
For each O∈p.O
//执行循环算法,将每一份文件块依次按照上述方法进行负载均衡//
{
Set n=size(O),r=first(R),
Master Server通知该p.chunkServerId和r.chunkServerId对应的
两台Chunk Server进行负载均衡,把O对应的文件块迁移到
r.chunkServerId对应的Chunk Server上,并且令O=null,
r.chunkQuantity=r.chunkQuantity-n;
}else{
Set File_fbs=O-chunkSr.chunkServerId;Master Server通知该
p.chunkServerId和r.chunkServerId对应的两台Chunk Server进行
负载均衡,把文件块File_fbs从p.chunkServerId对应Chunk
Server迁移到r.chunkServerId对应Chunk Server,令
O=O∩chunkSr.chunkServerId,
r.chunkQuantity=r.chunkQuantity-size(File_fbs);
}
将R按r.chunkQuantity降序排序;
}
Set Otemp=null;
For each O∈p.O
if(O!=null)Otemp.add(O);
if(Otemp!=null)p.O=Otemp;
else删除p;
续进行步骤(1);
}