本发明涉及一种实时数据存储方法和系统,特别是涉及一种基于分布式并行数据库的实时数据存储方法和系统。
背景技术:
随着网络技术迅速发展,各种应用于工业的实时数据系统(例如电厂实时监控系统、节能环保系统、煤炭石化等流程生产企业的自动化、信息化系统)产生的数据量呈指数级增长,现有的单机数据库无论从容量还是从处理能力来讲已不能完全适应当前需求。另外,这种应用于工业的实时数据系统除了要求数据容量大之外,还对系统的实时性和稳定性要求很高。目前业界用做实时数据存取的数据库基本仍使用单核心集中部署,这种系统存在着数据存储容量不大、处理能力不强的缺点,目前的分布式数据库系统又存在着实时性不好的缺点,难以应用到对实时性要求高的工业数据系统中去,如何设计一个既满足事务应用处理时效性又满足事务吞吐率的需求的分布式并行实时数据库是一个难点。
技术实现要素:
发明目的:本发明要解决的技术问题是提供一种基于分布式并行数据库的实时数据存储方法和系统,针对工业实时海量数据的特性,既解决了传统单核心数据库容量有限、处理能力弱的问题,又解决了现有分布式数据库系统实时性不强的问题,满足了工业实时海量数据处理中数据量大和实时性高的要求。
技术方案:
本发明提供一种基于分布式并行数据库的实时数据存储方法,系统中包括若干个管理节点、调度节点、数据节点和连接到调度节点上的应用终端与测点,系统中包含由管理节点依据输入参数确定的分布规则,所述的应用终端向调度节点发出数据写请求,调度节点收到数据写请求后根据分布规则和请求中包含的测点信息,将数据发送到相应的数据主节点,数据主节点在存储过程中将数据转发给对应的备份节点。
进一步的,所述的分布规则包括自定义的hash函数和分片映射表,分片映射表内包含数据分片号和数据节点id号,数据分片号由测点名和时间段通过所述hash函数运算得到,由此将测点的数据分布到具体数据节点上。
进一步的,所述的hash函数为:
slice_id=(w1×[hash_str(point_name)/b1]+w2×[day_time(time)/b2])%hash_bucket,
其中,slice_id为数据分片号,hash_str(point_name)为输入是测点名、输出是该字符串的hash函数,day_time(time)为输入是包含有年月日的日期、输出为整数的量化函数,b1和b2为正整数,用来控制测点或相邻时间段内的数据分散程度,[]为取整符号,系数w1和w2在0至1之间,且w1+w2=1,hash_bucket为hash桶,%为取模符号。
进一步的,还包括测点的写请求方法:调度节点收到测点写请求后,检测测点合法性和唯一性,如果检测通过则存储测点信息,并向其余所有调度节点同步测点信息,若低于1/2的调度节点同步失败,管理节点将失败的调度节点做异常标记,等待后续同步恢复,若超过1/2的调度节点同步失败,则撤销已成功调度节点的同步操作,若撤销失败,同样将撤销失败调度节点做异常标记,等待后续同步恢复。
进一步的,还包括数据的读请求方法:所述的应用终端向调度节点发出数据读请求,调度节点通过分布规则筛选数据节点,拆分并重新组织多个读取子请求并分配到多个数据节点,在多个数据节点并行读取数据,完成后将结果返回调度节点,调度节点待所有已分配的读取子请求返回结果后做聚集处理.将结果反馈到发出读请求的应用终端。
进一步的,所述的数据读请求中,调度节点通过判断数据主节点和备份节点的繁忙程度来选择读取节点,每个数据读请求只可能被发送到一个数据主节点或者备份节点,如果出现读取异常调度节点则向另一个节点读取数据。
进一步的,所述繁忙程度从数据节点的cpu平均使用率、平均网络使用率、当前磁盘使用率、当前内存占用率综合度量。
进一步的,还包括数据冗余备份的一致性处理方法,包括下列3个子方法:
(1)管理节点的数据一致性处理:采取corosync或zookeeper架构搭建管理节点;
(2)调度节点的数据一致性处理:将调度节点上的数据划分为区块,管理节点检查各调度节点上的区块和区块顺序是否一致,若不一致则标注异常,并对异常的调度节点进行同步恢复操作;
(3)数据节点的数据一致性处理:管理节点监控数据节点的状态,调度节点通过管理节点获取数据节点的状态,进行数据写入和读取,同时实时地将数据节点的异常状态反馈给管理节点,数据写入时调度节点将数据直接写入数据主节点,由主节点将数据向备份节点做自动转发同步;
上述3个子方法可以单独执行也可以同时执行。
进一步的,还包括数据异常处理方法,当检测到数据主节点发生异常后,采取以下步骤处理:
(1)管理节点检测到数据主节点发生异常后指派对应的备份节点升级为主节点;
(2)管理节点启动一致性检测,通过分析数据主节点和备份节点的数据分片版本号以及分片内文件组的版本号不一致的情况,确定需要同步的索引和数据文件块并进行数据同步,对不同版本号文件组直接做替换操作,数据同步过程中主节点进行数据写入操作,数据写入以日志方式记录,并在同步完成后解析日志和更新数据,解析过程中的数据修改仍然追加到日志末尾,直到所有日志解析完毕;
(3)消除异常后管理节点消除原发生异常的主节点的异常状态,并作为备份节点继续运行。
本发明还提供了一种基于分布式并行数据库实时数据存储方法的系统,管理节点用于存储节点元信息并确定分布规则;调度节点用于存储所有测点信息,定时向管理节点汇报当前活动状态并从管理节点同步所有数据节点状态,将数据发送到相应的数据节点;数据节点包括数据主节点和对应的备份节点,用于存储测点产生的数据。
有益效果:本发明与现有技术相比,针对工业实时数据处理将分布式数据系统和实时数据系统结合起来,既提高了的数据容量和处理能力,又有效提升了分布式架构下并行处理效率,达到了工业数据的实时性处理要求,还解决系统数据一致性、数据冗余备份、数据出错后快速恢复的能力,提高了数据的可靠性和系统的稳定性,可以较好地应用于大规模数据的实时处理中去。
附图说明
图1是本发明系统的部署架构图;
图2是依照分布规则的数据映射示意图;
图3是数据节点的存储结构图;
图4是数据写请求方法示意图;
图5是数据读请求方法示意图。
具体实施方式
如图1所示,在系统的部署架构中,管理节点是整个分布式并行实时库的管理者,主要存储系统元数据信息,包括数据分布方式、各节点状态、主备节点一致性状态等关键信息。调度节点属于分布式访问层,统一的访问接口使得应用能够将分布式并行实时库视为一个完整的逻辑整体进行访问,同时调度节点也属于分布式定位层,是数据的分布和收集者,主要负责数据的分发,查询结果的收集汇总以及任务调度。调度节点存储包含了所有测点信息的测点信息表,如表1所示,测点信息表以测点名为关键字,一条记录包含一个测点的配置信息,如测点描述、压缩算法等。用户可从此测点信息库中查询测点的基本信息。数据节点属于分布式存储层,每一个数据节点运行和管理一个数据库实例,数据节点负责整个数据库系统数据的实际存储,接收来自调度节点的数据,执行经分解的查询任务,执行结果通过调度节点返回给应用程序。所述的数据节点和调度节点定时向管理节点汇报当前活动状态以及繁忙程度,调度节点定时从管理节点同步所有数据节点状态系统。所有数据节点都存储一张包含测点名、数据时间和数据的值数据表,如表2所示,值数据表包含了实时值缓存和历史数据存储,每条记录反映了某测点产生的实时数据的时间戳、数值、质量等信息。用户可从值数据表中查询实时数据值,存储实时数据最主要的两个维度即测点和数据时间。数据节点的数量仅受限于以太网带宽、机房物理条件等硬性条件。各数据节点只存储属于相应分区的数据,逻辑上是对等的。数据主节点和备份节点实现数据在节点间的冗余互备。
表1测点信息表
表2值数据表
建立系统唯一的数据分布规则,分布规则既要考虑到测点数据的关联性,又要考虑分布式架构并行处理带来的效率提升,即考虑将连续的一批测点,一个时间段的数据分布在同一个数据节点中以便于使用和管理,提升系统效率。通过自定义的hash函数实现,hash函数使用如下格式:
slice_id=(w1[hash_str(point_name)/b1]+w2[day_time(time)/b2])%hash_bucket,
其中slice_id为最后函数确定分配的分片号,通过函数前部计算结果对一个设定的hash_bucket取模获得,hash_str(point_name)和day_time(time)分别是对测点名和时间段的一个量化函数,量化函数根据实际数据特征或需求自行设计,例如hash_str(point_name)可以直接使用常用的字符串hash函数,day_time(time)可以设计为日期年月日等整数的组合,例如day_time(2018-08-05)=20180805,b1和b2为正整数值,[]为取整符号,即对day_time(time)/b2和hash_str(point_name)/b1的结果取整,考虑到测点或时间区域内数据的关联性,设计b1和b2控制测点或某相邻时间段内的数据分散程度,例如设置b2=7,则某一个测点(点名为point_name),连续7天数据(时间为time)最后会被分配到相同的分片中,因为point_name不变,则w1×[hash_str(point_name)/b1]不变,time时间在7天范围内,在[day_time(time)/b2]作用后的值也相同,则最后整个hash函数运算后结果也相同。w1和w2为系数,或者称之为未标准化权重,例如极端情况下设置w2为0,则表示完全按照测点来分布数据,每个测点的所有时间的数据都存放在同一个数据分片或其备份分片上;同样的,若设置w1为0,则表示完全按时间段来分布数据,每个时间段的所有测点的数据都存放在同一个数据分片或其备份分片上。该等式是以point_name和time为自变量,slice_id为因变量的函数,也就是说根据接入的数据中的测点名和数据时间戳,我们可以分布到一个确定的数据分片。系统实际运行中,若hash_bucket(hash桶的概念)设定为数据节点数,每个slice_id对应某一个数据节点,则节点变动会导致hash_bucket变动,继而会使得整个数据重分布涉及到系统所有数据文件,因为需要对每条数据值使用新hash函数计算对应数据节点,这种方式只能通过提高hash运算以及数据传输的并行度来提高重分布效率。借鉴一致性hash算法[7]可以有效解决该问题,管理节点存储一个大小为hash_bucket的数组(分片映射表),每个元素存储该元素下标对应数据分片所在的数据节点,该映射关系可以通过人工设定或者按node_num(数据节点数)取模的方式自动分配。
如图2所示,数据是根据分布规则分布到不同节点上,分布规则包含自定义的hash函数和分片映射表,通过自定义的hash函数和分片映射表可以将测点以及数据分布到不同数据节点,分布规则需要在测点写入之前确定,且分布规则一旦确定后,直到数据节点变动需要重分布才会改变,且只能改变分片映射表。若整个数据库系统启动前没有预先设置分布规则,则启动后分片映射表根据数据节点数自动生成,接入测点和数据前,仍需要通过管理客户端设置hash函数相关参数,该分布规则直接交由管理节点保存,调度节点在分配测点和数据前需要从管理节点预先获取分布规则.调度节点首次获取到分布规则后会存储到内存中,无需在每次分配数据时重新获取分配规则,若系统扩容或缩容等有数据节点的变动,需要修改分布规则时,则需要调度节点重新初始化并获取分布规则。
如图3所示,数据存储按照分片管理,每个分片号(slice_id)对应一个文件目录,若作为单独数据库实例运行,该实例包含所有分片号,若作为分布式架构中一个节点,该实例包含分片映射表中部分分片,每个分片文件目录下按时间段区分数据文件组存储数据块,文件组和时间段一一对应,每个文件组和分片目录各自存储一个版本号(version),每次写和修改更新版本号,查询不做版本号更新。
如图4所示,数据接入数据流数据由应用服务器或客户端发往调度节点,由调度节点根据分布规则,将数据发送到不同数据主节点,数据主节点在存储过程中会将数据转发给对应备份节点。
如图5所示,查询请求和查询条件由应用服务器或客户端发往调度节点,由调度节点根据查询条件中涉及到的测点和时间范围,通过分布规则,筛选相关的数据节点,拆分并重新组织多个子查询请求分配到多个数据节点,多个数据节点并行处理查询,完成后将结果返回调度节点,调度节点待所有已分配的子查询返回结果后做聚集处理.将结果反馈到应用服务器或客户端。每一个子查询只可能被发送到某一个数据主节点或者备份节点,除非查询异常才会继续由调度节点发往另一个节点做查询,同时需要向管理节点汇报节点状态,调度节点可以通过判断主备节点的繁忙程度来选择分配节点,数据节点定时向管理节点汇报当前活动状态以及繁忙程度,调度节点也会定时从管理节点同步所有数据节点状态,繁忙程度的度量可以从cpu平均使用率、平均网络使用率、当前磁盘使用率、当前内存占用率等方便综合测算。
处理存储数据的一致性的方法包括以下三类节点的数据一致性处理:
(1)管理节点数据一致性,管理节点一般需要配置多个节点来保障高可用性,主要存储的是分布规则等关键配置,以及各主备节点状态等小颗粒信息,适合基于corosync或zookeeper类似架构实现,保证信息同步有序一致。
(2)调度节点数据一致性,调度节点除了定时从管理节点同步各节点状态到内存外,主要存储测点元数据信息,某个调度节点的操作需要保证成功同步到其他所有正常调度节点,否则对于同步失败的节点,或者设置节点异常状态走同步恢复流程,或者在已执行成功的节点上执行撤销操作,此外后续操作必须等待前序操作所有同步执行完成。调度节点元数据信息被划分区块,正常节点每个区块以及区块顺序都应该是强一致的。和最新版本不一致的调度节点会被标注为不可用,管理节点定时对不一致的异常调度节点进行同步恢复操作。
(3)数据节点的数据一致性处理:管理节点监控数据节点的状态,调度节点通过管理节点获取数据节点的状态,进行数据写入和读取,同时实时地将数据节点的异常状态反馈给管理节点,数据写入时调度节点将数据直接写入数据主节点,由主节点将数据向备份节点做自动转发同步。
数据主节点若发生异常,备份节点会由管理节点指派升级为主节点,异常节点恢复后会作为备份节点继续运行,管理节点在检测到异常数据节点时启动一致性检测,通过两层版本号检测和文件级同步的方式可以使恢复操作对实时处理性能影响最小化,具体检测和恢复方式为:通过分析主备数据节点的各分片版本号以及分片内文件组的版本号(version)不一致情况,确定需要同步的索引和数据文件块并进行数据同步,即对不同版本号文件组直接做替换操作,数据流通过底层tcp传输。为了不影响整个系统的实时性,主备数据异常恢复时采用在线同步模式,即同步过程中不影响数据正常读写,采用如下策略:数据同步过程中主节点产生的修改记录以日志方式记录在主数据节点,并在同步完成后解析日志和更新数据,解析过程中的数据修改仍然追加到日志末尾,直到所有日志解析完毕,管理节点设置该数据主节点和备份节点状态为normal。
具体的操作过程如下所示:
步骤1:配置管理节点、调度节点以及数据节点的ip信息(ip地址、端口),配置其他基本信息(如初始线程数、缓存上限等),各节点分别安装和启动相应服务;
步骤2:设置分布规则参数,确定分布规则,通过管理节点初始化分片,根据主数据节点数和分布规则生成分片映射表。在数据库系统尚未存储测点或数据时可以直接修改分布hash函数和分片映射表,否则只能通过数据重分布方式调整规则;
步骤3:所有应用对数据的读写请求都是从某一个调度节点发起,调度节点等待应用写入或查询请求,首次收到请求,需要向管理节点预先获取分布规则并存储到内存中,若需要扩容或者缩容,则会由管理节点通知调度节点强制重新同步最新分布规则;
步骤4:测点的写请求,调度节点收到测点写请求后,会扫描测点合法性和唯一性,检测通过将测点信息(包含测点名、点类型、压缩算法等重要信息以及一些需要持久化存储的描述性信息)存储到测点表中,并向其余所有调度节点做测点信息同步,若存在同步失败的节点,根据失败节点数做区分,若低于1/2节点失败,管理节点将失败调度节点做异常标记,等待后续同步恢复,若超过1/2节点同步失败,则撤销已成功的节点的加点操作,若撤销失败,同样将撤销失败节点做异常标记,等待后续同步恢复,进入步骤7;
步骤5:数据的写请求,调度节点收到数据写请求后,调度节点根据分布规则,将数据划分到不同分片,并根据分片映射表发送到不同数据主节点,数据主节点在存储过程中会将数据转发给对应备份节点。若转发过程中异常,类似步骤4的方式在管理节点中打上异常标记,等待后续同步恢复;
步骤6:查询请求,调度节点收到测点查询请求后,直接返回查询结果,若收到数据查询请求,调度节点根据查询条件中涉及到的测点和时间范围,通过分布规则,筛选相关的数据节点,拆分并重新组织多个子查询请求分配到多个数据节点并行处理查询,其中查询时主库镜像库分担查询压力,由调度节点按负载情况分派查询任务,完成后将结果返回调度节点,调度节点待所有已分配的子查询返回结果后做聚集处理.将结果反馈到应用;
步骤7:管理节点定时检测是否有异常节点,若存在,会启动同步恢复程序,若标记的是测点信息同步异常,则会对正常和异常调度节点做一致性检测,通过元数据表各区块的版本号对比确定需要同步的区块并直接做区块拷贝替换;若标记的是数据同步时节点异常,通过分析主备数据节点的各分片版本号以及分片内文件组的版本号(version)不一致情况,确定需要同步的索引和数据文件块并进行数据同步,即对不同版本号文件组直接做替换操作。
其中步骤1和步骤2都是系统建立的准备工作,系统建立完毕后不再执行,步骤3至步骤7是并行进行的进程,没有先后顺序,可以同时或者单独执行。