一种解决GlusterFSIO阻塞造成文件系统挂起的方法及系统技术方案

技术编号:33527050 阅读:12 留言:0更新日期:2022-05-19 01:50
本发明专利技术公开了一种解决GlusterFS IO阻塞造成文件系统挂起的方法及系统,本发明专利技术解决GlusterFS IO阻塞造成文件系统挂起的方法包括在服务端副本服务进程glusterfsd定时根据链表TL和链表KL检测并修复发生IO阻塞的线程;判断发生IO阻塞且无法修复的线程与总线程数的占比超过设定阈值是否成立,若不成立,则本轮处理结束;否则,杀死服务端副本服务进程glusterfsd的服务,并向客户端发送指定的断开连接事件。本发明专利技术能够在GlusterFS发生单点故障时及时将单点故障修复或者将故障副本服务与集群脱离,保障整个分布式存储集群的不受影响。响。响。

【技术实现步骤摘要】
一种解决GlusterFS IO阻塞造成文件系统挂起的方法及系统


[0001]本专利技术涉及分布式存储技术,具体涉及一种解决GlusterFS IO阻塞造成文件系统挂起的方法及系统。

技术介绍

[0002]分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。常见的分布式文件系统有GlusterFS、Ceph、FastDFS、Lustre等,它们均各有所长,其中Glusterfs是一款开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过Infiniband RDMA或Tcp/Ip方式将许多主机,通过网络互联成一个并行的网络文件系统,具有可扩展性、高性能、高可用性等特点。本文将基于GlusterFS介绍一种解决该分布式存储系统的单点IO阻塞造成集群文件系统挂载的方法。
[0003]GlusterFS分布式存储系统通常使用多台服务器共同存储数据,多副本冗余,为保障数据的一致性以及安全性,当同组冗余副本(冗余副本分布在不同主机上)在线的情况下,存储在该组副本中的文件每个写请求均必须等待同组副本写完成,方可返回,如一方挂起或长时间阻塞均会对该文件的访问造成严重影响。当阻塞的请求对应的文件类型为文件夹时,会造成整个文件夹中的文件无法访问,更严重的是,当恰好阻塞的IO为

/

文件夹,则整个分布式存储文件系统均会挂起,无法访问。由于计算机的复杂性,在GlusterFS作为一款应用层文件系统高度依赖操作系统的基础文件系统、计算机存储介质、计算机其它硬件模块的稳定性,而这些被依赖的对象并不受GlusterFS控制,当他们发生异常时,造成部分IO请求阻塞,此时GlusterFS文件系统无法及时发现与处理,就会对整个分布式存储集群造成严重影响,虽然现有GlusterFS存在一些检测机制,但能力偏弱,根据我们实际使用上的经验发现很多场景下无法满足,无法及时检测出故障并处理。通常情况下,当分布式存储集群中某台主机的操作系统发生了IO请求挂起时,在GlusterFS中体现在服务端副本服务进程glusterfsd的io

threads xlator的fop(即文件操作)处理线程(简称fop

threads)阻塞,这种阻塞又分两种情况:部分线程阻塞、全部线程阻塞,两种情况对分布式存储造成的影响稍有不同。部分线程阻塞:操作系统仅部分IO挂起,绝大部分IO可继续访问,如果挂起的部分IO为普通文件的IO请求,则对整个分布式存储集群受到影响体现在两个方面:(a)由于IO处理线程总数是一定的,存在部分IO处理线程阻塞后,当分布式存储IO请求负载很高的时候,会导致整体性能的下降、(b)挂起IO对应的文件无法正常访问。如果挂起的IO为文件夹请求,则会导致该文件夹下的所有子文件均无法访问,严重时甚至造成整个分布式文件系统的访问阻塞,如

/

IO挂起。全部线程阻塞:当服务端副本服务进程glusterfsd进程的io

threads xlator的文件操作处理线程全部在操作系统处理阶段挂起,即会导致io

threads xlator的所有文件操作处理线程全部阻塞,随而导致整个分布式文件系统无法访问。因此,分布式存储集群中单点IO故障对整个分布式存储集群会带来严重影响,大规模部署时,随着集群主机的数量增加,分布式存储集群发生单点硬件故障的概率也成倍增加,因此,当发生单点故障导致IO挂起时,如何快速检测与恢复单点IO故障对集群的影响,是需要亟待解决的关键问题。
[0004]参见图1,服务端副本服务进程glusterfsd进程的io

threads xlator中定义了4种优先级的文件操作请求FOP队列(简称fop

queue),所有glusterfsd下发的文件操作请求fop均会根据其优先级分发到对应的fop

queue中,4种优先级队列分别为HI、Normal、Low、Least,每个优先级fop

queue队列限制了最大可同时处理该优先级的fop请求数量,默认为12,支持单独可调整每个优先级的并发数量。io

threads xlator为增加文件操作请求fop的并发处理,定义了同时默认最大12个并发线程(FOP threads≤12),这些线程会从各优先级fop

queue中读取fop请求来执行处理,优先原则是:只要优先级更高的fop

queue不为空,则优先从更高优先级的fop

queue中取fop请求。

技术实现思路

