PostgreSQL體系結(jié)構(gòu)

概覽

PG是一個(gè)典型的c/s模型

體系結(jié)構(gòu)=實(shí)例+存儲(chǔ)結(jié)構(gòu)
實(shí)例=進(jìn)程+內(nèi)存結(jié)構(gòu)

實(shí)例結(jié)構(gòu)

PG是多進(jìn)程的,類似oracle,區(qū)別于MySQL的單進(jìn)程多線程。
PostMaster進(jìn)程(PM)處理連接層和部分SQL層相關(guān)的;
SP不光是處理連接,還處理會(huì)話中的SQL,包含兩層功能;
BP是后臺(tái)進(jìn)程,比如ckpt,archive等等。
SGA共享內(nèi)存區(qū),功能類似buffer pool;
PGA私有內(nèi)存區(qū),為上面的SP分配區(qū)域。

進(jìn)程結(jié)構(gòu)

我們?cè)贠S上ps -ef |grep postgres能看到這些后臺(tái)進(jìn)程。

  • PM進(jìn)程:提供監(jiān)聽、連接協(xié)議、驗(yàn)證、fork其他進(jìn)程。服務(wù)一啟動(dòng)就有。
    監(jiān)聽哪個(gè)ip是受到postgressql.conf影響的,提供socket和TCP/IP方式連接。
    驗(yàn)證功能是通過pg_hba.conf和用戶驗(yàn)證模塊。
  • SP進(jìn)程:會(huì)話進(jìn)程,是真正的工作進(jìn)程。
    用戶一旦驗(yàn)證成功就會(huì)fork一個(gè)新的進(jìn)程。
    然后完成整個(gè)SQL的預(yù)處理,語義語法檢查,分析優(yōu)化執(zhí)行。
    可理解為充當(dāng)了MySQL中連接線程和SQL線程的作用。
  • BGW進(jìn)程:background writer,主要負(fù)責(zé)后臺(tái)刷新臟頁。
  • sysloger進(jìn)程:主要負(fù)責(zé)數(shù)據(jù)庫狀態(tài)信息的日志記錄。
  • ckpt進(jìn)程:checkpoint,檢查點(diǎn)。
  • walwriter:WAL日志(就是他的redo)的刷寫進(jìn)程。
  • arch:歸檔進(jìn)程,類比oracle的歸檔日志。
    -AV:數(shù)據(jù)整理,因?yàn)槎驯?heap table)和索引組織表不一樣。
    -SC:狀態(tài)控制進(jìn)程。

內(nèi)存結(jié)構(gòu)

(XLOG就是WAL在舊版本中的名稱。)

存儲(chǔ)結(jié)構(gòu)

重點(diǎn)文件

日志文件種類

  • $PGDATA/log 運(yùn)行日志(pg10之前為$PGDATA/pg_log)
  • $PGDATA/pg_wal 重做日志(pg10之前為$PGDATA/pg_xlog)
  • $PGDATA/pg_xact 事務(wù)提交日志(pg10之前為$PGDATA/pg_clog)
  • 服務(wù)器日志,可以在啟動(dòng)的時(shí)候指定,比如pg_ctl start -l ./alert.log

運(yùn)行日志參數(shù)

參數(shù)名 參數(shù)說明
log_destination = 'csvlog' 運(yùn)行日志可以存儲(chǔ)成各種格式 ,stderr,csvlog,syslog,and eventlog,csvlog requires logging_collector to be on,一般選擇csvlog,可以導(dǎo)入數(shù)據(jù)庫中查看
logging_collector = on 選csv格式的日志必須設(shè)置這個(gè)參數(shù)on才行,修改需要重啟才生效
log_directory = 'log' 日志輸出目錄
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' 日志文件名字的格式
log_file_mode=0600 日志文件權(quán)限
log_truncate_on_rotation = on 設(shè)置重用日志
log_rotation_age = 1d 多長(zhǎng)時(shí)間重用日志
log_rotation_size = 10MB 日志達(dá)到多大重用
log_min_messages = warning 可選項(xiàng)由少到多分別有debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic
log_min_duration_statement = 5 超過多長(zhǎng)時(shí)間記錄慢SQL
log_checkpoints = on 記錄檢查點(diǎn)操作
log_connections = on 記錄會(huì)話連接操作
log_disconnections = on 記錄會(huì)話斷開操作
log_duration = on 記錄SQL執(zhí)行時(shí)間
log_lock_waits = on log lock waits >= deadlock_timeout記錄時(shí)間長(zhǎng)的阻塞
log_statement='ddl' none,ddl,mod,all 記錄ddl

更全的請(qǐng)查看postgresql.conf查看說明,記錄的越多壓力越大,合理取舍。

csv日志入庫存儲(chǔ)
先建表

CREATE TABLE pg_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);

再copy上去:

copy pg_log from '$PGLOG/postgresql-20210808.csv' with csv;

postgresql.conf基礎(chǔ)配置

