基于非关系型数据库的大数据分布式存储技术

2023-08-07 09:20刘志强
科技创新与应用 2023年22期
关键词:分片哈希路由

刘志强

(山东财经大学 管理科学与工程学院,济南 250000)

在分布式存储系统中,数据分散存储,并且数据类型多样,如何快速、精准地查询到需要的数据成为系统使用者关心的焦点问题。非关系型数据库具有极强的扩展性,可根据数据存储需要灵活增、删节点,并始终保证不同节点之间的负载平衡。除此之外,非关系型数据库还能利用键值对实现对目标数据的快速查询。基于此,本文提出了一种基于非关系型数据库的大数据分布式存储技术,并对其应用效果展开了实验探究。

1 非关系型数据库的数据存储结构

1.1 BSON 文档系统

BSON 是一种轻量的二进制格式文件,其功能是把文档转换成格式统一的字节或字符串,从而使BSON 文件可以在不同的驱动程序之间实现数据共享。像内嵌文档查询语句,以及驱动程序中插入的文档等,都必须将其转换成BSON 格式,才能支持查询功能和驱动功能的实现。BSON 文档分析流程如下:使用BSON Document 新建一个普通文档,文档内容为“zhangll”;然后建立一个字节数组,作用是存放BSON文档的转换结果。之后,Documet 会根据设定好的转换规则,将文档内容转换成为二进制数组25、0、0、0、2、109、121、116、101、115、116、0、8、0、0、0、122、104、97、110、103、108、108、0、0。

该二进制数组共包含25 个字节,其中第1—4 字节表示BSON 文档的长度;第5 字节表示元素类型,即字符串型变量(string)型;第6—11 字节为文档内容“zhangll”的二进制编码;第12—13 字节表示元素的长度;第14—23 字节是元素内容的二进制;最后2 个字节分别表示子文档和文档的结束符。在非关系型数据库的数据存储结构上,以BSON 文档形式保存数据,具有效率更高、性能优越等优势。

1.2 GridFS 大文件存储系统

在非关系型数据库中,常用持久化存储文件模块(GridFS)存储大二进制文件。从应用效果来看,以GridFS 文件保存数据,可以摆脱对独立存储架构的依赖,降低了分布式存储的成本[1]。同时,GridFS 具备分片识别功能,具有较强的故障恢复能力,保证了存放的大数据文件不会丢失、损坏。从存储容量上来看,GridFS文件的最大存储容量可以达到2 G。非关系型数据库在分配数据时,可以减少硬盘碎片。对于需要保存到GridFS 文件系统中的单个文件,需要执行一个判断程序。例如,设定判断条件为“文件是否大于20 M”,如果判断结果为“是”,则需要将该文件拆分成若干个分块文件,分别保存。同时,对分块文件也要再次进行判断,直到所有的文件都小于20 M,原理如图1 所示。

图1 GridFS 文件系统

在非关系型数据库中,应用GridFS 文件系统,可以支持用户上传最大容量为2 G 的文件;同时,对于上传的大容量文件,又会根据用户自定义的判断条件,将大容量文件拆分成若干个分块文件,将其分别存储到分布式数据库中。

2 分布式存储系统的存储方式

2.1 泛洪存储方式

对于非结构化系统,由于数据的分布较为松散,节点之间不存在固定联系,可以采取泛洪(Flooding)存储方式。在这种存储模式下,每当有新的节点被添加到分布式存储系统时,新添加的节点只会与临近的节点产生联系;后期用户想要搜索该节点,可以先寻找临近节点,并利用临近节点上的路由信息,确定新节点的位置和数据。在泛洪存储方式下,分布式存储系统中的任意一个节点都包含一张“邻居表”,表内存储了该节点周围其他节点的路由信息,大量的节点利用邻居表相互连接,从而形成了复杂的分布式系统。路由途径如下。

