資料庫體系結構-程序和記憶體結構(Process and Memory Architecture)
- 程序結構
伺服器程序postmaster
背景工作程序
後端程序
- 記憶體結構
本地記憶體區共享記憶體區work_mem
maintenance_work_mem
temp_buffers
shared buffer pool
WAL buffer
commit log
- 資料庫啟動過程
- 資料庫連接配接過程
PostgreSQL是一個client/server架構rdbms,一個伺服器上運作多個程序。
1、程序結構
Postgres Server Process(postmaster)
--pg的主程序,也是父程序,後端程序和背景工作程序都是由server process fork派生出來;同時具有監聽的功能
Background Processes
--背景工作程序,實作資料庫的功能及管理
logger process
--日志收集程序,将日志資訊輸出到日志檔案
checkpointer process
--檢查點程序,執行檢查點
writer process
--背景寫程序,将shared buffer中的資料寫入磁盤
wal writer process
--背景wal日志寫程序,将walbuffer中的日志流寫入磁盤
autovacuum launcher process
--自動清理程序,清理版本資料,向postmaster主程序申請調用autovacuum程序
archiver process
--歸檔程序,歸檔wal日志
stats collector process
--統計資訊收集進(pg_stat_database、pg_stat_activity)
logical replication,wal sender process等其他程序
backed process
--後端程序求,用來處理用戶端連接配接請服務
pg postgres [local] idle
--本地登陸程序
pg postgres 192.168.6.1(53171) idle
--遠端登陸程序
pg postgres 192.168.6.1(51846) idle intransaction
--遠端登陸程序,程序中事務未完成
eg
[root@pg ~]# pstree -ap |grep post |grep -v grep
|-postmaster,889 -D /opt/postgres/data
| |-postmaster,906
| |-postmaster,990
| |-postmaster,991
| |-postmaster,992
| |-postmaster,993
| |-postmaster,994
| |-postmaster,995
| |-postmaster,996
| |-postmaster,1249
| |-postmaster,1301
| `-postmaster,1428`
[root@pg ~]# ps -ef |grep postgres |grep -v grep
pg 889 1 0 09:44 ? 00:00:00 /opt/postgres//bin/postmaster -D /opt/postgres/data
pg 906 889 0 09:44 ? 00:00:00 postgres: logger process
pg 990 889 0 09:44 ? 00:00:00 postgres: checkpointer process
pg 991 889 0 09:44 ? 00:00:00 postgres: writer process
pg 992 889 0 09:44 ? 00:00:00 postgres: wal writer process
pg 993 889 0 09:44 ? 00:00:00 postgres: autovacuum launcher process
pg 994 889 0 09:44 ? 00:00:00 postgres: archiver process
pg 995 889 0 09:44 ? 00:00:00 postgres: stats collector process
pg 996 889 0 09:44 ? 00:00:00 postgres: bgworker: logical replication launcher
pg 1249 889 0 09:51 ? 00:00:00 postgres: pg postgres [local] idle
pg 1301 889 0 10:18 ? 00:00:00 postgres: pg postgres 192.168.6.1(51846) idle in transaction
pg 1428 889 0 11:03 ? 00:00:00 postgres: pg postgres 192.168.6.1(53171) idle
[root@pg ~]#
以上以看出,postmaster fork出其他的程序,其中包括必可須的背景服務程序和後端程序。
注意:
由于所有程序都是由postmster程序派生出來的,不能對程序進行kill操作,否則會造成postmaster重新開機,也就是資料庫重新開機
殺死後端程序需要使用函數pg_terminate_backend(apid int)
如:
postgres=# select pg_terminate_backend(1301);
pg_terminate_backend
----------------------
t
(1 row)
postgres=#
2、記憶體結構
-
--每個後端程序自己使用,主要用于查詢Local memory area
--用于存放排序和hash結果
work_mem
--管理工作使用的記憶體,如VACUUM
maintenance_work_mem
temp_buffers
--存儲臨時表
-
--所有程序共同使用,啟動資料庫後配置設定的記憶體Shared memory area
--存放page,資料庫所有操作都在此記憶體完成
shared buffer pool
--存放wal日志流
WAL buffer
commit log
--存放事務狀态
記憶體大小有參數控制
postgres=# select name,setting,source from pg_settings where name like '%work_mem%';
name | setting | source
----------------------+---------+---------
autovacuum_work_mem | -1 | default
maintenance_work_mem | 65536 | default
work_mem | 4096 | default
(3 rows)
postgres=# select name,setting,source from pg_settings where name like '%buffer%';
name | setting | source
----------------+---------+--------------------
shared_buffers | 16384 | configuration file
temp_buffers | 1024 | default
wal_buffers | 512 | override
(3 rows)
知道以上記憶體的作用,進行參數調優
3、資料庫啟動過程
start資料庫後,首先啟動Postgres Server Process(postmaster),然後配置設定共享記憶體,配置設定記憶體後啟動必須的背景工作程序,postmaster監聽一個端口,等待用戶端連接配接請求
4、用戶端連接配接過程
用戶端程序申請連接配接資料庫,postmaster監聽連接配接,通過連接配接認證後,fork出背景程序backend process代替用戶端程序操作資料庫