GreenPlum的学习心得和知识总结(三)|Greenplum数据库快速入门
目錄結構
注:提前言明 本文借鑒了以下博主、書籍或網站的內容,其列表如下:
1、GreenPlum中文官網首頁,點擊前往
2、GreenPlum git倉庫,點擊前往 或 本人GreenPlum gitee倉庫,點擊前往
3、PostgreSQL數據庫倉庫鏈接,點擊前往
4、YouTube greenplum視頻主頁,點擊前往
5、Bilibili greenplum視頻主頁,點擊前往
1、本文內容全部來源于開源社區 GitHub和以上博主的貢獻,本文也免費開源(可能會存在問題,評論區等待大佬們的指正)
2、本文目的:開源共享 拋磚引玉 一起學習
3、本文不提供任何資源 不存在任何交易 與任何組織和機構無關
4、大家可以根據需要自行 復制粘貼以及作為其他個人用途,但是不允許轉載 不允許商用 (寫作不易,還請見諒 💖)
Greenplum數據庫快速入門
- 文章快速說明索引
- 學習資料相關分享
- 打造內核開發環境
- gp數據庫快速入門
- gp數據庫的特性
- gp數據庫的組成
- gp常用操作演示
- gp安裝目錄說明
文章快速說明索引
學習目標:
開源、多云、并行的大數據平臺。Greenplum 是全球領先的大數據分析引擎,專為分析、機器學習和AI而打造!接下來一段時間,除了PostgreSQL數據庫的相關內容分享 也會把GreenPlum數據庫的學習心得及相關知識總結記錄下來!后面我可能會去gp工作,不管怎么說 gp都是非常值得一學和大力推廣!
學習內容:(詳見目錄)
1、Greenplum數據庫快速入門
學習時間:
2022年08月07日 11:18:01
學習產出:
1、PostgreSQL數據庫基礎知識回顧 1個
2、CSDN 技術博客 1篇
學習資料相關分享
這塊可以參見本人之前的博客:
- GreenPlum的學習心得和知識總結(一)|GreenPlum數據庫源碼編譯安裝及學習資料匯總,點擊前往
因為在下是做PostgreSQL數據庫內核開發的,這里只介紹一本書:
- 《Greenplum:從大數據戰略到實現》,點擊前往
打造內核開發環境
在上一篇,我們介紹了GreenPlum數據庫 內核開發 的環境配置,如下:
- GreenPlum的學習心得和知識總結(二)|打造Greenplum數據庫內核開發環境,點擊前往
接下來,我們將花一段時間來學習一下GreenPlum的基礎知識及相關背景,我們這里學習的資料來源:
- GreenPlum的學習心得和知識總結(一)|GreenPlum數據庫源碼編譯安裝及學習資料匯總,點擊前往
- 《Greenplum:從大數據戰略到實現》,點擊前往
- 姚老師的《Greenplum 分布式數據庫內核揭秘》
- Greenplum中文手冊,點擊前往
gp數據庫快速入門
我們這里主要看一下Greenplum數據庫的發展歷程和現狀,以及主要特性。關于如何安裝、部署Greenplum數據庫我們不再贅述!
Greenplum數據庫是基于MPP(Massively Parallel Processing)架構的開源大數據平臺,主要特性如下:
目前已為全球金融、電信、制造等行業的大量核心生產系統提供支撐。關于其適用場景:
-
Greenplum主要定位在OLAP領域,利用Greenplum MPP數據庫做大數據計算或分析平臺非常適合,例如:數據倉庫系統、ODS系統、ACRM系統、歷史數據管理系統、電信流量分析系統、移動信令分析系統、SANDBOX自助分析沙箱、數據集市等等
-
不擅長做OLTP交易系統,所謂交易系統,就是高頻的交易型小規模數據插入、修改、刪除,每次事務處理的數據量不大,但每秒鐘都會發生幾十次甚至幾百次以上交易型事務
2015年10月,Pivotal正式把投資超過10年的Greenplum產品開源,Greenplum因此成為世界上第一款成熟的開源MPP數據庫!
- Greenplum5.0是開源之后發布的第一個穩定版本,Greenplum5.x保持大約1.5個月一個版本的發布速度
- Greenplum6.0于2019年發布,包含許多重要特性。例如:Greenplum 6.0的內核升級到PostgreSQL 9.4.20,大幅提升HTAP(OLAP+ OLTP)性能,支持復制表(Replicated Table)、在線擴容(Online Expand)和一致性哈希(Jump Consistent Hash),支持磁盤配額配置(Disk Quota)、Zstandard壓縮算法、靈活數據分布、基于流復制的全新高可用機制等
- Greenplum主干分支開發非常活躍,眾多社區期待的特性穩健推進中,處于業界領先地位
目前Greenplum正在進行內核升級(pg12),gp7大概在明年發布:
gpadmin@gpadmin0:~/gpdbtest/bin$ ./psql -d postgres psql (12beta2) Type "help" for help.postgres=# select version();version ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------PostgreSQL 12beta2 (Greenplum Database 7.0.0-alpha.0+dev.15592.ge2b23ac456 build dev) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, 64-bit compiled on Aug 1 2022 18:22:31 (1 row)postgres=#Greenplum生態的日益完善得益于對SQL標準的支持,Greenplum可以與支持SQL標準的各種上下游產品實現集成,包括PgAdmin4、Informatica、Conf luent、HVR、Cognos、SAS、Talend、Qlik、Tableau、Anaconda、Microstrategy、Boundless、Zattset、Datometry等,涵蓋ETL、商業智能、高級分析、可視化、集成分析、GIS數據處理、遷移、安全和管理等各個領域。
gp數據庫的特性
此外為了要達到高性能,除了要有高效的并行處理架構,還要有查詢優化器生成最優的查詢計劃。隨著數據量的持續增加以及查詢越來越復雜,性能對查詢優化器的依賴也越來越強。Greenplum數據庫除了支持基于PostgreSQL的查詢優化器以外,還專門開發了一個新的查詢優化器ORCA。ORCA是一款自頂向下的基于Cascades框架的查詢優化器,目前已經成為企業版Greenplum數據庫的默認優化器。相比基于PostgreSQL的查詢優化器,ORCA查詢優化器能使某些查詢的性能提升10~1000倍
gpadmin@gpadmin0:~/gpdbtest/bin$ ./psql -d postgres psql (12beta2) Type "help" for help.postgres=# show optimizer;optimizer -----------on (1 row)postgres=# // src/backend/utils/misc/guc_gp.c{{"optimizer", PGC_USERSET, QUERY_TUNING_METHOD,gettext_noop("Enable GPORCA."),NULL},&optimizer, #ifdef USE_ORCAtrue, #elsefalse, #endifcheck_optimizer, NULL, NULL},高可用性。Greenplum提供 多級容錯機制 確保整個系統的高可用性。主節點Master通過Standby Master進行備份,每個數據節點Primary Segment分別配置一個Mirror Segment節點進行備份,同時確保同一組Primary Segment與Mirror Segment節點不在同一物理機,從而降低由于宕機而導致數據丟失的風險
通用性。Greenplum數據庫擁有完善的SQL標準支持,包括SQL92、SQL99、SQL2003,以及OLAP擴展,是對SQL標準支持最好的開源商用數據庫系統之一。同時,由于Greenplum數據庫基于PostgreSQL,因此繼承了PostgreSQL對于JDBC、ODBC、C、Python API等接口的支持。Greenplum數據庫的通用性確保了任何應用程序都可以方便地與之集成并進行數據訪問
多態存儲。Greenplum數據庫提供 多態存儲 的靈活存儲方式。用戶可以根據數據熱度或者訪問模式的不同而使用不同的存儲方式,以獲得更好的查詢性能。在Greenplum數據庫中,一張表的數據水平分割到各個節點。用戶可以為一張表按照一定規則(比如日期)創建分區表。一張表的各個子分區表可以使用不同的物理存儲方式。支持的存儲方式包括:
注:如上幾大特性,以后我們會逐一進行學習和分享 Greenplum數據庫是一個非常強大的數據庫,對其的學習不可能一蹴而就 我們后面會花上大量的時間和實踐來對其深入的學習,這里的學習是從一名內核開發人員的角度進行的 可能不太適合初學者和各位DBA們!
gp數據庫的組成
Greenplum基于PostgreSQL開發,面向數據倉庫應用的關系型MPP數據庫。Greenplum數據庫是典型的Master/Slave架構,一個Greenplum集群通常由一個Master節點、一個Standby Master節點以及多個Segment節點組成,節點之間通過高速網絡互連 如下圖所示:
如上:其高可用性可見一斑!
- Master是整個數據庫的入口,終端用戶連接Master執行查詢:(建立與客戶端的連接和管理;SQL的解析并形成執行計劃;向Segment分發執行計劃;收集Segment的執行結果;不存儲業務數據,只存儲數據字典)
- Standby Master為Master提供高可用(High Availability)支持
- Segment節點是工作節點(業務數據的存儲和存取;用戶查詢SQL的執行)
- Mirror Segment為Segment提供高可用支持
- 高速網絡Interconnect(Master-Segment、Segment-Segment的數據傳輸組件)這里想一想UDP協議,我們后面再細談
當Master節點接收到用戶發起的查詢語句SQL時,會對查詢語句進行查詢編譯、查詢優化等操作,生成并行查詢計劃,并分發到Segment節點執行。Segment執行完畢,會將數據發回Master節點,最終呈現給用戶!
gp常用操作演示
下面來看一個示例,進行實操一下!
postgres=# \d+ testTable "public.test"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+-----------------------------+-----------+----------+---------+---------+--------------+-------------id | integer | | not null | | plain | | curtime | timestamp without time zone | | | | plain | | Indexes:"test_pkey" PRIMARY KEY, btree (id) Distributed by: (id) Access method: heappostgres=# select gp_segment_id, * from test;gp_segment_id | id | curtime ---------------+----+--------- (0 rows)postgres=# insert into test select * from generate_series(1,10); INSERT 0 10 postgres=# select gp_segment_id, * from test limit 10;gp_segment_id | id | curtime ---------------+----+---------0 | 2 | 0 | 3 | 0 | 4 | 0 | 7 | 0 | 8 | 1 | 1 | 2 | 5 | 2 | 6 | 2 | 9 | 2 | 10 | (10 rows)postgres=#如上:創建表的DDL語句中的distributed by關鍵字需要特別注意,這個關鍵字指定了數據的分布方式,目的在于將數據平均分布到各個Segment。Greenplum支持兩種分布方式:哈希(Hash)分布和隨機(Random)分布。哈希分布是選擇一個或者多個列作為分布鍵,通過哈希函數決定該條記錄在插入時存儲到哪個Segment節點上。如果采用隨機分布,數據記錄會被隨機地分布到各個Segment節點上。如果選擇哈希分布,需要根據實際情況謹慎地選擇分布鍵,否則容易出現數據傾斜(Skew),導致查詢性能下降!
postgres=# create table test2 (id int) DISTRIBUTED RANDOMLY; CREATE TABLE postgres=# create table test3 (id int primary key) DISTRIBUTED RANDOMLY; ERROR: PRIMARY KEY and DISTRIBUTED RANDOMLY are incompatible postgres=# postgres=# \d+ test2Table "public.test2"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+-------------id | integer | | | | plain | | Distributed randomly Access method: heappostgres=# insert into test2 select * from generate_series(1,10); INSERT 0 10 postgres=# explain select gp_segment_id, * from test2;QUERY PLAN ------------------------------------------------------------------------------Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=8)-> Seq Scan on test2 (cost=0.00..431.00 rows=1 width=8)Optimizer: Pivotal Optimizer (GPORCA) (3 rows)postgres=# select gp_segment_id, * from test2;gp_segment_id | id ---------------+----0 | 10 | 30 | 80 | 101 | 51 | 72 | 22 | 42 | 62 | 9 (10 rows)postgres=#關于實現原理和內部技術是我們后面學習的內容,這里不再過多闡述!其支持的表類型,如下:
創建表的DDL語句還可以通過WITH子句定義表的存儲類型:
- APPENDONLY=TRUE指定創建一個append-optimized表(簡稱AO表),如果不加這個選項或者使用APPENDONLY=FALSE,創建的表就是堆表(heap表)
- ORIENTATION=COLUMN指定創建一個列存儲的表,列存儲的表只能是AO表
- COMPRESSTYPE指定表的壓縮類型,可選值有ZLIB、QUICKLZ、RLE_TYPE,或者不壓縮
- 只有append-optimized表可以被壓縮
- PARTITION BY選項可以定義在哪些列上對表數據進行分區
gp安裝目錄說明
gpadmin@gpadmin0:~/gpdbtest$ pwd /home/gpadmin/gpdbtest gpadmin@gpadmin0:~/gpdbtest$ gpadmin@gpadmin0:~/gpdbtest$ ls bin docs greenplum_path.sh include lib libexec sbin share gpadmin@gpadmin0:~/gpdbtest$bin目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls bin/ analyzedb dropdb gpcheckcat gpconfig_modules gpinitsystem gpmemreport gpreload gpssh-exkeys hostfile pg_basebackup pg_ctl pg_recvlogical pg_test_timing psql cluster.conf dropuser gpcheckcat_modules gpdeletesystem gpload gpmemwatcher gp_replica_check.py gpssh_modules initdb pgbench pg_dump pg_resetwal pg_upgrade reindexdb clusterdb ecpg gpcheckperf gpexpand gpload.bat gpmovemirrors gpscp gpstart lib pg_checksums pg_dumpall pg_restore pg_waldump stream createdb gpactivatestandby gpcheckresgroupimpl gpfdist gpload.py gppkg gpsd gpstate minirepro pg_config pg_isready pg_rewind postgres vacuumdb createuser gpaddmirrors gpconfig gpinitstandby gplogfilter gprecoverseg gpssh gpstop pg_archivecleanup pg_controldata pg_receivewal pg_test_fsync postmaster gpadmin@gpadmin0:~/gpdbtest$include目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls include/ ecpg_config.h ecpg_informix.h ecpgtype.h gppc.h libpq-events.h pg_config_ext.h pg_config_manual.h pgtypes_date.h pgtypes.h pgtypes_numeric.h postgres_ext.h sql3types.h sqlda-compat.h sqlda-native.h ecpgerrno.h ecpglib.h gppc_config.h libpq libpq-fe.h pg_config.h pg_config_os.h pgtypes_error.h pgtypes_interval.h pgtypes_timestamp.h postgresql sqlca.h sqlda.h gpadmin@gpadmin0:~/gpdbtest$ ls include/postgresql/ informix internal server gpadmin@gpadmin0:~/gpdbtest$lib目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls lib libecpg.a libecpg_compat.so libecpg_compat.so.3.12 libecpg.so.7 libgppc.a libgppc.so.1 libpgcommon.a libpgfeutils.a libpgport_shlib.a libpgtypes.so libpgtypes.so.3.12 libpq.so libpq.so.5.12 postgresql libecpg_compat.a libecpg_compat.so.3 libecpg.so libecpg.so.7.12 libgppc.so libgppc.so.1.2 libpgcommon_shlib.a libpgport.a libpgtypes.a libpgtypes.so.3 libpq.a libpq.so.5 pkgconfig python gpadmin@gpadmin0:~/gpdbtest$libexec目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls libexec/ ifaddrs gpadmin@gpadmin0:~/gpdbtest$ cd libexec/ gpadmin@gpadmin0:~/gpdbtest/libexec$ ls ifaddrs gpadmin@gpadmin0:~/gpdbtest/libexec$ ./ifaddrs 127.0.0.1 192.168.31.185 ::1 gpadmin@gpadmin0:~/gpdbtest/libexec$sbin目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls sbin/ gpcleansegmentdir.py gpconfig_helper.py gpgetstatususingtransition.py gpoperation.py gpsegrecovery.py gpsegsetuprecovery.py gpsegstart.py gpsegstop.py packcore recovery_base.py seg_update_pg_hba.py gpadmin@gpadmin0:~/gpdbtest$share目錄:
gpadmin@gpadmin0:~/gpdbtest$ ls share/postgresql/ cdb_init.d errcodes.txt information_schema.sql pg_ident.conf.sample postgres.bki postgresql.conf.sample psqlrc.sample sql_features.txt timezone tsearch_data contrib extension pg_hba.conf.sample pg_service.conf.sample postgres.description postgres.shdescription snowball_create.sql system_views.sql timezonesets gpadmin@gpadmin0:~/gpdbtest$ gpadmin@gpadmin0:~/gpdbtest$ cat share/greenplum/gucs_disallowed_in_file.txt is_superuser debug_assertions transaction_read_only transaction_deferrable integer_datetimes data_checksums data_directory_mode max_function_args max_index_keys max_identifier_length block_size segment_size wal_block_size wal_segment_size ssl_renegotiation_limit server_version_num seed lc_collate lc_ctype server_encoding server_version role session_authorization config_file ssl_library transaction_isolation gp_retrieve_conn gp_is_writer gp_write_shared_snapshot gp_dbid gp_contentid gp_command_count gp_qd_port gp_session_id gp_server_version_num gp_role gp_qd_hostname gp_server_version gpadmin@gpadmin0:~/gpdbtest$上面文件gucs_disallowed_in_file.txt中的內容,就是下面這兩個個文件中含有GUC_DISALLOW_IN_FILE選項的GUC參數:
src/backend/utils/misc/guc.csrc/backend/utils/misc/guc_gp.c接下來看一下Greenplum數據庫的一些常用命令:
gpstart:gpstart命令用于啟動一個Greenplum集群,包括啟動Master和Segment節點。如果只想啟動Master節點,而不啟動Segment節點,可以加-m選項,這樣就能以維護模式(maintenance mode)啟動Master節點
gpstop:該命令用于關閉一個Greenplum集群。gpstop命令的相關選項說明如下所示:
gpstate命令用于展示運行中的Greenplum數據庫的信息,比如哪個節點宕機、Master和Segment的配置信息、數據庫系統所使用的端口號、Segment和Mirror Segment的映射關系等。加-s選項可以顯示數據庫系統的詳細信息,如下:
gpinitstandby:gpinitstandby命令為 Greenplum 數據庫系統添加和/或初始化備用協調器主機
gpinitstandby命令和gpactivatestandby命令的示例可以看一下之前的例子:GreenPlum的學習心得和知識總結(一)|GreenPlum數據庫源碼編譯安裝及學習資料匯總,點擊前往
接下來,重啟服務 如下:
./gpstop ./gpstartgpadmin@gpadmin0:~/gpdbtest/bin$ ./psql -d postgres psql (12beta2) Type "help" for help.postgres=# show max_connections ;max_connections -----------------10 (1 row)postgres=# \q gpadmin@gpadmin0:~/gpdbtest/bin$此外,Greenplum中還有很多命令,這里不再一一介紹,有興趣的可參考官方文檔,簡易說明如下:
這里需要注意的是 上面的命令其實是python腳步,如下:
gpadmin@gpadmin0:~/gpdbtest/bin$ ll gpdeletesystem -rwxr-xr-x 1 gpadmin gpadmin 13664 8月 1 22:16 gpdeletesystem* gpadmin@gpadmin0:~/gpdbtest/bin$ vim gpdeletesystem gpadmin@gpadmin0:~/gpdbtest/bin$總結
以上是生活随笔為你收集整理的GreenPlum的学习心得和知识总结(三)|Greenplum数据库快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于verilog的正弦波发生器
- 下一篇: openstack--3--控制节点安装