理解分区策略及相关概念in DolphinDB
作者:互联网
-
Overview
分区是对数据库进行深入了解的关键入口。
ddb是为OLAP设计的系统,主要是解决:
- 海量结构化数据的快速存储和计算;
- 通过内存数据库和流数据计算引擎实现高性能数据处理
ddb不适合数据频繁更改的OLTP;
-
什么是好的分区策略
一个好的分区策略通过只读取查询所需的相关数据来减少要扫描的数据量。
-
怎么叫所谓“不好”
如果分区机制设计不合理,对数据库的查询、计算以及其它操作都可能受到“磁盘访问I/O”这个瓶颈的限制。
-
磁盘访问I/O
-
DDB的架构
不同于其他分布式数据库采用的MPP架构,DolphinDB架构中没有leader node与computing nodes的区分,而是点对点结构,每个客户端可以连接到任何一个数据节点。
-
关于分区
不能用不同的分区类型或分区方案覆盖已有的分布式数据库。
分区类型partitionType:定义的几种类型
分区方案partitionScheme:具体的分区内容
partitionType partitionScheme HASH database(“dfs://hashdb”, HASH, [INT, 2]) 产生指定数量分区 RANGE database(“dfs://rangedb”, RANGE, 0 5 10) 具体值的连续扩展;包含起始不含结尾 VALUE database(“dfs://valuedb”, VALUE, 2000.01M…2016.12M) 具体值一个一分区 LIST database(“dfs://listdb”, LIST, [IBM ORCL MSFT, GOOG FB]) 具体值的离散扩展 COMPO 上述四种方案的组合, 值分区
可以追加分区addValuePartitions
ddb是为OLAP场景设计,不支持数据的单点删除或更新,可以支持以分区为单位全部替换;
节点之间复制副本数据以分区为单位;
所有分区的元数据都会驻留在控制节点的内存中,分区粒度过小,分区数过度,可能会导致控制节点内存不足;
ddb通过
共存储位置
的分区机制,保证同一个分布式数据库里所有表在相同分区的数据存储在相同的节点上,以保证这些表在连接时非常高效,避免数据在不同节点之间的复制过程; -
分区优化思路
可以用于分区的数据类型:CHAR, SHORT, INT; DATE, MONTH, TIME, MINUTE, SECOND, DATETIME, DATEHOUR; STRING, SYMBOL (整型、时间、字符串;浮点类型不可以);
以时间类型作为分区字段时,数据库定义的分区字段类型和实际数据采用的时间类型可以不一致;
分区字段应当在业务中,特别是数据更新的任务中有重要相关性;
分区字段应当选用计算和查询时经常用到的过滤字段;
分区粒度不要过大(未压缩前不超过1GB),以免多个工作线程并行时内存不足,经验公式是:
每 个 分 区 解 压 后 的 内 存 < S ( 数 据 节 点 可 用 内 存 ) 8 W ( 工 作 线 程 的 数 量 ) 每个分区解压后的内存<\frac{S(数据节点可用内存)}{8W(工作线程的数量)} 每个分区解压后的内存<8W(工作线程的数量)S(数据节点可用内存)
分区粒度不要过小(未压缩前不要小于100M),避免造成大量的子任务,增加数据节点与控制节点之间的通讯及调度成本;以及低效的磁盘访问;尽量避免使用TIME, SECOND, DATETIME进行值分区,以免分区粒度过细;
分区要避免造成多个writer同时对同一个分区进行写入;
为方便根据数据的分布进行分区,ddb提供
cutPoints(X,N,[freq])
用于获取RANGE分区方案; -
事务机制
不允许多个writer的事务在分区上有重叠;
ddb的子任务是以分区为单位,分区粒度过大造成无法有效利用多节点多分区的优势(并行任务转成了顺序计算任务);
当一个任务有多个子任务时,只有最后一个子任务完成了,才会将结果返回给用户;
-
References
- DolphinDB/Tutorials_CN: 分区数据库
标签:数据库,DolphinDB,节点,粒度,理解,ddb,数据,分区 来源: https://blog.csdn.net/The_Time_Runner/article/details/116424516