greenplum,teradata,presto,clickhouse四种分布式数据库的对比【转】

时间:2021-04-05 12:00:18   收藏:0   阅读:0

1. 四种数据库的比较

数据库描述
Greenplum 开源大规模并行数据分析引擎。借助MPP架构,在大型数据集上执行复杂SQL分析的速度比很多解决方案都要快。应用广泛。
Teradata 大型数据仓库系统,产品成熟,价格昂贵。用于证券系统。
Presto 分布式SQL查询引擎, 专门进行高速、实时的数据分析。本身不存储数据,但是可以接入多种数据源。擅长对海量数据进行复杂的分析。用于大数据量分析。
Clickhouse 用于在线数据分析。支持功能简单。CPU 利用率高,速度极快。用于行为统计分析。

2. Greenplum数据库

2.1 Greenplum架构

技术图片

2.1.1 采用MMP架构

2.2.2 Hadoop与MPP的应用区别

HadoopMPP
非结构化数据,半结构化数据 关系数据
海量数据存储查询、批量数据ETL、日志分析、文本分析 多维度数据自助分析、数据集市

2.2 greenplum 的高可用性

2.2.1 master冗余

2.2.2 segment冗余

2.3 greenplum的并行查询

gatherbroadcastredistribution
每个节点数据发至master节点 表数据分布在各节点上,需每个节点发数据至每个节点,使每个节点都拥有表的完整数据,适用于小表 join与group by时,广播代价大时可按键重新将各节点数据打散至各节点再对每个节点操作,适用于大表
行存储列存储外部表
多列更新快 一次只访问几个字段,压缩比高 数据库只保留元数据信息

2.4 greenplum的多版本控制(MVCC)

事务型数据库用锁机制控制并发访问,greenplum用多版本控制保证数据一致性。最大的好处是读写不冲突,读的是snapshot。

3 Teradata数据库

3.1 Teradata 数据库架构

每个节点物理上是一个SMP处理单元(多CPU计算机),节点硬件包括CPU、内存、磁盘、网卡、BYNET端口

网卡:与IBM MainFrame连接的Channel Adapter;局域网网卡。 一个节点上只会使用一种网卡,但会有多块网卡,分别用于不同的连接和冗余。
技术图片

3.1.1 连接层

CLI( call level interface ):请求响应、创建session、缓冲区分配、信息打包

TDP( teradata director program ): 运行在客户端系统:session初始化终止、登陆、验证、恢复重起、现有人员传递至PE的 session 队列

MTDP( micro TDP ):与TDP的区别是不负责session在PE间分配。

MOSI( micro operating system interface ):实现不同数据库平台上运行的隔离层

3.1.2 PE层(parsing engine)

3.1.3 MPL层(message passing layer)

MPL 层负责 PE 与 AMP之间传送信息、合成的返回结果集传 PE,由 PDE 与 Bynet 软硬件组成

PDE (parallel database extension):

bynet软件、硬件:

3.1.4 AMP层

AMP(access module process)

AMP功能:

3.1.5 VDisk层

存储数据根据哈希算法被均匀分散存储到磁盘阵列中的不同的磁盘上。RAID0 与 RAID5 为主。因采用混合均匀存储而不存在数据库重组问题。

3.2 Teradata的并行处理能力

查询并行:每个AMP作为一个虚拟进程,独立处理一部分数据(如查询一个表)

步内并行:每个运算步骤都由多个进程并行处理(如借助于pipline的 join操作)

多步并行:优化器分解sql请求原则是尽可能使各步独立(如两个表的查询同时进行)

传统 OLTP 对于提出的新的问题,DBA 会建立一条新的索引,可能使数据库占用磁盘空间过大。而 teradata 采用将相同执行步骤的执行结果暂存于系统缓冲区的方法, 减少数据库本身的大小。

teradata 提供的并行 OLAP 操作有:排序、累计、移动平均、移动和、移动养分、采样、分位、限定

3.3 Teradata做的优化

3.3.1 大数据量与小数据量访问矛盾

teradata 在解决 hash 函数范围查询需要访问所有数据的问题时引入用户索引(分区主索引PPI),将数据按索引进行分区
技术图片

