专栏首页数据社一文了解GreenPlum

一文了解GreenPlum

一、数据存储方式

关于数据库的数据存储方式一般分为行存储和列存储。

行式数据库是按照行存储的,行存储就是各行放入连续的物理位置,就行我们平时写字一样,一行一行的写,读取的时候也是一行一行的读取。像SQL server,Oracle,mysql等传统的关系型数据库都属于行式数据库范畴。

列式数据库是按照列存储的,列存储是把多行数据的每一列按照列存储在磁盘,就像一把数据写入excel表格中,每次按照列读取数据,像Vertica,GreenPlum,HBase(HBase其实不是真正的列式数据库,是按照列簇存储的)。

二、GreenPlum架构

massively parallel processing 简称MPP,即无共享、大规模并行处理。

MPP架构有如下特点: Share Nothing节点之间数据不共享,只有通过网络连接实现的协同,每个节点有独立的存储和内存。 数据根据某种规则(如Hash)散布到各个节点 计算任务也是会发布到各个节点并行执行,最后再将结果聚合到整体返回 用户使用时会看做整体

Greenplum 数据库软件将数据平均分布到系统的所有节点服务器上,所以节点存储每张表或表分区的部分行,所有数据加载和查询都是自动在各个节点服务器上并行运行,并且该架构支持扩展到上万个节点。

三、GreenPlum权限体系管理

我们前面已经说了,GPDB是一个数据库,数据库都有什么特性呢?都能做什么呢?熟悉MySQL,Oracle的同学可能就比较清楚关系型数据库的管理,下面我们就来说下GPDB的一些管理和常用操作。

数据库常用操作分为:创建数据库、创建schema、创建资源池、创建角色、创建用户、创建表。下面我们一一来说下GPDB这些常用操作,和关系型数据库MYSQL有什么不同呢?

  • 创建数据库
gp_sydb=# CREATE DATABASE GPTEST;
CREATE DATABASE

你也可以通过 createdb 创建数据库

 [gpadmin@mpp01 ~]$ createdb -h mpp01 -p 5432 GPTEST 

查看创建的数据库

gp_sydb=# \l
                  List of databases
   Name    |  Owner  | Encoding |  Access privileges  
-----------+---------+----------+---------------------
 GPTEST    | gpadmin | UTF8     | 
 gp_sydb   | gpadmin | UTF8     | 
 postgres  | gpadmin | UTF8     | 
 template0 | gpadmin | UTF8     | =c/gpadmin          
                                : gpadmin=CTc/gpadmin
 template1 | gpadmin | UTF8     | =c/gpadmin          
                                : gpadmin=CTc/gpadmin
(5 rows)
  • 删除数据库
gp_sydb=# DROP DATABASE GPTEST;
DROP DATABASE
  • 创建schema
GPTEST=# CREATE SCHEMA bdp;
CREATE SCHEMA

查看schema

GPTEST=# \dn
       List of schemas
        Name        |  Owner  
--------------------+---------
 bdp                | gpadmin
 gp_toolkit         | gpadmin
 information_schema | gpadmin
 pg_aoseg           | gpadmin
 pg_bitmapindex     | gpadmin
 pg_catalog         | gpadmin
 pg_toast           | gpadmin
 public             | gpadmin
(8 rows)

查看当前的schema

GPTEST=# SELECT current_schema();
 current_schema 
----------------
 public
(1 row)

可以看到当前schema是public,这是创建用户的时候,我们没有给它分配schema,那就是用默认的schema public。

把新建的schema赋给数据库gptest

gptest=# \dn
       List of schemas
        Name        |  Owner  
--------------------+---------
 bdp                | gpadmin
 gp_toolkit         | gpadmin
 information_schema | gpadmin
 pg_aoseg           | gpadmin
 pg_bitmapindex     | gpadmin
 pg_catalog         | gpadmin
 pg_toast           | gpadmin
 public             | gpadmin
(8 rows)

gptest=# ALTER DATABASE GPTEST SET search_path TO bdp,                                                                                                    public, pg_catalog;
ALTER DATABASE
gptest=# SELECT current_schema();
 current_schema 
----------------
 bdp
(1 row)

可以看到赋了新的schema。

  • 创建角色

创建角色,如果有很多用户对于一批表都有一样的权限,这时候可以创建一个角色,把这些权限先赋给角色,然后把角色赋权给各个用户。

gptest=# create role selectbdp;
CREATE ROLE
gptest=# \du
                                                                      List of roles
 Role name |                                                           Attributes                                                            | Member of 
-----------+---------------------------------------------------------------------------------------------------------------------------------+-----------
 bdp01     |                                                                                                                                 | {}
 gpadmin   | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table | {}
 selectbdp | Cannot login                                                                                                                    | {}

可以看到角色已经创建成功。 赋权角色。

gptest=# grant selectbdp to gpadmin;     
GRANT ROLE

角色其实就是一个用户组。

  • 创建用户
gptest=# create user bdp01 WITH PASSWORD 'passwd123';
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE

使用用户登录:

 psql -Ubdp01 -d gptest -w 'passwd123'

发现报错了……

