Greenplum如何從無到有?Greenplum使用PostgreSQL的初始化機制來初始化集群,PostgreSQL使用initdb創建一個PostgreSQL實體,initdb從無到有創建單個空的可用的PostgreSQL資料庫,也就是在一個空的目錄中創建PostgreSQL運行所需要的所有檔案,包括全域資料字典、控制檔案和三個資料庫:template0、template1、postgres,由于PostgreSQL自身歷史的原因,先創建template1資料庫,然后拷貝整個目錄成為另外兩個資料庫,為了創建template1,首先initdb以bootstrap模式運行postgres行程,并使用postgres.bki檔案的內容進行初始化;也就是創建PostgreSQL運行需要的重要的元資料,然后通過運行SQL以單節點模式初始化更多元資料,
Initdb
Initdb有大量引數,main()函式入口一開始對各種各樣的引數進行檢查,然后分為5個階段進行資料庫初始化,
第一階段,設定資料庫安裝路徑、二進制路徑、版本、各種資料模板和locale等,主要函式有:get_restricted_token(),Windows平臺相關處理,目的是放棄掉管理員權限,以允許Windows的管理員角色運行initdb初始化資料庫;setup_pgdata(),設定PGDATA環境變數,為了運行postgres行程做準備,目的是避免命令列引數引起奇怪的特殊字符轉義問題,比如路徑中包含空格、#等字符;setup_bin_paths(),設定bin路徑,否則找不到postgres二進制檔案;effective_user()設定owner資訊,如果一起ok,會顯示一條輸出資訊"The files belong to this database system will be owned by user ‘yydzero’. This user must also own the server process.";set_info_version(),從PG_VERSION提取版本資訊,后面設定Information schema時需要;setup_data_file_paths(),設定初始化程序中使用的主要資料檔案的完整路徑,所有資料檔案都來自于INSTALLPATH,這些檔案包括postgres.bki,postgres.description,postgres.shdescription,pg_hba.conf.sample,pg_indent.conf.sample,postgresql.conf.sample,conversioin_create.sql,information_schema.sql,sql_features.txt,system_views.sql(Greenplum還有一個特定的目錄cdb_init.d);setup_locale_encoding(),設定locale編碼;setup_text_search(),設定full text search配置,
第二階段,創建PGDATA目錄、其子目錄以及三個主要的組態檔和version檔案,這個階段為使用bootstrap模式創建template1做好準備,主要函式有:setup_signals(),設定信號處理函式;create_data_directory(),創建PGDATA目錄;create_xlog_or_symlink(),創建WAL日志目錄pg_wal;創建PGDATA的子目錄,包括global、pg_commit_ts、pg_dynshmem、pg_notify、pg_snapshots、pg_twophase、pg_multixact、base、base/1、pg_replslot、pg_tblspc、pg_xact、pg_stat、pg_logical、pg_distributedlog、log等,其中有的目錄為greeplum獨有,比如pg_distributedlog;write_version_file(),創建PG_VERSION檔案,bootstrapper需要這個檔案;setup_config(),設定組態檔,主要有三個組態檔postgresql.conf、pg_hba.conf、pg_ident.conf,
第三階段,也叫bootstrap,這個階段使用BKI進行最核心的初始化,主要函式為bootstrap_template1(),該函式以bootstrap模式運行postgres行程,并以BKI檔案供養postgres行程,首先對BKI檔案中的變數進行替換處理,包括NAMEDATALEN、SIZEOF_POINTER、FLOAT4PASSBYVAL、POSTGRES、ENCODING、LC_COLLATE等,然后使用管道執行命令,輸入為BKI資料檔案的內容,行程啟動命令postgres -boot -x1 -k ‘boot_options’ args,逐行處理BKI檔案內容foreach lines: PG_CMD_PUTS(*line),這個函式會輸出很多內容,如Creating template1 database in %s/base/1 … OK,
第四階段,也叫post-bootstrap,主要使用SQL完成剩余的元資料的初始化,write_version_file(“base/1”)創建檔案base/1/PG_VERSION,可以用這個檔案來判斷Initdb的進展;Setup_auth()初始化pg_authid表,主要是回收所有權限,使得任何人都不能讀這張表REVOKE ALL on pg_authid FROM public;get_set_pwd()處理passwd;Setup_depend()插入元資料到pg_depend和pg_shdepend;setup_sysviews()從system_views檔案讀取指令,并逐條執行SQL,完成system views的初始化;setup_description()加載系統物件的description資訊,主要資訊來自于desc_file檔案,也是前面提到的那些安裝目錄下的元資料檔案postgres.description;setup_conversion()加載conversion_create.sql檔案;setup_dictionary()加載詞典檔案,比如snowball_create.sql;setup_privileges()為內建的資料庫物件設定權限;setup_schema()加載information_schema.sql檔案;load_plpgsql()加載plpgsql并CREATE EXTENSION plpgsql;setup_cdb_schema()創建Greenplem特定的schema,源資料位于cdb_init.d目錄下;vacuum_db()運行Analyze和Vacuum freeze,
第五階段,主要是資料的copy&paste,直接拷貝template1,創建template0和postgres資料庫:make_tempalte0()、make_postgres(),
PostgreSQL/Greenplum的三種模式
- Bootstrap模式:從無到有創建資料庫的模式,postgres --boot -x1 -k -F
- Single模式:單用戶模式,只允許單個用戶執行SQL命令,Bootstrap創建了最核心的元資料之后使用single模式創建其他資料,對應著postbootstrap階段
- Normal模式:多用戶的正常模式
postgres命令列引數:
-c:設定run-time引數
-d 1-5:設定表示級別
-F:設定fsync為off
-O:允許修改系統表結構
-W:等待n秒,比方便開發者除錯
自舉模式:
–boot:指定自舉模式
-r:發送標準錯誤和標準輸出到檔案中
-x NUM:內部使用
單用戶模式:
–single:指定單用戶模式
-E:執行前echo陳述句
-j:不適用換行作為互動式查詢的分隔符
-r:發送標準錯誤和標準輸出到檔案中
管道技術
BKI資料的處理通過管道技術實作:PG_CMD_OPEN、PG_CMD_CLOSE、PG_CMD_PUTS,底層使用標準C庫函式popen、pclose,
故障分析
initdb的noclean選型和debug選項對分析資料庫初始化程序中發生的錯誤很有幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/248496.html
標籤:其他
下一篇:通用mapper入門