3.3.2用户管理

引入角色来分配权限

引入用户参数为用户配置持久空间(分配的最大存储容量)、spool空间(存放中间过程与最后结果 )、临时空间(存放global temporary table被实例化的数据)限制、缺省数据库设定、用户密码设定

3.3.3 索引

AMP分组:对一个操作只使用部分amp单元进行处理,提高数据吞吐量

利用稀疏索引来去除大量空值索引

3.3.4 加速处理

3.3.5 索引

3.3.6 锁机制

4 Presto数据库

presto是facebook为了改进之前基于map-reduce的hive框架查询数据仓库时间过长而开发的数据分析工具。Presto本身不是数据库,而是分布式查询引擎。Presto可以访问HDFS,及其他数据源,数据库。但不能处理在线事务。

Presto被设计为数据仓库和数据分析产品:数据分析、大规模数据聚集和生成报表。这些工作经常通常被认为是线上分析处理操作 。

4.1 Presto架构:

 

技术图片

采用 master - slave 模型:

4.2 Presto数据模式

存储单元包括 page,block:

page:多行数据集合,包含多列,但只提供逻辑行,实际以列存储

block:一列数据

  1. array类型 int 、long、double

    • valueisnull[] 一行是否有值
    • value[] 一行具体值
  2. 可变宽 string

    • slice 所有行拼接的字符串
    • offset 每一行的偏移位置
    • valueisnull[] 某行是否有值
  3. 固定宽string

  4. 字典(distinct值较少)

    • 任意类型
    • ids[] 每一行数据对应字典中编号

4.3 Presto查询

技术图片

**sql 查询:**http POST 请求

**抽象语法树:**以 query 为单位,分层表示子查询

**逻辑计划:**将抽象语法树转为最简单操作

优化器:

**调度器:**以exchange节点划分的段为单位进行调度

物理执行计划:

4.4 Presto内存管理

内存池:

为了防止大任务分配到每台机器后一部分(在该机器是最大内存的任务)在reserve pool执行完成,另一部分(在该机器不是最大内存任务)在general pool等待执行,造成死锁,presto将最大query分配给reserve pool的任务交给coordinator去做(虽然这会造成一部分不执行这个query的机器reserve pool 浪费),而不是让每台机器把最大query任务在reserve pool执行。

cordinator计算query的每个task的内存大小,同时有一个线程定期轮训每台机器内存状态,汇总query内存与机器内存后, coordinator会挑选出一个内存使用最大的query,分配给Reserved Pool。

4.5 Presto实现低延时查询的原理

  1. 传统 sql 优化

  2. 完全基于内存的并行计算

    • 源数据的并行读取:每个 Source节点 调用 HDFS InputSplit API , 然后每个InputSplit分配一个Worker节点去执行
    • 分布式hash聚合:partial任务的结果按group by的hash值分配不同计算节点
  3. 流水线

     
    • 每个worker从优先级队列中取 PrioritizedSplitRunner 对象,周期检查完成情况并删除完成的任务,未完成的放回队列
    • 每个节点的exchange操作为每个向上一个Stage的Worker节点拉数据,数据的最小单位是一个Page对象,取到数据后放入Pages队列中
    • 任务执行时每个operator从上一个operator取page,数据存在则执行(page是由列存储的block组成的几行数据)
  4. 本地化计算

    • 优先选择数据在的位置节点作为worker
  5. 动态编译执行计划(如循环展开优化): 使用Google Guava提供的LoadingCache缓存生成的Byte Code。

  6. 小心使用内存和数据结构

    使用Slice进行内存操作,Slice使用Unsafe#copyMemory实现了高效的内存拷贝,

  7. 类BlinkDB的近似查询

    为了加快avg、count distinct、percentile等聚合函数的查询速度, 引入了一些近似查询函数approx_avg、approx_distinct、approx_percentile。approx_distinct使用HyperLogLog Counting算法实现。

    • HyperLogLog 算法:key值hash转为64位bit,取低6位作为实验轮数(桶号),取60位中第一个出现1的位置的序号,转为2进制bit,存入桶中。统计每个桶中最大的序号,由下公式得到元素的部数量技术图片
  8. GC控制

    Presto团队在使用hotspot java7时发现了一个JIT的BUG,当代码缓存快要达到上限时,JIT可能会停止工作,从而无法将使用频率高的代码动态编译为native代码。
    Presto团队使用了一个比较Hack的方法去解决这个问题,增加一个线程在代码缓存达到70%以上时进行显式GC,使得已经加载的Class从perm中移除,避免JIT无法正常工作的BUG。
    Presto TPCH benchmark测试

