石蕊,崔圣青
(1.北京浩瀚深度信息技术股份有限公司,北京 100142;2. 中国铁路济南局集团有限公司 济南通信段,山东 济南 250000)
在铁路大数据时代,随着摄像机部署数量和视频图像质量的不断提高,以及反恐防控对铁路视频数据存储时间延长到90 d的要求,使视频存储数据量激增。这些不断增长的数据有90%以上都是不常访问的数据,称之为冷数据,如果采用磁带库或蓝光光盘的离线方案进行存储,数据回放的响应时间较长,不适用于铁路视频监控的应用场景。如果采用传统的在线存储系统,将在能源消耗、硬件购置成本及空间利用率等方面面临很大挑战。冷存储同上述方案相比,具有显著优势,其低功耗及近似在线存储的性能,可同时解决上述2种方案面临的难题,大幅度降低总体拥有成本(TCO)。在实际应用中,不论是既有存储扩容还是新建存储系统,冷存储均可以通过文件系统接口和监控平台进行无缝对接,以最优的方式延长数据存储时间。
通常将数据按照访问频率分为“冷”“温”“热”三大类,在铁路综合视频监控系统(简称视频监控系统)中,1周、1个月及1个季度以上的一些数据访问次数较少,都属于冷数据,具体时间界限可根据实际使用情况和投资量来定。
视频监控系统由视频节点(包括视频核心节点、视频区域节点、Ⅰ类视频接入节点、Ⅱ类视频接入节点)、视频汇集点、视频采集点、承载网络和视频终端(包括视频管理终端、监视终端)组成(见图1)。视频监控系统接口包括 A、B、C、D、E、F、H、Na接口,其中A、B、H是视频监控系统外部接口,C、D、E、F是视频监控系统内部接口,Na是设备管理接口。冷储存作为Ⅰ类视频接入节点和Ⅱ类视频接入节点存储区的扩展,采用用户空间文件系统(FUSE)/SMB接口接入到应用服务区中,与Q/CR 575—2017规范中接口要求相比,将原Ⅰ类视频接入节点和Ⅱ类视频接入节点E调整为E+FUSE/SMB[1-2]。
对于冷存储技术,采用何种接口方式最大程度地简化用户操作,是解决问题的关键。目前的冷存储系统,例如谷歌、微软等云存储采用对象存储,这种存储以数据对象为最小存储单元,虽然其IO性能好,协议开销小,但需要特定的应用程序编程接口(API)进行访问,不便于用户使用。而冷存储采用的文件系统接口可使用户方便地在该文件系统内进行各种文件操作,不需要复杂的编程开发。
冷存储最显著的特点就是存储量大,可以支持水平扩展,因此必然是由多台机器组成的分布式系统,而不可能是1台单独的机器。当服务器端是多台机器时,客户端在连接服务器时就需要进行选择,在此采用一致性哈希算法来解决。当客户端成功连接服务器可以对上层提供存储服务后,上层软件如何方便地使用冷存储提供的存储空间,则需要采用FUSE文件系统接口方案。
在传统的存储系统中,全部数据被集中存储在单独的存储服务器,其最大的问题就是不容易扩展。当存储空间需要增加时,需购买另外一台更高容量的存储设备替换之前的设备,造成很大的浪费和运维开销。
冷存储的特点之一就是针对大容量存储而设计,不依赖于单机设备容量,而是由多个独立的设备组成一个存储集群,形成分布式存储系统。这样的分布式系统可支持水平扩展,随时添加新的节点就能增加系统容量。而且多个设备之间可以进行负载均衡,每台设备可达到的性能固然是有上限的,但多台设备通过负载均衡就可在整体上达到更高的性能。多个设备组成的系统能有效地防止单台设备崩溃造成的损失,使系统可靠性更高[3-4]。
图1 视频监控系统组成及其逻辑接口
图2 冷存储分布式系统结构
冷存储分布式系统结构见图2,右侧是前置节点组成的服务器集群,左侧是存储节点组成的存储集群,用户的请求首先到达前置节点,然后通过前置节点把用户数据分片,发送到左侧存储集群中不同节点中的多个硬盘进行数据存储。双集群结构是为了在前置服务器集群中进行数据分片计算纠删码等对性能要求比较高的操作,而在后端存储节点仅进行数据读写等基本操作,因此可以大规模扩展后端存储集群,支持更大的容量,而无需配置很多计算资源,从而达到最佳的性价比。这是在分布式存储系统中一种针对冷数据场景的独特优化方案,其他分布式存储系统都是一个集群,每个独立设备的性能要求都比较高,这样虽然可以达到更高的性能,但成本也很高,并不适合大规模冷数据低成本存储的要求。
在此研究的分布式存储系统具有多个前置节点(见图2右框部分),每个节点均可处理用户的操作,为了实现负载均衡和失效备援,需要有一种机制来选择正常的节点进行操作,这种机制还能够处理节点失效、节点添加等问题,以保证整体服务正常运行。
通常方案采用集中式的信息共享方式,即采用单机服务器来保存集群中的节点状态,例如集群中有多少台设备是正常可用的,每台设备的负载情况如何等。客户端首先向这台状态服务器发出申请,状态服务器根据自己掌握的信息分配1台具体的服务器给客户端,客户端再正式向这个分配的服务器发出业务请求。状态服务器集中分配的方式存在2个主要问题:一是形成了单点故障,如果这台状态服务器崩溃,则整个系统不可用;二是影响性能,每次客户端都需要建立一个连接申请分配服务器,这个过程增加了时间消耗、降低了性能。
为解决集中式分配方案的问题,冷存储系统采用一致性哈希算法进行节点选择,同时解决节点增删带来的数据平衡问题,消除了单点故障,降低了客户端申请分配服务器的时间消耗。
2.2.1 哈希算法基本原理
一致性哈希(Hash)用一个圆环来划分整个哈希值空间。假设存在一个值域为0~232-1的哈希函数(见图3)。哈希值空间按顺时针排序,0和232-1在同一点重合。随后对各个需要加入集群的服务器使用哈希函数进行映射,可以通过服务器之间不同的标识作为哈希函数的输入(如IP或主机名),然后进行映射,每台服务器都能确定自己的位置且互不重合,假设存在4台服务器,进行映射后的位置关系见图4。
对数据和服务器进行算法设计,使两者之间有良好的容错性和可扩展性。对数据进行哈希函数的映射,计算出该数据对应哈希值在环上的位置,从该位置顺时针遍历,遇到的第1台服务器就是该数据需要连接的服务器。
图3 哈希值空间示意图
图4 服务器在哈希值空间上的映射位置
例如,存在Object A、Object B、Object C、Object D 4个数据对象,经过上述算法后,数据和服务器对应关系见图5。由一致性哈希算法,数据A、B、C、D分别被对应到Node A、Node B、Node C、Node D上。
2.2.2 哈希算法容错性分析
图5 数据和服务器对应关系
假设Node D由于某种原因离开了集群,按照一致性哈希算法,数据A、B、C依然会找到原来的服务器,而数据D会重新在哈希环上进行寻找,最终会找到Node A。因此,1台服务器的崩溃仅对此服务器到其环空间中前1台服务器的数据产生影响,不会对其他数据产生影响。如果在存储时把Object A在Node D和A上都保存一份,则在Node D被从哈希环上移除时,会由Node A上找到Object A,因此数据的可靠性得以大大提高。
如果在系统中增加1台服务器Node X(见图6),此时数据A、B、D对应的服务器不会变化,只有数据C会重新寻找,最终找到Node X。因此,1台服务器的添加仅对此服务器到其环空间中前1台服务器的数据产生影响,不会对其他数据产生影响。系统只需要把Object C拷贝一份放到Node X上,就完成了数据的重新分布。
图6 添加服务器映射关系
在节点删除和添加后,需要按照新的哈希环来对数据进行重新分布,称为数据再平衡。从以上例子可知,使用一致性哈希算法,可以保证只有一小部分数据在节点的删除或添加后受到影响,需要拷贝迁移的数据也会尽量少。因此采用一致性哈希算法,客户端选择节点更简单,数据再平衡的速度也更快,系统的容错性和可扩展性都能得到保证[5-7]。
文件系统是用来存储计算机文件、目录及其包含数据的方法,它使文件目录和数据的搜索和访问得以简化。通用操作系统的重要组成部分就是文件系统。传统上,操作系统在内核级别支持文件系统,FUSE则是实现在用户态的文件系统框架。
例如,FUSE内核模块的位置和Linux自带的其他文件系统xfs、ext4等是在一个层次,但后续操作发生不同,xfs等文件系统还会持续在内核态进行操作直到硬盘,而FUSE则结束内核态,转而进入用户态(见图7)。具体到冷存储的客户端开发,则都是与服务器端的网络操作。
图7 FUSE在Linux系统中的位置
将连接分布式集群的客户端代码写在内核态还是用户态,会带来一系列的区别。首先,内核态的开发和调试都比较困难,在内核态出现的问题造成的影响也较大,经常造成死机等后果。其次,内核的版本繁多,如果每个内核版本都要编写对应的存储客户端代码也是一个繁复的任务,且容易出错。考虑到冷存储的应用场景,采用FUSE做用户态的存储客户端开发,避开了高风险的内核开发和繁杂的版本支持,以简单的方式快速实现,并具有较高的通用性[8-11]。
分布式集群、一致性哈希及FUSE文件系统必须协同工作,冷存储系统接口工作流程见图8。
视频监控程序运行在一台服务器上,该服务器相对于冷存储集群来说就是存储的客户端,冷存储集群是服务端,之间通过网络连接。视频监控程序会对多个视频文件进行读写,这些文件逻辑上是在视频监控的服务器上(通过FUSE接口提供的文件系统),但实际上是存储在冷存储集群上(通过一致性哈希选择服务器,并传输给服务器端进行实际存储),文件的写入过程如下:
(1)视频监控程序打开一个文件,写入一些数据,该请求被操作系统发送给FUSE内核模块。
(2)FUSE内核模块将写请求转给FUSE用户态程序,在此就是冷存储集群的客户端程序。
(3)FUSE用户态程序中采用一致性哈希算法,用文件的全路径作为哈希的参数,计算出1个哈希值,在哈希环上选择1台服务器进行连接。不同的文件会计算出不同的哈希值,也就会选择不同的服务器去连接,即可实现负载均衡。
图8 冷存储系统接口工作流程
(4)数据通过网络被发送到冷存储集群的前置机上,开始在后端进行实际的存储,然后返回结果给客户端。
(5)FUSE用户态程序收到返回后,发给FUSE内核模块。
(6)FUSE内核模块收到返回后,发给上层调用的视频监控程序。视频监控程序即可得知刚才的数据写入是否成功,然后进行相应后续工作。
首先需要对FUSE文件系统和一致性哈希的基本功能进行测试,然后测试某款视频监控软件是否可以平滑迁移到该接口上,最后针对Windows客户端进行测试。
测试方案见图9。
(1)测试目标:冷存储的文件系统与普通的文件系统是否相符,是否可通过一致性哈希达到失效备援。
(2)测试流程:①下载配置文件。在装好FUSE的Linux服务器上,下载存储系统提供的FUSE配置文件;②挂载。运行挂载命令,挂载后可以看到系统分区多了1个FUSE分区,该命令将存储系统挂载到相应的目录上,挂载后可以看到文件系统多了1个设定的分区,接下来用户即可在该目录进行正常的文件操作;③执行文件系统操作;④一致性哈希支持的失效备援。通过关闭其中1个计算节点,查看刚才的文件内容,向文件追加新内容,启动此前被关闭的节点,再次查看文件内容是否有更新。
图9 测试方案示意图
(3)测试结果:每个命令后经过查看,文件内容均为预期输出。
(4)测试结论:冷存储的文件系统与普通的文件系统操作相符,可以通过一致性哈希达到失效备援。
(1)测试目标:冷存储系统与铁路局集团公司现有视频监控系统进行对接,视频监控软件可以平滑切换到冷存储系统上,视频的录制和回放正常。
(2)测试流程:①修改视频服务的配置文件, 更改存储的路径配置,使其指向冷存储FUSE客户端的挂载点;②启动视频监控服务,视频服务识别到FUSE文件系统后,从视频服务的日志中可以看到,之后的分区即为挂载后产生的新分区;③检查视频录制,确认所有摄像头均正常写入;④检查视频回放,通过视频软件可以看到摄像头的回放视频(见图10)。当视频回放出现“加载中”的情况时,说明其读取到已经冷藏的数据,此时后台先点亮硬盘,然后从数据库中读取文件的信息并从硬盘中进行读取,最后将读取完成的文件返回给视频回放程序(见图11)。
(3)测试结果:按照测试流程进行操作,可以看到正常的视频录制和回放。
(4)测试结论:在此研究的存储系统提供FUSE文件系统接口,为目前大部分第三方服务提供了极大方便,一般无需修改其程序,即可方便快速地与存储系统完成对接。
(1)测试目标:冷存储系统的客户端主要应用于Linux系统上,为了使Windows用户也可使用存储系统,其FUSE文件系统还可通过Samba服务进行网络共享,将Linux的FUSE文件系统共享到Windows系统上。
图10 视频监控平台回放界面
图11 冷数据回放界面
(2)测试流程:①在Linux服务器进行FUSE挂载;②在Linux服务器进行Samba服务配置;③在Windows服务器进行远程登录,即可访问FUSE文件系统(见图12);④在Linux服务器的挂载目录可查看到相关信息。
图12 共享目录查看
(3)测试结果:冷存储系统的FUSE文件系统可以通过Samba共享给Windows使用。
(4)测试结论:冷存储的文件系统可通过Samba共享给Windows使用,提高了冷存储接口的适应性。
随着铁路大数据的高速发展,铁路综合视频监控系统数据存储成为新的热点,海量的视频数据如何存储才能降低存储成本和能源消耗、提升空间利用率,同时又能给用户带来便捷的操作体验是解决方案的关键。在此探讨的冷存储系统可满足上述需要,系统采用简单通用的FUSE文件系统,通过一致性哈希实现负载均衡和失效备援,在应用中效果良好。