随着业务系统非结构化数据年增加量较大而且数据愈来愈多。在业务系统投产后,因为业务量的增长使得集群可以使用存储容量逐渐变小,所以在业务系统接入集群前需考虑存储容量耗尽后整个集群的水平扩展。SequoiaDB是分布式架构的文档型数据库,所以能够经过集群的扩容实现集群性能的近线性增加。经过扩容后主要解决两个问题是数据存储的容量问题和整个集群的性能问题。由于数据量的不断增加及上线后的推广使用,因此须要进行扩容来提高集群性能及增长数据存储空间。数据库
1.旧数据量大,不但愿移动数据;微信
业务系统库表数据量很是庞大,因为投产以来,业务量的持续增加,集群可用的存储容量消耗殆尽,没有多余的其余磁盘资源来知足移动旧数据的能力。指望能在不移动已经存在的旧数据的状况下,解决存储容量不够的问题,以知足后期业务增加的需求。架构
2.旧数据量不大,指望得到最好的性能,能够移动数据;并发
业务系统库表数据量不大,但包含平常业务操做,尤为是大量的前台操做,对查询的响应速度、并发量和吞吐量要求高。指望在数据量增加后,依然可以获得极致的读写性能。分布式
3.彻底不停服务,对应用透明;工具
业务系统存在数据存储容量或集群性能瓶颈,须要进行改善,但业务系统须要24小时对外提供服务,指望数据库的扩容动做对上层业务彻底透明。性能
4.可以有停服务时间窗口,对应用透明;测试
和上述3场景相似,但可以有必定的时间窗口进行中止服务进行数据库变动,指望业务系统不须要改动,完成扩容的动做。大数据
5.不改动数据库,但愿更新应用;spa
应用代码比较容易变动,修改代码逻辑,完成集群的扩容。
针对以上几种应用场景提供的几种不一样解决方案优缺点对比:
|
主子表+导入导入 |
主子表+ split |
主子表+数据域 |
普通分区表+ split |
普通分区表+导出导入 |
是否不移动数据 |
否 |
是 |
是 |
否 |
否 |
迁移期间是否提供读 |
是 |
是 |
是 |
是 |
否 |
迁移期间是否提供写 |
否 |
是 |
是 |
否 |
否 |
是否提供24小时不停服务 |
是 |
是 |
是 |
是 |
否 |
是否对应用透明,不修改应用 |
是 |
是 |
是 |
是 |
是 |
是否不须要手动切分 |
是 |
否 |
是 |
否 |
是 |
每种解决方案在后面章节5将有具体介绍。
SequoiaDB的垂直分区也称做主子表,是将集合数据按照指定的分区键范围分别存储到不一样的子表中,相似于传统关系型数据库中分区表的概念,主集合中不存听任何数据记录。
SequoiaDB垂直分区
detach原子表,attach
集合的split方法,用做数据的切分,把存储在某些物理区块上的一个大数据量集合,按某一个或多个字段的值将之划分红若干个小的部分,将这些小的部分分散存放到更多的物理区块上。
SequoiaDB提供数据的导入(sdbimprt)和导出(sdbexprt)工具,可以将JSON格式或 CSV 格式的数据导入到 sdb 数据库,和将sdb 数据库集合中的数据导出到外部文件中。
V2.8.2的集群环境:
ReplicaGroup |
详细信息 |
|||
|
机器名 |
端口号 |
数据存储路径 |
是否为主节点 |
SYSCoord |
Host1 |
11810 |
/opt/sequoiadb/database/coord/11810/ |
Y |
|
Host2 |
11810 |
/opt/sequoiadb/database/coord/11810/ |
Y |
|
Host3 |
11810 |
/opt/sequoiadb/database/coord/11810/ |
Y |
SYSCatalogGroup |
Host1 |
13000 |
/opt/sequoiadb/database/cata/13000/ |
N |
|
Host2 |
13000 |
/opt/sequoiadb/database/cata/13000/ |
Y |
|
Host3 |
13000 |
/opt/sequoiadb/database/cata/13000/ |
N |
datagroup1 |
Host1 |
11910 |
/mnt/disk1/sequoiadb/data/11910 |
Y |
|
Host2 |
11910 |
/mnt/disk1/sequoiadb/data/11910 |
N |
|
Host3 |
11910 |
/mnt/disk1/sequoiadb/data/11910 |
N |
datagroup2 |
Host1 |
11920 |
/mnt/disk2/sequoiadb/data/11920 |
N |
|
Host2 |
11920 |
/mnt/disk2/sequoiadb/data/11920 |
N |
|
Host3 |
11920 |
/mnt/disk2/sequoiadb/data/11920 |
Y |
datagroup3 |
Host1 |
11930 |
/mnt/disk3/sequoiadb/data/11930 |
N |
|
Host2 |
11930 |
/mnt/disk3/sequoiadb/data/11930 |
N |
|
Host3 |
11930 |
/mnt/disk3/sequoiadb/data/11930 |
Y |
datagroup4 |
Host1 |
11940 |
/mnt/disk4/sequoiadb/data/11940 |
N |
|
Host2 |
11940 |
/mnt/disk4/sequoiadb/data/11940 |
N |
|
Host3 |
11940 |
/mnt/disk4/sequoiadb/data/11940 |
Y |
datagroup5 |
Host1 |
11950 |
/mnt/disk5/sequoiadb/data/11950 |
Y |
|
Host2 |
11950 |
/mnt/disk5/sequoiadb/data/11950 |
N |
|
Host3 |
11950 |
/mnt/disk5/sequoiadb/data/11950 |
N |
datagroup6 |
Host1 |
11960 |
/mnt/disk6/sequoiadb/data/11960 |
N |
|
Host2 |
11960 |
/mnt/disk6/sequoiadb/data/11960 |
N |
|
Host3 |
11960 |
/mnt/disk6/sequoiadb/data/11960 |
Y |
下面经过以上的几种特性的组合,完成几种不一样场景下的扩容方法:
扩容前该主子表的每一个子表(集合1-n)数据均匀存放在原数据域内数据组1-3上,如图1所示,目标是将每一个子表(集合1-n)数据均匀分布到包含原数据组和新加入数据组的数据组1-6上,如图4所示,经过以下步骤进行扩容:
(1).将新加入的数据复制组添加到域中;
(2).在更新后的域中对主表的每一个子表创建新的子表;
(3).创建管道文件;
(4).导出原子表数据到管道文件,同时导入管道文件中的数据到新子表中;
(5).导出导入完成后,校验数据的正确性,从主表上分离原子表,挂载新子表;
(6).删除原子表。
此方式适用于,原来的数据组数据未接近饱和,最接近饱和的数据组,能容纳最大数据量集合除以扩容后数据组个数的存储空间。因为主表名称不受扩容影响,分离原子表,挂载新子表速度很快,能不停机提供查询操做,不须要改动上层业务系统正常运转。但在迁移过程当中,集合中数据不能变更。
扩容前该主子表的每一个子表(集合1、2)数据均匀存放在原数据域内数据组1-3上,如图1所示,目标是新增子表(新集合1、2),新数据均匀分布到新加入数据组的数据组上,如图4所示。
在创建子表时,设置autoSplit属性为false,使用Group属性,但使用Group指定集合创建的分组时,只能指定一个数据组,不能指定多个数据组。所以还须要在子表上,手动使用split方法,将数据范围切分到其余新增的数据组上。经过以下步骤进行扩容:
1.将新加入的数据复制组添加到域中;
2.在新加入的某个数据复制组上,创建新的子表;
3.使用split手动将新子表切分到其余新加入的数据组上;
4.挂载新的子表到主表上。
此方式适用于主子表,且主表和子表之间带有时间特性,业务系统过来的新增数据存入到新的子表中,在按年或月信息做主子表分区键时,在当前阶段的子表数据接近饱和时,经过新增下一阶段的子表,来存放下一阶段的数据。 对业务系统透明且无任何运转的影响。但因为Group只能指定一个分区组,手动切分比较麻烦。
因为数据域的指定是在集合空间上,因此新的子表不能建在原集合空间上,须要新建集合空间,指定数据域为新的数据域。
1.在新加入的数据复制组上新建域;
2.在新的数据域上,创建新的集合空间;
3.在新的集合空间上,创建新的子表;
3.将新的子表attach到主表上。
和第三种方式差很少,适用场景同样,但少了手动切分的过程,替换为新增数据域和集合空间,利用域的autoSplit特性,自动完成切分过程。缺点是增长了域和集合空间,增长了复杂性。
1.将新加入的数据复制组添加到域中;
2.使用split方法对域中的每一个集合的数据,手动切分到新加入的数据组中。
最常规的一种方式,适用于非主子表结构的普通集合,能不停机提供查询操做。
注:在切分的过程当中,从协调节点看,集合的数据量会存在波动;对该集合数据的增删改可能会出现问题,建议在没有修改操做的时候进行该切分操做。
1. 将新加入的数据复制组添加到域中;
2. 导出域中全部的集合数据,以及集合空间定义、集合定义和索引定义;
3. 删除域中原有的集合空间;
4. 新建集合空间、集合以及索引。
5. 导入以前导出的数据到新创建的集合中。
至关因而对整个域内的结构,进行重建,适用于集合空间、集合和数据组特别多,但域内数据量很少,或数据能够所有清空的场景。特别适用于初期建表测试时,发现表结构或容量不知足需求,须要重建的状况。
在不一样的适用场景下选择不一样的扩容方式,若是扩容前,采用了主子表的存储方式,根据主表分区键的特征,选取不一样的扩容方式,若是分区键带有时间特性(逻辑上某段时间入库的数据,只会落在某些子表上),譬如业务暂时存储近期内的数据,远期的数据存储在将来部署的机器上的场景,可使用方式二和方式三,而当新增数据组特别多时,方式三工做量更小;若是分区键不带有时间特性,可使用方式一。若是扩容前没采用主子表的存储方式,可使用方式四。若是在业务数据存储规划前期(数据量较小的状况下),建表后,发现起初规划的存储空间不够用,须要增长数据组,可使用方式五,快速重建表结构。
微信客服:
sequoiadb111