一、Greenplum数据库是业界快高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。
GreenPlum作为大数据融合存储平台中众多数据库之一,与其他数据库系统和文件系统一起,为OceanMind提供完整的OceanStorage大数据融合存储解决方案。
GreenPlum的特点:
1) 完善的标准:GreenPlum数据库支持ANSI SQL 2008和SQL OLAP 2003扩展;支持ODBC和JDBC应用编程接口。完善的标准支持使得系统开发、维护和管理都大为方便。(而现在的 NoSQL和Hadoop 对 SQL 的支持都不完善,不同的系统需要单独开发和管理,且移植性不好。)
2) 数据的强一致性:GreenPlum数据库支持分布式事务,支持ACID,保证数据库中数据的强一致性。
3)良好的线性扩展能力:GreenPlum数据库采用MPP架构,其基本特征是有多台SMP(Symmetric Multi-Processor,对称多处理器)服务器通过节点互联网络连接而成,是一种Share Nothing(完全无共享)结构,因而扩展能力强,理论上可以无限扩展。目前的技术可以实现512个节点互联,包含数千个CPU。
五、Greenplum特点 借助MPP,Greenplum在大型数据集上执行复杂SQL分析的速度比很多解决方案都要快。Greenplum也带来了其它开源方案中没有的数据管理质量特性、升级和扩展能力。同时Greenplum也降低了大规模实时数据分析的门槛,相比于 Map-Reduce,SQL语法简单,功能强大,易上手,使用和开发成本低,易于对接其他第三方数据分析工具。
标准SQL接口,比MapReduce接入更方便 完整的分布式事务能力,确保强数据一致性 近乎线性的在线扩展能力 高并发数据加载技术 高灵活的行、列以及混合存储及压缩技术 高可用技术方案 支持多方式的授权管理及审计,表级别粒度
丰富的生态系统,便捷对接hadoop等
GreenPlum数据库 VS传统数据库
使用传统数据库时,我们经常会通过分库分表的方式将数据打散到多个数据库实例中。
其缺点在于可能会出现不平均的情况:数据在后端被打散成许多数据分片,但是有些分片的数据量很大,热度很高,有些分片相对来说热度较低。
当进行数据统计或分析时,一部分用户数据处理速度慢,一部分用户数据处理速度快,使得许多用户的体验下降。
在GreenPlum数据库中、我们怎么做的呢
GreenPlum数据库采用分而治之的方法,将数据非常均衡的分布在所有节点上。而且当服务器数量不够或者计算能力不够的时候,可以在线横向扩展,此时数据库会重新做二次分片,也就是表数据需要重新分布,在保证强大处理能力的同时也时刻保持用户性能的均衡,提升用户体验。
GreenPlum 适用场景?
GreenPlum 虽然是关系型数据库产品,它的特点主要就是查询速度快,数据装载速度快,批量DML处理快。而且性能可以随着硬件的添加,呈线性增加,拥有非常良好的可扩展性。因此,它主要适用于面向分析的应用。比如构建企业级ODS/EDW,或者数据集市等等。
GreenPlum 主要特性:
大规模并行处理架构
高性能加载,使用 MPP 技术,提供 Petabyte 级别数据量的加载性能
大数据工作流查询优化
多态数据存储和执行
基于 Apache MADLib 的机器学习功能
GreenPlum数据库采用典型的Shared Nothing架构(MPP),每个节点只访问自己的本地资源(内存、存储等),节点之间的信息交互都是通过节点高速互联网络实现,这个过程一般称为数据重分配。GreenPlum数据库采用了MPP架构,其主要的优点是大规模的并行处理能力。
1) 大规模存储。GreenPlum数据库通过将数据规律地分布到多个节点上来实现大规模数据的存储,支持50PB级海量数据的存储和处理。
3.1 大规模数据存储 (1)Greenplum数据库通过将数据分布到多个节点上来实现规模数据的存储。数据库的瓶颈经常发生在I/O方面,数据库的诸多性能问题终总能归罪到I/O身上,久而久之,IO瓶颈成为了数据库性能的永恒的话题。
(2)Greenplum采用分而治之的办法,将数据规律的分布到节点上,充分利用Segment主机的IO能力,以此让系统达到大的IO能力(主要是带宽)。
(3)在Greenplum中每个表都是分布在所有节点上的。Master节点首先通过对表的某个或多个列进行hash运算,然后根据hash结果将表的数据分布到Segment节点中。整个过程中Master节点不存放任何用户数据,只是对客户端进行访问控制和存储表分布逻辑的元数据。
Greenplum提供称为“多态存储”的灵活存储方式。多态存储可以根据数据热度或者访问模式的不同而使用不同的存储方式。一张表的不同数据可以使用不同的物理存储方式。支持的存储方式包含:
行存储:行存储是传统数据库常用的存储方式,特点是访问比较快,多列更新比较容易。
列存储:列存储按列保存,不同列的数据存储在不同的地方(通常是不同文件中)。适合一次只访问宽表中某几个字段的情况。列存储的另外一个优势是压缩比高。
外部表:数据保存在其他系统中例如HDFS,数据库只保留元数据信息。
2) 并行处理。GreenPlum数据库通过外部表并行装载、并行备份恢复与并行查询处理实现强大的并行处理。
3.2 并行查询计划和执行
下图为一个简单SQL语句,从两张表中找到2008年的销售数据。图中右边是这个SQL的查询计划。从生成的查询计划树中看到有三种不同的颜色,颜色相同表示做同一件事情,我们称之为分片/切片(Slice)。下层的橙色切片中有一个重分发节点,这个节点将本节点的数据重新分发到其他节点上。中间绿色切片表示分布式数据关联(HashJoin)。上面切片负责将各个数据节点收到的数据进行汇总。
然后看看这个查询计划的执行。主节点(Master)上的调度器(QD)会下发查询任务到每个数据节点,数据节点收到任务后(查询计划树),创建工作进程(QE)执行任务。如果需要跨节点数据交换(例如上面的HashJoin),则数据节点上会创建多个工作进程协调执行任务。不同节点上执行同一任务(查询计划中的切片)的进程组成一个团伙(Gang)。数据从下往上流动,终Master返回给客户端
3.3 并行数据加载
(1)并行加载技术充分利用分布式计算和分布式存储的优势,保证发挥出每一块Disk的I/O资源
(2)并行加载比串行加载,速度提高40-50倍以上,减少ETL窗口时间
(3)增加Segment和ETL Server,并行加载速度呈线性增长
三、Greenplum架构: GreenPlum数据库是典型的Master/Slave架构。
如下图所示,在Greenplum集群中,存在一个Master节点和多个Segment节点。
Master实例是GreenPlum数据库服务端,服务端通过端口监听客户端连接。
Segment由Master分配,管理一部分数据存储进程,每个Segment都采用独立端口监听。
Master实例协调所有数据库实例,分布式请求Segment并且合并从Segment返回的结果。
Greenplum数据库是由Master Server、Segment Server和Interconnect三部分组成,Master Server和Segment Server的互联使用过Interconnect。 Greenplum是一个关系型数据库,是由数个独立的数据服务组合成的逻辑数据库。与oracle RAC的shared-Everything架构不同,greenplum采用shared-Nothing架构,整个集群由多个数据节点(Segment Host)和控制节点(Master Host)组成。在典型的shared-Nothing中,每个节点上所有的资源的cpu、内存、磁盘都是独立的,每个节点都只有全部数据的一部分,也只能使用本节点的数据资源。在Greenplum中,需要存储的数据在进入到数据时,将先进行数据分布的处理工作,将一个表中的数据平均分布到每个节点上,并为每个表指定一个分布列(distribute column),之后便根据hash来分布数据,基于shared-Nothing的原则,Greenplum这样处理可以充分发挥每个节点处IO的处理能力。
Master 节点:是整个系统的控制中心和对外的服务接入点,它负责接收用户SQL请求,将SQL生成查询计划并进行并行处理优化,然后将查询计划分配到所有的Segment节点并进行处理,协调组织各个Segment节点按照查询计划一步一步地进行并行处理,后获取到Segment的计算结果,再返回给客户端。从用户的角度看Greenplum集群,看到的只是Master节点,无需关心集群内部的机制,所有的并行处理都是在Master控制下自动完成的。Master节点一般只有一个或二个。
Segment节点: 是Greenplum执行并行任务的并行计算节点,它接收Master的指令进行MPP并行计算,因此所有Segment节点的计算性总和就是整个集群的性能,通过增加Segment节点,可以线性化得增加集群的处理性能和存储容量,Segment节点可以是1~10000个节点。
Interconnect: 是Master节点与Segment节点、Segment节点与Segment节点之间进行数据传输的组件,它基于千兆交换机或者万兆交换机实现数据再节点之间的高速传输。外部数据在家到Segment时,采用并行数据流进行加载,直接加载到Segment节点,这项独特的技术是Greenplum的专有技术,保证数据在短时间内加载到数据库中。
四、应用生态
GREENPLUM适用场景?
GREENPLUM虽然是关系型数据库产品,它的特点主要就是查询速度快,数据装载速度快,批量DML处理快。而且性能可以随着硬件的添加,呈线性增加,拥有非常良好的可扩展性。因此,它主要适用于面向分析的应用。比如构建企业级ODS/EDW,或者数据集市等等。
七、常用指令:1.取端口号:select * from gp_segment_configuration 2.select * from pg_stat_activity 该表能查看到当前数据库连接的IP 地址,用户名,提交的查询等。3.select pg_size_pretty(pg_relation_size('schema.tablename'));查看数据库占用空间4.select pg_size_pretty(pg_database_size('databasename));查看表占用空间5.Vacuum analyze tablename 回收垃圾和收集统计信息6.Select gp_segment_id,count(*) from tablename group by 1 ;查看数据分布情况7.gp_segment_configuration实例恢复8.8.SELECT locktype, database, c.relname, l.relation, l.transactionid, l.transaction, l.pid, l.mode, l.granted, a.current_query FROM pg_locks l, pg_class c, pg_stat_activity a WHERE l.relation=c.oid AND l.pid=a.procpid ORDER BY c.relname;主要字段说明:relname: 表名
locktype、mode 标识了锁的类型
九、表分布Hash分布:create table ... Distributed by(column1,column2...);同样数值的内容被分配到同一个segmment(如没有明确定义分布键,系统会把个字段作为分布键)循环分布:create table ... Distributed randomly;
十、表相关:1.创建表:CREATA TABLE 表名 DISTRIBUTED BY(表分布键); --指定分布键 CREATA TABLE 表名 DISTRIBUTED RANDOMLY --默认表的列作为分布键 【注:分布键设置类型不能为几何数据类型或用户自定义数据类型】
2.表和列的约束:check 表或列的约束 NOT NULL 列约束 UNIQUE 列约束【注:每表只能一个,被UNIQUE定义列会作为表分布键,如果表设置了主键则不允许有UNIQUE约束】 PRIMATY KEY 表约束
3.外部表:创建:CREATE EXTERNAL [WEB] TABLE 删除:DROPEXTERNAL [WEB] TABLE
4.表的存储模式: 存储模式:堆存储、只追加(AO)、行存储、列存储、压缩表(只可以是AO表) 创建堆表:CREATE TABLE 表名(a int ,b text) DISTRIBUTED BY (列名); 只追加表:CREATE TABLE 表名(a int ,b text) WITH(appendonly = true); 列存表:CREAT TABLE 表名(a int,b text) WITH(appendonly=true,orientation=列名) DISTRIBUTED BY(列名);没有指定orientation的为行存表 压缩表:CREATE TABLE 表名(a int,b text) WITH(appendonly=true,compresstype=zilb,compresslevel=5); --创建一张5级ZLIB压缩的AO表
5.删除表 DDROP TABLE 表名; DELETE FROM 表名; --不删除表但清空表中记录 TRUNCATE 表名 --不删除表单清空表中记录
6.表的分区策略(调优):以下因素大部分答案为也是,可通过分区策略提高查询性能 决定因素:(1)表是否足够大?(百万级或以上条记录)、 (2)对目前性能不满意? (3)查询条件是否能匹配分区条件?(检查查询语句的where条件是否与考虑分区的column一致) (4)数据仓库是否需要滚动历史数据?(可按照记录日期分区) (5)按照某个规则数据是否可被均匀分拆? 创建分区表:通过使用start、end值、every子句定义分区增量实现自动产生分区 【注:start值总是被包含而end值总是被排除】 Eg:CREATE TABLE 表名(列1,列2......) DISTRIBUTED BY(列名) PARTITION BY RANGE(分区键) (START(分区键值1)INCLUSIVE END(分区键值2)EXCLUSIVE EVERY(INTERVAL ‘增量值’)); 每个分区单独指定名称: 【注:每个分区范围是连续的则不需为每个分区指定END值】 Eg:CREATE TABLE 表名(列1,列2......) DISTRIBUTED BY(列名) PARTITION BY RANGE(分区键) (PARTITION 分区1名 START(分区键值1)INCLUSIVE, PARTITION 分区2名 START(分区键值2)INCLUSIVE, PARTITION 分区3名 START(分区键值3)INCLUSIVE, ...... END(分区键值n)EXCLUSIVE); 分区表限制:主键或约束必须包含表上所有分区键。而索引可不包含分区键 查看分区设计:SELECT partitionboundary,partitionablename,partitionlevel,partitionrank FROM pg_partitions WHERE tablename=’表名’; 添加新分区:ALRER TABLE表名 ADD PARTITION START() INCLUSIVE END() EXCLUSIVE; 删除分区:ALTER TABLE 表名DROP PARTITION FOR(RANK(partitionrank)) RABK(partitiontank)指范围分区同意层级中的顺序 清空分区数据:ALTER TABLE 表名 TRUNCATE PARTITION FOR(RANK(partitionrank));
十一、视图和索引:CREATE VIEW CRREATE INDEXDROP VIEW DROP INDEX使用索引需考虑:1.查询工作负载:对于查询工作负载需返回大量数据的情况而言索引未必有效2.压缩表:对于压缩数据而言,索引访问方法是解压需要的记录而不是全部解压3.避免你在频繁更新列表上使用索引:会消耗大量写磁盘和CPU计算资源4.创建选择性B-tree索引:选择性指数=DISTINCT值数量/表记录数,即表中重复记录越多,建立B-tree索引越有用(DISTINCT值在100到100000之间佳,超100000之后不宜使用)5.低选择性列上使用位图索引6.索引列用于关联:或许可以改善join(关联)性能7.索引列经常用在查询条件中:对大表来说,查询语句where条件中常用到的列可考虑使用索引
创建索引:
1.创建B-tree索引:CREATE INDEX 索引名 ON 表名(索引键);
2.创建位图索引:CREATE INDEX 索引名ON 表名 USING bitmap(索引键);
更新记录:UPDATE 表名 SET 赋值表达式 WHERE 查询条件;删除记录:DELETE FROM 表名 WHERE 查询条件;————————————————本文来源:https://blog.csdn.net/qq_22473611/article/details/123927398