[gpadmin@mpp01 gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123'
Password for user bdp01: 
psql: FATAL:  no pg_hba.conf entry for host "[local]", user "bdp01", database "gptest", SSL off

GPDB登录需要在pg_hba.conf文件中添加信任的用户。

local    all         bdp01      trust

添加后,使配置文件生效,再次登录就可以了。

[gpadmin@mpp01 gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123'
psql: warning: extra command-line argument "passwd123" ignored
psql (8.3.23)
Type "help" for help.
  • 创建资源队列

为什么要创建资源队列呢?我们知道一个数据库肯定不是给一个用户使用的,通常是有ETL用户,进行数据加载,数据清洗。还有WEB端用户进行查询,还有个人用户进行开发查询使用等等。这么多用户,如果不进行资源队列管控,那么就会出现资源争抢现象,影响线上应用功能。比如一个新手开发人员写了一个比较菜的查询语句,占用了大量资源,此时数据库的其他查询用户都需要排队等待了。再比如加载数据是需要使用大量资源,那么也会影响查询性能,以上你会发现,你需要把不同类型的操作进行资源隔离,这就是为什么要有资源队列了。

查看已有的资源队列:

gptest=> SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status
gptest-> WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;
  rolname  |  rsqname   
-----------+------------
 bdp01     | pg_default
 selectbdp | pg_default
 gpadmin   | pg_default
(3 rows)

创建一个新的资源队列

gptest=#  create resource queue load_queue with (active_statements=3,MEMORY_LIMIT='1024MB',PRIORITY=LOW);                                                 
CREATE QUEUE

把创建的资源队列赋权给刚才创建的用户bdp01

gptest=#  ALTER USER bdp01  resource queue load_queue;                                              
ALTER ROLE

再次查询资源池分配情况

gptest=# SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status                                                                             WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;
  rolname  |  rsqname   
-----------+------------
 bdp01     | load_queue
 selectbdp | pg_default
 gpadmin   | pg_default
(3 rows)

可以看到bpd01已经使用了新的资源池了。

四、GreenPlum分区表

分区是把一张大表按照适合的维度进行分割,通过表的继承,规则,约束实现。并不是每个表都适合分区,只有很大的表才适合分区,因为分区多了会增加表的元数据信息,特别是多级分区。

如果一个表被按照日和城市划分并且有1000个日以及1000个城市,那么分区的总数就是一百万。列存表会把每一列存在一个物理表中,因此如果这个表有100个列,系统就需要为该表管理一亿个文件。一方面Linux的iNode可能不会有这么大,就会出现文件查询报错等,分区过多了,对于数据库停止和恢复也会造成很大影响的。所以建立分区表的时候,对分区进行自动的创建和删除,以保障合适的数据周期很重要。

五、GreenPlum分布键

在MPP架构中,一个查询是需要从所有segment获取数据然后在master汇总得到结果的。那么这样,影响查询性能的就有两个问题,查询最慢的segment和网络带宽。分布键就是为了解决第一个问题,让数据尽可能均匀的分布在每个segment上,从而避免数据倾斜导致的查询效率问题。第二个网络问题,MPP数据集群搭建要求集群内部为万兆网连接,并且机器配置一样,从而避免影响。

所以分布键一般选择主键,比如手机号等。尽量让数据在集群各个节点分布均匀,提高查询效率。

本文分享自微信公众号 - 数据社(DataClub),作者:数据社

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于数据库,程序员应该了解的那些事

    对于很多程序员来说,公司选择什么样的数据库,基本不需要你来决定。当你加入一个公司的时候,公司的大部分技术选型已经确认,特别是数据库选型,因为数据库一旦选择,后期...

    WindyQin
  • 聊聊数据库

    众所周知,文明的发展离不开信息的积累,而任何东西的积累离不开存储。因此,信息存储是文明发展的重要环节,从某种意义上讲,甚至可以说是人类迈入文明社会的标志之一。在...

    WindyQin
  • 数据分析师应该了解的数据仓库-数据仓库vs数据库

    说到数据库,我们一般是指传统的关系型数据库,也就是“联机事务处理”(OLTP),主要用户在线交易处理。比如银行业务、电信业务之前很多都是Oracle或者DB2(...

    WindyQin
  • WebLogic反序列化漏洞(CVE-2018-2628)安全处置建议V3.0

    北京时间4月18日凌晨,Oracle官方发布了4月份的关键补丁更新CPU(Critical Patch Update),其中包含一个高危的远程代码执行漏洞(CV...

    绿盟科技安全情报
  • xlsx的OutOfMemoryError

    将数据读入或者导出到xlsx文件的时候,常常需要循环写出, 如 res <- read.xlsx("edgeR_DEgenes.xlsx",1) writ...

    生信编程日常
  • python笔记:生成器表达式,简单查找

    超级大猪
  • Python常见问题 - 使用openpyxl模块时出现错误: zipfile.BadZipFile: File is not a zip file

    xlsx不能正常打开了,可以尝试在pycharm中双击data.xlsx,会发现无法正常打开xlsx文件了

    小菠萝测试笔记
  • 镁客请讲 | 南大天域徐华:我们追求高速、安全、可靠的通讯技术

    今年,如果有科技领域热词评比的话,那么“芯片”这个词一定会跃居榜首入。伴随着中兴事件所引发的关于芯片的种种讨论,众多企业争相表示要做芯片,芯片似乎成为了一个抢手...

    镁客网
  • Folly库编译官方说的相关依赖开始编译

    扫帚的影子
  • RxJava这么好用却容易内存泄漏?解决办法是...

    熟悉RxJava的同学,当我们开启一个异步任务时,通常需要在Activity/Fragment销毁时,及时关闭异步任务,否则就会有内存泄漏的。

    CCCruch

扫码关注云+社区

领取腾讯云代金券