发明内容
本申请提供了一种云存储服务中元数据服务节点的多节点热备方法,可以有效防止元数据服务节点的单点故障,从而提高整个系统的数据安全性。
本申请实施例提供的一种云存储服务中元数据服务节点的多节点热备方法,包括:
A、在云存储系统中设置至少3台元数据服务节点,从中选出一台作为主机节点,其他的作为备机节点;
B、主机节点提供元数据更新服务,并将更新后的元数据同步到备机节点;
C、当主机节点发生故障时,从备机节点中选举出一台作为新的主机节点。
较佳地,步骤B包括:
B1、主机节点正确处理该数据更新请求后,将需要更新的元数据保存在第一缓存中;将需要更新的元数据包装成一个个的对象,形成对象列表;将形成的对象列表放入一个待办理业务中,生成一个远程调用请求也放入所述待办理业务中,并给所述待办理业务分配一个顺序增长的待办理业务标识;所述远程调用请求中除了包含数据更新请求的所有信息,还包括分配给文件的存储位置信息;
B2、当第一缓存中的元数据的量超过第一阈值或者经过预定时间后,触发主机节点处理待办理业务:将对象列表中的内容加入到相对于第一缓存更大的第二缓存中;将远程调用请求加入链表T-link中,并将对象列表中的内容加入到相对于第一缓存更大的第二缓存中;更新cur_lsn的值为待办理业务标识;
B3、主机节点将T-link中的远程调用请求以异步的方式广播到集群中的所有备机节点;
B4、当第二缓存中的元数据的量超过第二阈值或者经过预定时间后,将第二缓存中的所有待更新元数据以及cur_lsn刷新到本地磁盘。
较佳地,步骤B3进一步包括:主机节点将远程调用请求以异步方式保存到本地日志文件中。
较佳地,步骤B4之后进一步包括:
B5、备机节点接收到主机节点广播过来的远程调用请求;
B6、备机节点对所述远程调用请求进行处理,将处理后生成的需要更新的元数据将保存在第三缓存中;将需要更新的元数据包装成一个个的对象,形成对象列表,将形成的对象列表放入一个待办理业务中,生成一个远程调用请求也放入所述待办理业务中,并给所述待办理业务分配一个顺序增长的待办理业务标识;
B7、当第三缓存中的元数据的量超过第三阈值或者经过预定时间后,触发备机节点处理待办理业务:将对象列表中的内容加入到相对于第三缓存更大的第四缓存中;
B8、当第四缓存中的元数据的量超过第四阈值或者经过预定时间后,将第四缓存中的所有待更新元数据以及cur_lsn刷新到本地磁盘。
较佳地,步骤B4进一步包括:备机节点将远程调用请求以异步方式写入到本地日志文件中。
较佳地,所述备机节点将远程调用请求以异步方式写入到本地日志文件中包括:备机节点检查待办理业务标识是否为备机节点下的cur_lsn+1,如果是,备机节点将远程调用请求以异步方式写入到本地日志文件中,否则备机节点报错。
较佳地,所述步骤A中,将cur_lsn的值最大的元数据服务节点作为主机节点,其他的元数据服务节点作为备机节点。
较佳地,步骤A进一步包括:每一个元数据服务节点分配判断本地日志文件中是否存在大于本地cur_lsn的远程调用请求标识,若是,将本地日志文件中的所有远程调用请求标识大于cur_lsn的远程调用请求在本机重做一次数据同步操作。
较佳地,该方法进一步包括:主机节点发现任一个备机节点的cur_lsn比自己的最大远程调用请求标识小,进行如下操作:将所述备机节点从异步广播队列中剔除,添加到同步队列中;通过专门的同步线程,将大于备机节点的cur_lsn的所有请求同步到备机节点;
较佳地,该方法进一步包括:如果主机节点发现本地日志文件中最小的序列号大于备机节点的cur_lsn+1,那么报错,将备机节点中的本地日志文件截断至主机节点的序列号的地方,并使该备机节点退出该服务进程。
从以上技术方案可以看出,主机节点提供元数据更新服务,并将更新后的元数据同步到备机节点。当主机节点发生故障时,从备机节点中选举出一台作为新的主机节点。本申请还提供了数据同步异常的处理方法。通过多节点热备,可以有效防止元数据服务节点的单点故障,从而提高整个系统的数据安全性。
具体实施方式
本申请技术方案的设计思想是:在云存储系统中设置至少3台元数据服务节点,从中选出一台作为主机节点(命名为master节点),其他的作为备机节点(命名为slave节点)。主机节点提供元数据更新服务,例如创建文件夹,删除文件夹,修改文件夹名字,创建文件,修改文件,修改文件等服务(读取文件夹属性,读取文件属性等操作不涉及数据更新)。多节点热备就是将更新后的元数据同步到备机节点。当主机节点发生故障时,从备机节点中选举出一台作为新的主机节点。
为使本申请技术方案的技术原理、特点以及技术效果更加清楚,以下结合具体实施例对本申请技术方案进行详细阐述。
云存储系统是实时系统,针对单一元数据服务节点而言,数据访问频率非常高,因此对于正在运行中的元数据服务节点,接收到请求,正确处理完毕后,将需要更新的元数据保存在第一缓存中。待第一缓存中数据达到第一阈值或者经过一段时间后,第一缓存中的数据才会刷新到本地硬盘。
元数据服务端接收到一个数据更新请求(request),主机节点正确处理该数据更新请求后,将脏数据(需要更新的元数据)包装成一个个的对象(object),形成对象列表(object_list),放入一个待办理业务中。对于接收到的request,结合一个顺序增长的待办理业务标识序列号(lsn),组成一个远程调用请求(rpc_request)(rpc_request中除了包含request所有的信息,还包括一些必要附加信息,如分配给文件的存储位置信息等,这些信息在主机节点确定后,只需要同步到备机节点就可以了。)也放在transaction中。待第一缓存中数据达到一定数量或者经过一段时间后,元数据服务节点触发处理当前待办理业务,在处理transaction时,一方面将rpc_request加入链表T-link中,另一方面将object_list中的内容加入到相对于第一缓存更大的第二缓存中。更新cur_lsn的值为该请求的序列号。其中,cur_lsn表示最后一次已经写入磁盘(或数据库)的lsn。
在另一个线程中,主机节点将T-link中的rpc_request以异步的方式广播到集群中的所有备机节点。然后将rpc_request以异步方式保存到本地日志文件(log)中(对于传统机械式硬盘,日志文件在初始化时直接设置为8的倍数大小,以得到一个在磁盘中物理位置连续的文件。读写时采用顺序性,这样提升访问磁盘的效率.然而对于新式的固态硬盘(SSD)硬盘,则不用这一步。一个文件大约8M大小的样子,写完一个文件后继续生成一个新的文件)。等到一定时间(这里指的是第二缓存中有脏数据的情况下)或者第二缓存中的脏数据达到第二阈值,将触发脏数据的刷新操作:将第二缓存中的所有脏数据刷新到本地磁盘(元数据存储可以以二进制文件的形式存放,也可以以数据库存放),同时需要刷新到本地磁盘的还有cur_lsn。
对于备机节点而言,接收到主机节点广播过来的rpc_request请求,首先将rpc_request以异步方式写入到本地日志文件中(写入的时候需要检查lsn_id是否刚好是备机节点下的cur_lsn+1(备机节点的cur_lsn表示上一次数据同步的业务标识),如果是,写入,如果不是将报错)。然后对rpc_request请求处理。处理后生成的脏数据同样包装成一个个的object,形成object_list。包装成transaction。同时还包含在transaction中的还有rpc_request。在备机节点处理transaction时,object_list中的object加入到更大的缓存cache。当cache中的脏数据达到一定数量或者经过一段时间后(这里指的在cache中有脏数据的情况下),将cache中的脏数据全部flush到本地磁盘。同时flush到本地磁盘的还有cur_lsn。
针对多个元数据服务节点,系统启动后第一件事就是多台元数据服务节点中选出主机节点和备机节点。主机节点和备机节点的选举过程不是本申请的重点,可以采用现有技术中任意一种从多台可互换节点中选举主机节点的方法。例如,可以参考cur_lsn的值,将cur_lsn的值最大的元数据服务节点作为主机节点,其他的作为备机节点。本申请实施例中,选出一台主机节点(命名为master节点),其他的为备机节点(命名为slave节点)。待主机节点和备机节点身份决定后,考虑可能会因为rpc_request和脏数据同步时机不一致而导致本地log和元数据不一致。因此,必须根据元数据中的cur_lsn和本地log的rpc_request中的序列号比较。将本地log中所有序列号大于cur_lsn的rpc_request在本机重做一次。待集群中所有的节点都做完这个操作后,系统开始正常工作。
如果主机节点发现(例如,主机节点可以通过发送请求到备机询问备机cur_lsn是多少)备机节点的cur_lsn比自己的最大序列号小,表明该备机节点的数据不同步,应当进行同步处理。这时将备机节点从异步广播队列中剔除,添加到同步队列中。通过专门的同步线程,将大于备机节点的cur_lsn的所有rpc_request同步到备机节点。如果发现本地log中最小的序列号大于备机节点的cur_lsn+1,那么报错,这个时候需要将备机节点中的本地log截断至主机节点的序列号的地方,退出该服务进程并由其他的进程再将元数据服务拉起来。
如果本地log文件太多(超过1000个),需要删除旧的本地log。
本申请实施例提供的一种云存储服务中元数据服务节点的多节点热备方法流程如图1所示,包括如下步骤:
步骤101:在云存储系统中设置至少3台元数据服务节点,从中选出一台作为主机节点,其他的作为备机节点;
步骤102:主机节点提供元数据更新服务,并将更新后的元数据同步到备机节点;
步骤103:当主机节点发生故障时,从备机节点中选举出一台作为新的主机节点。
根据本申请的另一实施例,步骤102的具体执行过程如图2所示,包括如下步骤:
步骤102-1:主机节点正确处理该数据更新请求后,将需要更新的元数据保存在第一缓存中;将需要更新的元数据包装成一个个的对象,形成对象列表;将形成的对象列表放入一个待办理业务中,生成一个远程调用请求也放入所述待办理业务中,并给所述待办理业务分配一个顺序增长的待办理业务标识。
所述远程调用请求中除了包含数据更新请求的所有信息,还包括分配给文件的存储位置信息。
步骤102-2:当第一缓存中的元数据的量超过第一阈值或者经过预定时间后,触发主机节点处理待办理业务:将对象列表中的内容加入到相对于第一缓存更大的第二缓存中;将远程调用请求加入链表T-link中,并将对象列表中的内容加入到相对于第一缓存更大的第二缓存中;更新cur_lsn的值为待办理业务标识;
步骤102-3:主机节点将T-link中的远程调用请求以异步的方式广播到集群中的所有备机节点;
步骤102-4:当第二缓存中的元数据的量超过第二阈值或者经过预定时间后,将第二缓存中的所有待更新元数据以及cur_lsn刷新到本地磁盘。
根据本申请的另一实施例,步骤102-3进一步包括:主机节点将远程调用请求以异步方式保存到本地日志文件中。
根据本申请的另一实施例,步骤102-4之后进一步包括:
步骤102-5:备机节点接收到主机节点广播过来的远程调用请求;
步骤102-6:备机节点对所述远程调用请求进行处理,将处理后生成的需要更新的元数据将保存在第三缓存中;将需要更新的元数据包装成一个个的对象,形成对象列表,将形成的对象列表放入一个待办理业务中,生成一个远程调用请求也放入所述待办理业务中,并给所述待办理业务分配一个顺序增长的待办理业务标识;
步骤102-7:当第三缓存中的元数据的量超过第三阈值或者经过预定时间后,触发备机节点处理待办理业务:将对象列表中的内容加入到相对于第三缓存更大的第四缓存中;
步骤102-8:当第四缓存中的元数据的量超过第四阈值或者经过预定时间后,将第四缓存中的所有待更新元数据以及cur_lsn刷新到本地磁盘。
根据本申请的另一实施例,步骤102-4进一步包括:备机节点将远程调用请求以异步方式写入到本地日志文件中。
根据本申请的另一实施例,所述备机节点将远程调用请求以异步方式写入到本地日志文件中包括:备机节点检查待办理业务标识是否为备机节点下的cur_lsn+1,如果是,备机节点将远程调用请求以异步方式写入到本地日志文件中,否则备机节点报错。
根据本申请的另一实施例,所述步骤101中,将cur_lsn的值最大的元数据服务节点作为主机节点,其他的元数据服务节点作为备机节点。
根据本申请的另一实施例,步骤101进一步包括:每一个元数据服务节点分配判断本地日志文件中是否存在大于本地cur_lsn的远程调用请求标识,若是,将本地日志文件中的所有远程调用请求标识大于cur_lsn的远程调用请求在本机重做一次数据同步操作。
根据本申请的另一实施例,该方法进一步包括:主机节点发现任一个备机节点的cur_lsn比自己的最大远程调用请求标识小,进行如下操作:将所述备机节点从异步广播队列中剔除,添加到同步队列中;通过专门的同步线程,将大于备机节点的cur_lsn的所有rpc_request同步到备机节点;
根据本申请的另一实施例,该方法进一步包括:如果主机节点发现本地日志文件中最小的序列号大于备机节点的cur_lsn+1,那么报错,将备机节点中的本地日志文件截断至主机节点的序列号的地方,并使该备机节点退出该服务进程。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请的保护范围,凡在本申请技术方案的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。