PG架構圖
進程 |
說明 |
Postmaster 主進程 |
是整個數據庫實例的總控進程,負責啟動和關閉該數據庫實例 |
Potgres (常駐進程) |
管理后端的常駐進程,也稱為“postmaster”。其默認監測UNIXDomain Socket和TCP/IP(windows等,一部分的平臺只監測TCP/IP)的5432端口,等待來自前端的的連接處理。監測的端口號可以在PostgreSql的設置文件postgresql.conf中修改。 |
Postgres(子進程) |
子進程根據pg_hba.conf定義的安全策略來判斷是否允許進行連接,根據策略,會拒絕某些特定的IP及網絡,或者也可以只允許某些特定的用戶或者對某些數據庫進行連接。 Postgres會接受前端過來的查詢,然后對數據庫進行檢索,最后把結果返回,有時也會對數據庫進行更新。更新的數據同時還會記錄在事務日志里面(PostgreSQL稱為WAL日志),這個主要是當停電的時候,服務器宕機,重新啟動的時候進行恢復處理的時候使用的。另外,把日志歸檔保存起來,可在需要進行恢復的時候使用。在PostgreSQL 9.0以后,通過把WAL日志傳送其他的PostgreSQL,可以實時地進行數據庫復制,這就是所謂的“數據庫復制”功能。 |
PgArch進程 (歸檔) |
WAL日志會被循環使用,PgArch在歸檔前會把WAL日志備份出來。通過PITR(Point in Time Recovery)技術,可以對數據庫進行一次全量備份后,該技術將備份時間點之后的WAL日志通過歸檔進行備份,使用數據庫的全量備份再加上后面產生的WAL日志,即可把數據庫向前推到全量備份后的任意一個時間點。 |
PgStat進程 (統計數據收集) |
做數據的統計收集工作。主要用于查詢優化時的代價估算,包括一個表和索引進行了多少次的插入、更新、刪除操作,磁盤塊讀寫的次數、行的讀次數。pg_statistic中存儲了PgStat收集的各類信息。 |
AutoVacuum進程 (自動清理) |
在PostgreSQL數據庫中,對表進行DELETE操作后,舊的數據并不會立即被刪除,并且,在更新數據時,也并不會在舊的數據上做更新,而是新生成一行數據。舊的數據只是被標識為刪除狀態,只有在沒有并發的其他事務讀到這些舊數據時,它們才會被清除。這個清除工作就由AutoVacuum進程完成。 |
BgWriter進程 (后臺) |
頁寫到磁盤上的進程。主要是為了提高插入、更新和刪除數據的性能。 |
Wal Writer進程 (預寫式日志) |
WAL(Write Ahead Log,預寫式日志),在修改數據之前把修改操作記錄到磁盤中,以便后面更新實時數據時就不需要數據持久化到文件中。 |
CheckPoint進程 (檢查點) |
檢查點是系統設置的事務序列點,設置檢查點保證檢查點前的日志信息刷到磁盤中。 |
Syslogger進程 (系統日志) |
將錯誤信息寫到log日志中,需要在Postgres.conf中logging_collection設置為on,此時主進程才會啟動Syslogger輔助進程。 |
postgresql的物理架構非常簡單,它由共享內存、一系列后臺進程和數據文件組成。
Shared Memory
共享內存是服務器服務器為數據庫緩存和事務日志緩存預留的內存緩存空間。其中最重要的組成部分是Shared Buffer和WAL Buffer。
- Shared Buffer:是數據頁緩沖區。Shared Buffer的目的是減少磁盤IO,大部分oltp工作負載都是隨機IO,因此從磁盤獲取非常慢。為了解決這個問題,postgre將數據緩存在RAM中,來提高性能。對于shared_buffers,沒有一個特定的推薦值。但是一般來說,對于專用DB服務器,shared_buffers的值應該大約是系統總RAM的25%。
- WAL Buffer:是預寫日志(wal)緩沖區。在備份和恢復的場景下,WAL Buffer和WAL文件是極其重要的。如果要調優的系統有大量并發連接,那么wal_buffers的值越高,性能越好。
PostgreSQL 進程類型
PostgreSQL有四種進程類型
- Postmaster (Daemon) Process(主后臺駐留進程)
- Background Process(后臺進程)
- Backend Process(后端進程)
- Client Process(客戶端進程)
- Postmaster Process:PostgreSQL啟動時第一個啟動的進程。啟動時,他會執行恢復、初始化共享內存的運行后臺進程操作。運行期間,當有客戶端發起鏈接請求時,它還負責創建后端進程。
如果通過pstree命令查看進程之間的關系,你會發現Postmaster進程是其他所有進程的父進程。
Background Process
PgArch進程 (歸檔) |
WAL日志會被循環使用,PgArch在歸檔前會把WAL日志備份出來。通過PITR(Point in Time Recovery)技術,可以對數據庫進行一次全量備份后,該技術將備份時間點之后的WAL日志通過歸檔進行備份,使用數據庫的全量備份再加上后面產生的WAL日志,即可把數據庫向前推到全量備份后的任意一個時間點。 |
PgStat進程 (統計數據收集) |
做數據的統計收集工作。主要用于查詢優化時的代價估算,包括一個表和索引進行了多少次的插入、更新、刪除操作,磁盤塊讀寫的次數、行的讀次數。pg_statistic中存儲了PgStat收集的各類信息。 |
AutoVacuum進程 (自動清理) |
在PostgreSQL數據庫中,對表進行DELETE操作后,舊的數據并不會立即被刪除,并且,在更新數據時,也并不會在舊的數據上做更新,而是新生成一行數據。舊的數據只是被標識為刪除狀態,只有在沒有并發的其他事務讀到這些舊數據時,它們才會被清除。這個清除工作就由AutoVacuum進程完成。 |
BgWriter進程 (后臺) |
頁寫到磁盤上的進程。主要是為了提高插入、更新和刪除數據的性能。 |
Wal Writer進程 (預寫式日志) |
WAL(Write Ahead Log,預寫式日志),在修改數據之前把修改操作記錄到磁盤中,以便后面更新實時數據時就不需要數據持久化到文件中。 |
CheckPoint進程 (檢查點) |
檢查點是系統設置的事務序列點,設置檢查點保證檢查點前的日志信息刷到磁盤中。 |
Syslogger進程 (系統日志) |
需要在Postgres.conf中logging_collection設置為on,此時主進程才會啟動Syslogger輔助進程。 |
Backend Process
最大后臺鏈接數通過max_connections參數設定,默認值為100。后端進程用于處理前端用戶請求并返回結果。查詢運行時需要一些內存結構,就是所謂的本地內存(local memory)。本地內存涉及的主要參數有:
work_mem:用于排序、位圖索引、哈希鏈接和合并鏈接操作。默認值為4MB。
maintenance_work_mem:用于vacuum和創建索引操作。默認值為64MB。
temp_buffers:用于臨時表。默認值為8MB。
Client Process
客戶端進程需要和后端進程配合使用,處理每一個客戶鏈接。通常情況下,Postmaster進程會派生一個子進程用來處理用戶連接。
數據庫結構
數據庫相關概念:
- PostgreSQL由一系列數據庫組成。一套PostgreSQL程序稱之為一個數據庫群集。
- 當initdb()命令執行后,template0 , template1 , 和postgres數據庫被創建。
- template0和template1數據庫是創建用戶數據庫時使用的模版數據庫,他們包含系統元數據表。
- initdb()剛完成后,template0和template1數據庫中的表是一樣的。但是template1數據庫可以根據用戶需要創建對象。
- 用戶數據庫是通過克隆template1數據庫來創建的;
表空間相關概念:
- initdb()后馬上創建pg_default和pg_global表空間。
- 建表時如果沒有指定特定的表空間,表默認被存在pg_default表空間中。
- 用于管理整個數據庫集群的表默認被存儲在pg_global表空間中。
- pg_default表空間的物理位置為$PGDATAbase目錄。
- pg_global表空間的物理位置為$PGDATAglobal目錄。
- 一個表空間可以被多個數據庫同時使用。此時,每一個數據庫都會在表空間路徑下創建為一個新的子路徑。
- 創建一個用戶表空間會在$PGDATApg_tblspc目錄下面創建一個軟連接,連接到表空間制定的目錄位置。
表相關概念:
- 每個表有三個數據文件。
- 一個文件用于存儲數據,文件名是表的OID。
- 一個文件用于管理表的空閑空間,文件名是OID_fsm。
- 一個文件用于管理表的塊是否可見,文件名是OID_vm。
- 索引沒有_vm文件,只有OID和OID_fsm兩個文件