用户编辑并发送查询指令ping,该指令会路由到最近节点,并判断该节点上是否有用户需要的数据。如果有,则该节点返回pong 信息,路由过程中止;如果没有,则该节点会遍历邻居表,将ping 指令发送给其他的临近节点,同时判断这些临近节点上是否有用户需要的数据。重复上述过程,直到检索到目标数据。另外,搜索指令中包含一个TTL(time_to_live)域,发挥计数功能;每向下一级路由1 次,TTL 值减1,当TTL 值为0时,路由停止。

2.2 基于分布式哈希表的存储方式

分布式哈希表(Distributed hash table,DHT)可以将负载均匀地分散到整个系统的所有节点上;不管是新增节点,还是节点失效,分布式哈希表都能够根据当前节点数量再次平衡负载。同时,每个节点上也有一张邻居表,但是该表格中存储的节点信息,是距离其有一半节点数距离的节点,从而使数据查找的复杂度从原来的N 变成了N/2。基于分布式哈希表的数据分布与查找方式如图2 所示。

图2 DHT 存储方式示意图

结合图2,假设有2 个节点A 和B,将A 节点分成2 个缓存节点A1 和A2,将B 节点分成2 个缓存节点B1 和B2,分别向4 个缓存节点插入数据P1、P2、P3、P4。用一个圈表示数字的范围,然后使用哈希(hash)函数计算这4 个插入数据的哈希值,并将其放于圈上的不同位置。沿着顺时针方向,将P1、P2、P3、P4 装入距离该哈希值最近的节点,完成数据的插入。

当需要从分布式哈希表中查找数据时,用户首先发送查询指令,该指令到达最近节点后,遍历节点表格。仍然采用哈希函数计算要检索的数据的哈希值,然后参考get(key)计算结果,确定目标数据位于分布式存储系统的哪个节点上,从而快速、精准地完成数据查询[2]。

3 基于非关系型数据库的自动分片技术

3.1 数据分片

随着数据量的日益增加,对计算机的存储空间提出了更高的要求。存储扩展能够以相对较低的成本,使计算机的存储容量得到扩充,以满足数据存储需要。根据扩展方式的不同,又可分为纵向扩展、横向扩展2 种类型。所谓纵向扩展,就是增加硬盘的数量,并将多个硬盘并联实现数据共享,这些硬盘共同组成了分布式数据库。纵向扩展的优势在于简便易行,但是数据处理速度慢。而横向扩展则使用到了数据分片技术,将数据分散到不同的服务器,并且能够根据每一台服务器的存储上限、处理能力等确定数据的分摊比例,在不超过存储上限的前提下保证服务器数据总量相对均衡。这种扩展方式的优点在于将多台服务器组成了分布式拓扑结构,扩展更加简便,同时保证了较快的数据处理速度。

在非关系型数据库中,常用的数据分片有散列分片、集合分片、列表分片等几种[3]。其中,散列分片适用于分布式数据库中数据并非按照顺序保存的情况。在数据分片时,可以将数据的位置指针放在散列函数的结果上,利用合适的散列函数实现数据分片;集合分片则是将分布式数据库中2 个不同的分区集合到一起,然后按照特定的规则或者合适的函数将集合切分成若干小块。

3.2 自动分片的实现方式

基于非关系型数据库的自动分片流程为:把数据库中现有的所有数据集合按照特定的规则切分成许多小块。得到的分片小块均由非关系型路由器管理。如果有用户发起数据查询或数据写入的请求,路由器会根据分片片键(Shard key)规则快速定位对应的分片。同时,挑选分布均匀的片键作为分区标准,以便于保证负载均衡。其中,基于非关系型数据库的自动分片功能需要由Config 配置服务器、Mongos 路由服务器、Mongod 分片区及Client 客户端等几部分组成,系统组成如图3 所示。

图3 MongoDB 系统的结构组成

用户从客户端上发起访问请求,该请求经Mongos服务器访问各个分片区(Mondod1,Mondod2 等)。这些分片信息被存储在配置服务器上,既可以起到均衡负载、分担存储压力的效果,同时还能显著提高数据的安全性[4]。

3.3 自动分片技术的应用效果

为了验证自动分片技术的应用效果,本文使用华为笔记本MateBook 14 进行了实验,基本参数如下。

