分布式架构势在必行

在传统的数据库技术中,为了保证数据的安全与高性能,通常会选择高端的外置存储作为数据库的主要存储源,而本地磁盘则被视为不可靠的性能低下的一种设备。这种观念的产生,主要是由于过去本地磁盘的生产技术存在一定的瓶颈,并且其稳定性和性能确实都远落后于高端存储。

互联网应用迅猛发展

在过去, IT行业的发展远没有现在蓬勃,大家更多的是在家里或者办公室通过桌面级设备上网查询资料和浏览世界各类时事新闻。在这样的时代背景下,互联网企业和像银行、通讯类公司这种对IT部门十分依赖的传统企业,一台小型机和一个优秀的关系型数据库就能够很好的处理企业内部多个系统之间的数据了。

但是在最近10年,甚至更短的时间里,每个人手中都拥有了一部或者多部智能移动终端,它们除了能够打电话、发短信,也能够像笔记本电脑一样,上网、玩游戏、购物、聊天。各种智能应用和业务场景也被开发者发掘出来了,这些新颖的应用也正在被大部分消费者所接受。

硬件成本大大降低

一台小型机+一个优秀的关系型数据库已经越来越不能满足IT部门对急速膨胀的数据量的处理需求了,重要一个原因,传统的数据库技术无法做到方便快捷地将海量数据分配给多台服务器去计算,而永远只能通过垂直扩容硬件的方式提升系统性能。

经过这10几年的发展,过去不被企业认可的磁盘技术有了很大的进步,从SATA磁盘到SAS磁盘,从机械磁盘到SSD磁盘,技术的进步,使得本地磁盘的稳定性和读写性能都有了非常大的提升。它们也逐渐被企业使用在重要的生产环境中。

分布式大数据技术革新

与磁盘技术同时发展起来的,还有各种大数据技术。先有谷歌的三篇著名论文,后有各种技术特点的NoSQL/NewSQL数据库。它们的技术实现,都是基于廉价的X86服务器和本次磁盘作为主要的硬件服务器而设计。

并且各种NoSQL/NewSQL数据库的技术特点,都包含了数据分布式存储的功能技术,以解决当前企业数据量快速膨胀,客户对IT系统的相应时间要求越来越高的技术难题。

数据库分布式原理介绍

Hash 方式分布数据

数据库Hash方式分布数据,原理就是用户在建立集合时,指定此集合的切分方式为Hash,并且显式指定ShardingKey 为记录中哪个字段。

enter image description here

图1

当应用APP向数据库发送写入记录的请求时,首先会将记录与请求发送到数据库的Coord节点,Coord节点会根据此集合的切分方式,例如ShardingKey=id,ShardingType=Hash,以及记录中ShardingKey的Hash值,判断应该将此记录分发给哪个数据分区组。一旦数据分区组接收到写入记录请求与写入的数据信息,数据分区组会调用数据库中相应的方法将此记录持久化到磁盘上,并且同时更新此数据分区组中对应集合的索引数据。

Range 方式分布数据

数据库Range方式分布数据,原理就是用户在建立集合时,指定此集合的切分方式为Range,并且显式指定ShardingKey 为记录中哪个字段。

enter image description here

图2

当应用APP向数据库发送写入记录的请求时,首先会将记录与请求发送到数据库的Coord节点,Coord节点会根据此集合的切分方式,例如ShardingKey=id,ShardingType=Range,以及记录中ShardingKey的值,判断此记录是属于哪个范围的数据分区组,然后再将此记录发送给对应的数据分区组。一旦数据分区组接收到写入记录请求与写入的数据信息,数据分区组会调用数据库中相应的方法将此记录持久化到磁盘上,并且同时更新此数据分区组中对应集合的索引数据。

Partition 方式分布数据

在SequoiaDB数据库中,对比其他的NoSQL数据库的简单数据切分功能,使用了“主子表”的功能,这个功能与部分关系型数据库的Partition功能类似,都是在数据库中建立一张逻辑的总视图,然后将多个Partition通过某个字段的范围限定挂载到总视图上。

通过“主子表”这种分布式方式,用户可以按照需求对于数据进行更好、更细化的切分工作。同时,类似于时间序中或冷热数据可以做到天然的切分,这样更有利于硬件资源的充分利用。

在SequoiaDB中,main collection 对应关系型数据库的总视图,sub collection 对应关系型数据库的partition。而SequoiaDB数据库中,比较特殊的是,sub collection 实际上就是一个普通的集合,而main collection 则是只存在于数据库的编目节点中,并不会在任何数据分区组中写入任何数据。

用户基本可以理解为main collection为逻辑视图,只在编目节点中保留一些数据范围信息,而sub collection 则是数据库中普通建立的集合,只是在配合main collection 一起使用时,才被称呼为sub collection。

enter image description here

图3

在一般情况下,用户建立一个集合,此集合会随机被分配到某个数据分区组上。如果用户要利用主子表功能来实现数据的分布式存储,还需一些小技巧。用户在建立集合时,可以通过显式指定此集合被分配到哪个数据分区组上,从而避免sub collection扎堆在某个数据分区组上。

用户最后一个步骤就是给每个sub collection 划定范围分区,然后将各个sub collection attach到main collection 上。

多维分区

在SequoiaDB数据库多种分布式原理上,最为复杂和最为高效的方法,就是数据多维分区。多维分区,顾名思义,就是在对集合做数据分区时,不止一种分区方式同时作用在一个集合上。 如图4 ,多维分区实际上就是主子表和Hash分区相结合的一种方式。

enter image description here

图4

目前SequoiaDB的多维分区可以为一个集合提供两个字段的做分区。一般情况下,用户可以在主子表中对time字段做范围切分,然后再对sub collection 的id字段做Hash切分。

用户使用多维分区的方式,主要的优势在于可以将一个海量数据的集合以更加小的颗粒度做数据均衡,以提升数据库的性能。

用户在使用多维分区功能时,还可以结合数据库的Domain 功能,来更好地处理数据分区任务。

enter image description here

图5

Domain,就是数据库将多个数据分区组整合在一起的一个逻辑域,用户可以在建立集合空间时直接指定此集合空间属于哪个Domain上,然后基于此集合空间建立的集合,只要是ShardingType=Hash的,数据库就会自动将此集合按照ShardingKey的Hash 值分发给属于此Domain的数据分区组。

SequoiaDB巨杉数据库2.6最新版下载

SequoiaDB巨杉数据库技术博客

SequoiaDB巨杉数据库社区

enter image description here