[0005]本专利技术要解决的技术问题:针对现有技术的上述问题,提供一种解决GlusterFS IO阻塞造成文件系统挂起的方法及系统,本专利技术旨在弥补GlusterFS现有IO挂载检测与修复能力不足的问题,能够在GlusterFS发生单点故障时及时将单点故障修复或者将故障副本服务与集群脱离,保障整个分布式存储集群的不受影响。
[0006]为了解决上述技术问题,本专利技术采用的技术方案为:
[0007]一种解决GlusterFS IO阻塞造成文件系统挂起的方法,包括:
[0008]1)通过服务端副本服务进程glusterfsd定时检测并修复发生IO阻塞的线程;
[0009]2)判断发生IO阻塞且无法修复的线程与总线程数的占比超过设定阈值是否成立,若不成立,则本轮处理结束,等待指定的间隔时间后跳转执行步骤1);否则,杀死服务端副本服务进程glusterfsd的服务,结束并退出。
[0010]可选地,步骤1)中检测并修复发生IO阻塞的线程时,包括根据链表TL和链表KL来检测并修复发生IO阻塞的线程,所述链表TL由线程结构体对象iot_thread_ctx作为成员Tx以链表方式串联组成,所述线程结构体对象iot_thread_ctx用于存储IO处理线程的状态以及上下文;所述链表KL由文件信息结构体对象iot_killed作为成员Kx以链表方式串联组成,所述文件信息结构体对象iot_killed用于记录因文件操作处理线程fop

threads的发生超过规定的阻塞时间而被曾经杀死的线程对应的文件信息。
[0011]可选地,所述线程结构体对象iot_thread_ctx包括:
[0012]循环链表头list_head list,用于串联所有线程的线程结构体对象iot_thread_ctx;
[0013]线程ID id,用于跟踪对应线程,以及根据需要杀死线程;
...

【技术保护点】

【技术特征摘要】
1.一种解决GlusterFS IO阻塞造成文件系统挂起的方法,其特征在于,包括:1)通过服务端副本服务进程glusterfsd定时检测并修复发生IO阻塞的线程;2)判断发生IO阻塞且无法修复的线程与总线程数的占比超过设定阈值是否成立,若不成立,则本轮处理结束,等待指定的间隔时间后跳转执行步骤1);否则,杀死服务端副本服务进程glusterfsd的服务,结束并退出。2.根据权利要求1所述的解决GlusterFS IO阻塞造成文件系统挂起的方法,其特征在于,步骤1)中检测并修复发生IO阻塞的线程时,包括根据链表TL和链表KL来检测并修复发生IO阻塞的线程,所述链表TL由线程结构体对象iot_thread_ctx作为成员Tx以链表方式串联组成,所述线程结构体对象iot_thread_ctx用于存储IO处理线程的状态以及上下文;所述链表KL由文件信息结构体对象iot_killed作为成员Kx以链表方式串联组成,所述文件信息结构体对象iot_killed用于记录因文件操作处理线程fop

threads的发生超过规定的阻塞时间而被曾经杀死的线程对应的文件信息。3.根据权利要求2所述的解决GlusterFS IO阻塞造成文件系统挂起的方法,其特征在于,所述线程结构体对象iot_thread_ctx包括:循环链表头list_head list,用于串联所有线程的线程结构体对象iot_thread_ctx;线程ID id,用于跟踪对应线程,以及根据需要杀死线程;线程处理文件操作请求编号gen,用于统计当前线程所处理的文件操作请求顺序编号,文件操作处理线程每从文件操作请求队列fop

queue取一个文件操作请求处理,则该线程的对应的文件操作请求编号gen加1;原文件操作请求编号oldgen,用于记录上一次线程处理文件操作请求gen的数值,通过比对文件操作请求编号gen与原文件操作请求编号oldgen值以判断线程是否发生阻塞;状态status,用于保存当前线程状态,0代表睡眠状态,线程在空闲时会进入到自主睡眠状态,自主睡眠状态下忽略文件操作请求编号gen与原文件操作请求编号oldgen的比对结果;阻塞状态blocking_statistics,当文件操作请求编号gen与原文件操作请求编号oldgen相等、且状态status的值为1成立时,判定该线程当前处阻塞状态,阻塞状态blocking_statistics的值自增1;当线程结束阻塞状态时,阻塞状态blocking_statistics清零;上下文*stub,用于保存对应线程正在处理的文件操作请求的上下文,用于对应文件操作请求处理线程发生超过规定的阻塞时间时,返回文件操作请求失败给上层调用。4.根据权利要求3所述的解决GlusterFS IO阻塞造成文件系统挂起的方法,其特征在于,所述文件信息结构体对象iot_killed包括:循环链表头list_head list,用于串联所有在规定的一段时间内发生过因IO阻塞而被强制杀死并返回的文件操作请求错误对应的文件信息;文件标记gfid,用于记录对应文件的标记gfid,标记gfid为GlusterFS文件系统对文件的标记,文件标记gfid用于文件匹配;路径*path,用于记录对应文件的具体路径,用于文件匹配。5.根据权利要求4所述的解决GlusterFS IO阻塞造成文件系统挂起的方法,其特征在于,所述根据链表TL和链表KL来检测并修复发生IO阻塞的线程包括:
1.1)重置用于统计本轮检测阻塞线程数量的全局统计变量BTC以及全局分优先级统计数组变量blocked[PR],其中PR代表各个优先级;1.2)检测链表KL的周期是否超期,若链表KL的周期超期,则清空链表KL中所有的成员Kx;跳转下一步;1.3)尝...

【专利技术属性】
技术研发人员:周继峰孙利杰陈松政刘文清杨涛
申请(专利权)人:湖南麒麟信安科技股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1