參數(shù)名 可選值及說明
listen_addresses='*' 監(jiān)聽客戶端的地址,默認(rèn)只監(jiān)聽本地,需要修改為*或者0.0.0.0
port = 5432 端口,默認(rèn)是5432
max_connection = 2000 最大連接數(shù),默認(rèn)100
unix_socket_directories socket文件的位置。默認(rèn)在/tmp下面。一般不會(huì)配置多實(shí)例,所以一般不用修改
shared_buffers 數(shù)據(jù)緩存區(qū),類比Oracle的buffer cache,建議值1/4至1/2主機(jī)內(nèi)存
maintenance_work_mem 維護(hù)工作內(nèi)存,用于vacuum,create index,reindex等,建議值(1/4主機(jī)內(nèi)存)/autovacuum_max_workers
max_worker_processes 總worker數(shù)
max_parallel_workers_per_gather 單條query中,每個(gè)node最多允許開啟的并行計(jì)算worker數(shù)
wal_level wal的記錄級(jí)別,11以上的版本默認(rèn)是replica
wal_buffers 類似oracle的log buffer
checkpoint_timeout checkpoint時(shí)間間隔
max_wal_size 控制wal的數(shù)量,最多不超過多少個(gè)
min_wal_size 控制wal的數(shù)量,默認(rèn)3個(gè)輪轉(zhuǎn)
archive_command 開歸檔的命令,其實(shí)就是拷貝命令,比如'test ! -f /disk1/digoal/arch/%f && cp %p /disk1/digoal/arch/%f'
autovacuum 開啟自動(dòng)vacuum

pg_hba.conf
PG防火墻訪問控制配置,見之前的安裝配置的遠(yuǎn)程連接配置。

pg_ident.conf
用戶映射配置文件。結(jié)合pg_hba.connf,method為ident可以用特定的操作系統(tǒng)用戶和指定的數(shù)據(jù)庫用戶登錄數(shù)據(jù)庫。使用幾率不大。

控制文件
存儲(chǔ)數(shù)據(jù)庫當(dāng)前狀態(tài)的一些信息,但無法直接讀取,需要通過pg_controldata查看控制文件的內(nèi)容。

pg_controldata $PGDATA

重點(diǎn)關(guān)注dbid,主從信息,控制文件最后修改時(shí)間,checkpoint位置點(diǎn),redo位置點(diǎn),正在使用的redo文件,下一個(gè)事務(wù)id,下一個(gè)對(duì)象ID(oid),wal級(jí)別,最大連接數(shù),數(shù)據(jù)塊大小(默認(rèn)8k),wal數(shù)據(jù)塊大小,單個(gè)wal大小

數(shù)據(jù)文件
pg中,每個(gè)索引和表都是一個(gè)單獨(dú)的文件,pg中叫做page。默認(rèn)是每個(gè)大于1G的page會(huì)被分割pg_class.relfilenode.1這樣的文件。page的大小在initdb的時(shí)候指定(--with-segsize)。

page的物理位置在$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE

查看t1表在哪個(gè)段上:

select relfilenode from pg_class where relname='t1';

查看對(duì)應(yīng)的文件:

select pg_relation_filepath('t1');

查看數(shù)據(jù)目錄:

show data_directory;

然后根據(jù)目錄就能看到對(duì)應(yīng)的文件,文件是二進(jìn)制的無法打開。

online WAL
作用其實(shí)可以理解為redo日志,保證崩潰后的安全,一旦系統(tǒng)崩潰,可以重放從最后一次檢查點(diǎn)以來的日志項(xiàng)來恢復(fù)數(shù)據(jù)庫的一致性。
也存在日志膨脹的問題。
通過max_wal_size和min_wal_size控制wal日志的大小。

wal在$PGDATA/pg_wal下,未見名稱為16進(jìn)制的24個(gè)字符組成,每8個(gè)一組,前8位代表時(shí)間線,中間代表邏輯id,后8位代表物理id,我們比較關(guān)注物理id。

查看wal時(shí)間:

select pg_walfile_name(pg_current_wal_lsn());
select * from pg_ls_waldir() order by modification asc;

可以使用pg_waldump查看wal的具體內(nèi)容,重點(diǎn)關(guān)注commit和commit之間的部分,雖然看不到具體SQL,不過大致進(jìn)行了什么操作可以分辨;比如建庫就是copy一步,建表就有一大堆insert,insert就insert和commit兩步,刪表就有一大堆delete,刪庫就是有delete有drop dir等等。
還可以看歸檔日志,因?yàn)楦袷揭荒R粯印?/p>

手動(dòng)切換下一個(gè):

select pg_switch_wal();

arch WAL
生產(chǎn)環(huán)境中一般需要設(shè)置歸檔;所謂歸檔其實(shí)就是把pg_wal里面的日志備份出來,當(dāng)系統(tǒng)故障后可以通過歸檔的日志文件對(duì)數(shù)據(jù)進(jìn)行恢復(fù)。
配置歸檔需要開啟如下參數(shù):

  • wal_level = replica (pg11默認(rèn)是replica,配置文件打開即可)
    該參數(shù)的可選值有minimal,replica和logical,WAL的級(jí)別依次增高,在WAL的信息也越多。由于minimal這一級(jí)別的WAL不包含從基礎(chǔ)的備份和WAL日志重建數(shù)據(jù)的足夠信息,在該模式下,無法開啟WAL日志歸檔。
  • archive_mode = on
    上述參數(shù)為on,表示打開歸檔備份,可選的參數(shù)為on, off, always默認(rèn)值為off,所以要手動(dòng)打開。
  • archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
    該參數(shù)默認(rèn)值是一個(gè)空字符串,其值可以是一個(gè)shell命令或者一個(gè)復(fù)雜的shell腳本。在shell腳本或命令中,可以用%p表示將要?dú)w檔的wal文件包含完整路徑的信息的文件名,用%f代表不包含路徑信息的wal文件的文件名。
    注意:wal_level和archive_mode參數(shù)修改都需要重新啟動(dòng)數(shù)據(jù)庫才可以生效。而修改archive_comman則不需要。因此一般配置新系統(tǒng)時(shí),無論是否需要?dú)w檔,都建議將這兩個(gè)參數(shù)開啟。歸檔日志目錄可以定制,應(yīng)該提前創(chuàng)建好。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容