5 ClickHouse数据库

5.1 ClickHouse 架构

5.1.1 clickHouse 存储架构

技术图片

5.1.2 ClickHouse部署

5.2 ClickHouse数据库系统特点

5.3 ClickHouse运行快的原因

  1. 它的数据剪枝能力比较强,分区剪枝在执行层,而存储格式用局部数据表示,就可以更细粒度地做一些数据的剪枝。它的引擎在实际使用中应用了一种现在比较流行的 LSM 方式。

  2. 它对整个资源的垂直整合能力做得比较好,并发 MPP+ SMP 这种执行方式可以很充分地利用机器的集成资源。它的实现又做了很多性能相关的优化,它的一个简单的汇聚操作有很多不同的版本,会根据不同 Key 的组合方式有不同的实现。对于高级的计算指令,数据解压时,它也有少量使用。

  3. ClickHouse 是一套完全由 C++ 模板 Code 写出来的实现

  4. 不支持Transaction

  5. 使用了矢量化查询执行

    • 当进行查询时,操作被转发到数组上,而不是在特定的值上
    • 向量化查询执行实用性并不那么高,如果临时数据并不适合L2缓存,读缓存将有问题。但是向量化查询执行更容易利用CPU的SIMD能力。
  6. 提供了有限的运行时动态代码生成(group by的内部循环第一阶段)。

    • 运行时代码生成可以更好地将多个操作融合在一起,从而充分利用 CPU 执行单元和流水线。矢量化查询执行不是特别实用,因为它涉及必须写到缓存并读回的临时向量。如果 L2 缓存容纳不下临时数据,那么这将成为一个问题。但矢量化查询执行更容易利用 CPU 的 SIMD 功能。

6 OLAP相关知识

6.1 OLTP与OLAP

**联机事务处理( OLTP)**由业务数据库所支持,数据固定,操作负载少,强调数据库一致性与可恢复性。

**在线分析处理(OLAP )**由数据仓库支持,反应历史数据、多来源数据,通常多维建模,典型的OLAP操作有:上钻(聚合)、下钻(展开)、切割(选择和投影)、轴转(多维视图)。

OLAP的查询问题有不确定性。

OLAP数据库最关键的两个因素是:并行处理与可扩展性

ROLAP(关系型OLAP):在标准的或扩展的关系DBMS 上,支持扩展SQL和特殊访问

MOLAP(多维OLAP ):直接把多维数据存储在特定的数据结构

6.2 OLAP场景的关键特征

7 数据库技术中常见名词与技术

7.1 数据共享的方式

shared everything(SMP):网络与磁盘是瓶颈(SQLServer)

shared disk(NUMA): 存储器接口达到饱和的时候,增加节点并不能获得更高的性能 (Oracle Rac)

shared nothing(MPP): 各自处理自己的数据,可扩展,成本低

7.2 MPP大规模并行处理架构

● 任务并行执行;

● 数据分布式存储(本地化);

● 分布式计算;

● 私有资源;

● 横向扩展;

● Shared Nothing架构。

7.2 MPPDB特征

(1)无master 高平结构
技术图片

(2)可处理 PB 级数据,采用 hash 分布、random 策略存储,采用先进压缩算法

(3)高扩展,支持集群扩容缩容

(4)高并发:读写不互斥,可边加载边查询

(5)行列混合存储

7.3 列存储技术(达梦商用数据库为例)

数据组织实现:

不同于普通段、簇、页管理,采用HTS(huge tablespace)相当于文件系统。

