1、总体架构说明:
(1)Greenplum:
MPP架构(Massively Parallel Processing):大规模并行处理系统。
整个系统是一组独立的数据库阵列。每个数据库相互独立,有独立的数据存储,日志,索引等等。
集群中HOST分为两种,一个是MASTER HOST,一个是SEGMENT HOST。MASTER HOST
不存放数据,只存放全局系统目录(存放数据自身一些元数据),负责客户端连接,处理SQL命令,分发SEMENT任务,汇总SEGMENT返回的结果,展现给最后的结果给客户端程序。
SEGMENT HOST存放用户数据和索引。同一个HOST上可以根据硬件(CPU core,network等)部署多个INSTANCE,同一个SEGMENT HOST上的两个INSTANCE也不能直接访问。
(2)DB2 DPF:
DPF架构类似,也是MPP架构,每个数据库有独立的日志,引擎,锁,缓存管理。服务器之间是通过万兆交换机交换数据。服务器内部通过share_memory实现相互之间访问。服务器16core,每个core对应8G内存,一个RAID组。
总结:MPP结构最大的特点是,不共享资源。节点内部只访问本身的内存和存储,节点之间信息交互与节点的处理时并行的。MPP在增加节点时性能基本可以实现线性扩展。MPP系统不共享资源,因此,当达到一定规模时,资源比SMP要多。因为MPP系统因为要在不同处理单元之间传递信息,通讯时间比较少的时候,MPP就能充分发挥资源优势,达到高效率。
2、数据库核心技术(并行数据流引擎带来的多维分区或者混合分区):
MPP架构中,解决各个节点的并行处理问题。Greenplum 和ISAS都采取了同样的思路:表分区,就是将一张完整的表,通过HASH算法,尽量均衡的放在不同的节点上。
下面说明ISAS和Greenplum的多维分区:
1)哈希分区
分区键,这个必须指定,没有类似GP中随机分区的概念。如果没有一个合适的列作为分区键,可以通过表新增一个自动生成列,列中填充随机数据,然后以这个自动生成列作为分区键。
分区键支持多个列作为分区键,数据库自动通过这两个列计算出HASH值,然后决定分区位置。
指定分区键之后,会生成hashmap,如果数据不均,可以通过调整hashmap,微调数据分布。这个是GP中目前没有看到的。
当前ISAS测试中按msisdn号码作为分区键,如表中没有此字段,则用MCC+MNC+CC等字段拼接成的位置区号作为分区键。目的是为了使表记录按分区键的值均匀分布到各计算节点。
哈希分区和Greenplum中每个表指定Distrubute key类型。
2)表分区
哈希分区的基础上,将同一范围的数据存放在同一范围。只支持RANGE分区。不支持LIST分区。
表分区是在哈希分区的基础上进一步将表划分,查询的时候减少扫描的数据量,减少I/0。
当前性能测试中未使用表分区。
这个在Greenplum中ranger 表分区。
3)多维聚族索引(MDC)
物理上将多个维上具有类似值的行聚集在一起放在磁盘上。
这个和表分区有两个主要的区别,首先,所有的索引一定是固定的值,不能像表分区一样是范围,另外,数据库内部是通过索引映射实现的。
当前BSASE表中,所有批次数据存放在同一张表中,60分钟汇聚使用starttime,批次号作为多维聚簇。这样汇聚的时候只会取需要汇聚的4部分数据。
这个和Greenplum中list表分区。
ISAS 的3个分区模式可以根据条件组合使用。
其中ISAS表可以指定分区。维度表可以指定存在0分区上,然后通过表复制,32个分区上就都有维度表的数据。事实表和维度表非分区键合并连接时,避免在分区之间发送数据,从而提高查询性能。
另外,还可以通过MQT(物化查询表)实现同样的功能。
MQT,物化查询表,依查询结构而定,可以认为是一种物化的试图,数据可以来自一个或者多个视图。
哈希分区和GP类似。
表分区和Greenplum range类似,多维聚簇, Greenplum中list表分区。
3、两种MPP数据的细节区别:
两种都是MPP架构的数据。设计思路类似,但是一些细节上还是有一些区别。下面简单说明下:
3.1 数据装载:
Greenplum MASTER节点只承担少量控制功能以及和客户度的交互,完全不承担任何计算。ISAS装载必须有admin节点来完成,通过admin节点上其多进程对数据进行分发。装载需要消耗一定的性能(目前看测试20G文件转载1分钟左右,CPU 33%)。与之相反的是Greenplum在数据装载时,不是我们一般想象的存在一个中心的数据分发节点,而是所有节点同时读取数据,然后根据hash算法,将属于自己的数据留下,将其他的节点的数据通过网络直接传送给他,所以数据装载的速度非常快。
3.2 HA架构:
(1)Greenplum的HA架构:
MSATER是通过单独的HOST做备份冗余。最大的特点是segment通过mirror镜像来实现冗余。segment镜像和segment一定保存在不同的host上,master如果连接不上,就标记为Invalid,下次连接上了,就标记为valid状态。
系统如果没有配置mirror,master检测invalid的segment时,就会关闭数据库,来保证数据不出错。如果系统配置了镜像,那么系统在read-only模式和continue模式下处理模式不同,前面不允许DDL和DML操作,可以在线恢复。
后者的操作必须限制在非invalid的segment上的数据,而且invalid的segment恢复时必须重启数据库系统。master镜像就是master的在线standby,因为master上面只保存目录表和系统日志,因此在standby上面一个事务重复记录进程(gpsyncagent连接master以同步,一旦master连不上即坏掉,该进程停止工作,并让standby从master上一个成功事务操作之后开始接管系统(PS:master出故障前,standby上面只gpsyncagent一个进程运行。
(2)ISAS HA结构:
通过操作系统或者第三方的软件实现HA。
3.3数据存储:
ISAS只支持行存储。
Greenplum支持混合存储:
(1) 普通的行存储,支持读写。普通的堆积表。
(2) AOT表,行存储,只读,不支持update,delete,可选压缩。
(3) AOT表列存储,只读,不支持update,delete,支持压缩。
列存储的优势是在于适合宽表设计,在查询只查询部分字段的情况下,效率高于行模式。(因为只需要读出相应的列,减少I/O),同时因为都是同样的数据类型,所以更容易压缩。
3.4 数据压缩技术:
ISAS压缩基于表级别,目前不能指定压缩级别。提供类似Winzip的压缩级别。ISAS压缩的特点是不光对数据进行压缩。索引和临时表也会自动压缩。目前ISAS宣称的压缩比例是 60~70%。
Greenplum支持两种压缩算法ZLIB,压缩比比较高,提供1到9个级别,数字越大,压缩比越高,一种QUICKLZ,压缩比小,对应的带来的CPU负荷低。
最新的4.2版本提供一种RLE的新的基于列的压缩算法,提供基于列级别的压缩。
3.5索引技术:
ISAS只支持B+索引。
Greenplum支持三种索引B-Tree,Bitmap,hash,第三种不推荐使用。
B-Tree:
用在完全不同的列。
用于单列查询。
Bitmap:
低基数列。
列被作为查询的谓语。
Hash:
可以,但是不推荐。
还可以指定对语句建部分索引。
索引影响insert,update,创建的时候消耗CPU。
创建索引遵守的原则:
(1)不要把给经常变更的列建索引。全表扫描性能不好时才需要创建索引。
(2)不要建重复的索引并给索引命名。
(3)低基数的列用bitmap索引。单列的查询使用B-Tree索引。
(4)加载数据的时候先drop掉索引,加载之后再重新创建索引。
(5)扫描一个大表的子集时,使用部分索引。
(5)重创建索引执行执行Analyze。
3.6 Workload manager
队列的限制包括:活动的声明计数,活动声明的内存,活动的声明权限,活动声明的花费
Work load manager是数据仓库提供的负载均衡工具。
可以通过设置CPU(百分比),内存(优先级),I/O(优先级),给不同任务。动态的分配资源给不同的任务。
GP有类似的resource queue的概念。Resource queue可以配置以下限制:
Active statement count
Active statement memory
Active statement priority
Active statement cost 这个是查询计划估计的,以获取磁盘Page为单元。
resource queue 通过设置内存(指定每个statement的内存大小和resource queue的总大小,每个statement 一旦运行,就分配了所有指定的内存直到结束。)
GP中CPU是设置优先级和ISAS有区别。
3.8在线扩容:
支持在线扩容,扩容时,表数据需要重新分布。重分布时,是一张一张表进行。正在进行数据重分布的表,不能加载数据。这个类似GP,GP进行数据重分布时,正在重分布的表不能读写。另外GP会自动去掉唯一性限制,所以在表重分布时,碰到重复的行不会报错,所以可能导致ETL出错。