1)CPU,inel i5-1240p。

2)内存,16 G。

3)网络传输,Wi-Fi6。

4)固态硬盘,512 GB。

5)操作系统,Windows11。

6)内存频率,3 733 MHz。

分别在笔记本的C、D、E、F 4 个硬盘创建了1 个MongoDB 安装文件,并将C 盘作为配置服务器。然后输入命令。

C:mongodbinmongod--dbpath=C:mongodbdatadb-port3333

执行该命令后,位于C 盘的Mongod 程序开始运行,并将自动分片产生的文件数据保存在C:mongodbdatadb 文件夹中,设定端口号为3333。继续输入以下命令

D :\mongodbinmongos - port4444 - configdb =127.0.0.1:3333

执行该命令后,将位于D 盘的Mongos 作为新建分片系统的路由服务器,将该服务器的IP 设定为127.0.0.1,设定端口号为4444。将E 盘和F 盘设定为系统的2 个分区。完成上述设置后,创建一个mytest 数据库,并向该数据库中插入10 万条指令。自动分片结束后,输入db.TestcollectionServer2.find()指令,查看分片后的数据分布情况。

结果表明,新建数据库mytest 的状态为“partitioned”,说明该数据库已经采用分区功能,有2 个分区。分区一有3 个文件,分别是test.1、test.2、test.3,大小依次是128、144、156 MB。分区二有5 个文件,分别是test.1、test.2、test.3、test.4、test.5,大小依次是64、77、59、68、70 MB。可以发现,该系统可以自动完成分片,各分片的大小虽然有差异,但是在可接受范围内,基本上能够将数据分散到多个节点上,保证了负载均衡[5]。

3.4 自动分片技术在分布式存储系统查询优化中的应用

为了进一步提高用户查询命令的响应速度,本文使用自动分片技术对分布式存储系统中的数据查询进行了优化。在非关系型数据库系统中,可用于数据查询的函数有多种,这里以查询效率较高的Skip 函数为例,验证该函数在查询优化中的应用效果。

创建1 个新的数据库mytest,在数据库内添加一个数据集合TestcollectionServer2,其中包含3 708 660条数据记录,集合含有name 键,表示如下

Mongos>db.TestcollectionServer2.count()

3617551

其中一条记录如下

{id:ObjectID(551CELL1120BA9DC27A6DC76DD),name:zhanglulu0}

需 要 查 询 name 键 值 在 zhanglulu2000000 ~zhanglulu2000020 之间的记录。

本文分别使用了常规的$gte 函数和改进的skip 函数进行数据查询,结果分别如图4、图5 所示。

图4 基于$gte 的查询过程

图5 基于skip 的查询过程

结合上图可知,基于$gte 函数的数据查询,扫描数据为3 708 660 条,即完成了对所有数据的扫描,共计用时为2.068 s;基于skip 函数的数据查询,扫描数据为2 000 019 条,共计用时为291 ms。对比可以发现,基于skip 函数的自动分片技术,在数据查询方面能够显著提高查询效率。

4 结束语

分布式存储技术的出现,能够满足大数据时代海量数据的存储需求。分布式数据库虽然存储容量得到了大幅度提升,但是用户如何快速、准确查找到需要的数据,成为必须要解决的问题。本文提出了一种非关系型数据库的自动分片技术,借助于动态负载均衡算法,将分片后的数据均匀地分散到各个节点上,保证了负载均衡,节约了计算机资源,从而显著提高了数据查询速率,满足了分布式数据库快速索引的需求。

猜你喜欢
分片哈希路由
上下分片與詞的時空佈局
分片光滑边值问题的再生核方法
CDN存量MP4视频播放优化方法
基于模糊二分查找的帧分片算法设计与实现
探究路由与环路的问题
基于OpenCV与均值哈希算法的人脸相似识别系统
基于维度分解的哈希多维快速流分类算法
PRIME和G3-PLC路由机制对比
WSN中基于等高度路由的源位置隐私保护
基于同态哈希函数的云数据完整性验证算法