HTS -> SCH模式目录 -> TAB表目录 -> COL列(.dta文件,默认64M)-> 区(存储行数在一开始就指定,开始位置4k对齐)

辅助表:管理HTS中数据,每条记录对应一个区,查询在辅助表进行

智能索引:

一定程度上可以替代BTree索引,最大最小值可起到过滤作用

自适应压缩:

自适应的步骤:

  1. 如果该列为自增列或序列,则直接使用序列编码;
  2. 获得区数据统计信息:不同值个数n_dist、每个不同值个数、不同值数据指针、每个值连续出现的次数、整型数的最大值;
  3. 根据获得的区统计信息,确定使用常量编码、RLE编码还是字典编码;这三种编码的使用顺序为:优先使用常量编码,其次使用RLE编码,最后才使用字典编码。
  4. 如果编码后的总长度超过了原始长度,则不编码,直接返回;

7.4 RAID方案

以 RAID1 与 RAID5 最常见

JBOD磁盘直接串连
JBOD 磁盘直接串连而成的磁盘柜
RAID0 无冗余分布存储
RAID1 镜像冗余
RAID2 海明码校验,4个磁盘存数据分布存储,3个磁盘校验,实际很少用
RAID3 至少三数据盘分布存储(按位分布或按字节分布),一磁盘校验,适用于大容量分散顺序访问。RAID3在有坏盘时性能下降,常由RAID5代替
RAID4 同RAID3,但按块分布,读性能好,写性能差,实际少见
RAID5 同RAID4,校验数据分布在各磁盘,不存在RAID4的写瓶颈,目前最佳方案
RAID6 上面只保护单个磁盘失效,RAID6为双重校验(可在两个磁盘用两种算法存不同的校验数据),写性能差
RAID00 双重RAID0
RAID01 先镜像1再条带化0,保证数据安全性的同时又提高了性能
RAID10 先条带化0再镜像1,保证数据安全性的同时又提高了性能
RAID30/50/60 提高性能
RAID7 一套事件驱动的操作系统,采用非同步访问减轻写瓶颈提高IO,自动读写优化
RAID-DP 采用NVRAM存储写数据,掉电也不丢失,集中写,采用RAID6,性能比RAID4下降小于2%,固件实时更新时也不中断
RAID5E 提供冗余盘,在一块磁盘损坏时自动降级至RAID5,时间较长

7.5 LSM-Tree (long structured merge tree)

7.6 kafka 并行框架

7.6.1 kafka 架构

技术图片

Topic 和 Partition

在 Kafka 中的每一条消息都有一个 Topic,Kafka 为每个topic维护了分布式的分区(Partition)日志文件, 发布到此 Partition 的消息都会被追加到 Log 文件的尾部,由offset数组记录消息位置。保证partition下消息有序,但topic下消息非有序

消费模型

Kafka 采取拉取模型(Poll),由自己控制消费速度,防止基于推送(push)因消费进程挂掉或网络不好导致的消息丢失

网络模型
技术图片

7.6.2 kafka 高可靠分布式存储模型

依靠的是副本机制,就算机器宕机也不会数据丢失。

Producer 向 Leader 发送数据时,可以通过 request.required.acks 参数来设置数据可靠性的级别:

? 1:默认选项,producer收到一次确认即完成。

? 0:无需确认

? -1:ISR 中的所有 Follower 都确认接收到数据后才算一次发送完成,可靠性最高。

(ISR = Leader + 较新副本)ISR可用于替代leader

AR(Assigned Replicas) = ISR + 老副本

确认模式request .required .acks描述特点
al-least-once 1 Producer 收到来自 Ack 的确认,则表示该消息已经写入到 Kafka 了 Producer 超时或收到错误,重试发送消息,可能导致消息写入两次
at-most-once 0 发送后无需确认  
exactly-once -1 保证消息最多一次地传递给 Consumer kafka实现:每个producer向特定topic的特定partition维护一个序号,每次broker收到消息都要求producer序号比自己的大1

Kafka 中事务实现 exactly-once 语义。

7.5.3 高性能的日志存储

 

 

转自:https://blog.csdn.net/qq_37517281/article/details/105466829

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!