[PG] PostgreSQL High Availability
這篇文章是我看了 PostgreSQL Replication, High Availability HA and Scalability 這門課後的筆記。
Environment Setup
在這篇文章中,我會在 GCP 上面建立一個 VM (Debian) 來安裝 PostgreSQL (15.10) 來做 demo
sudo apt install postgresql
安裝完之後應該會自行啟動,我們可以透過以下指令來確認是否有啟動
sudo systemctl status postgresql
接著我們可以切換使用者並且進入 psql 來進行操作
sudo -i -u postgres
psql
輸入 \q
即可離開 psql
除此之外我們會使用到 pg_ctl
這個指令,需要先設定 .bashrc
跟 .bash_profile
nano ~/.bashrc
# set export PATH=$PATH:/usr/lib/postgresql/15/bin
nano ~/.bash_profile
# set
# if [ -f ~/.bashrc ]; then
# . ~/.bashrc
# fi
接著重新登入就會自動載入設定
pg_ctl --version
Scaling PostgreSQL
當我們的資料庫需要處理大量的資料時,我們首先需要檢查我們的資料庫是否已經達到其處理能力的極限,像是 SQL 優化或參數調整等等, 如果還是沒辦法提供足夠的效能,我們就需要考慮擴充我們的資料庫
擴充資料庫的方式大致分為以下兩種 :
- Vertical Scaling: 增加資源,像是 CPU、Memory、Storage 等等
- Horizontal Scaling: 增加節點,像是增加資料庫節點、增加資料庫叢集等等
Streaming Replication
Streaming Replication 是 PostgreSQL 用來實現高可用性的主要機制,它透過將主節點的 WAL 日誌傳送到從節點,從而實現接近實時的資料同步。
在 PostgreSQL 中預設的執行方式是非同步的,說主節點在執行完一個 transaction 後,不需要等待從節點確認收到 WAL 日誌,就可以繼續執行下一個 transaction。 這種方法的好處是效能較高,缺點是如果發生故障,可能會因為 WAL 缺少而導致資料不一致。 我們也可以設置為同步,這樣主節點在執行完後,需要等待從節點確認收到 WAL 日誌,才能繼續執行, 這種方法的好處是資料一致性較高且可以保證資料的完整性,缺點是效能較低。
我們可以針對不同的資料 (table),來選擇不同的方式。
synchronous_commit 的設定有以下幾種 :
off
: 只寫入 shared buffer,不保證寫入 WAL 日誌local
: 寫入 WAL buffer,並同步到本地的硬碟remote_write
: 主節點寫入硬碟,從節點的 WAL buffer 收到但不保證寫入硬碟remote_apply
: 在單機狀態下與local
相同,在多機環境下,主節點寫入硬碟,從節點收到並寫入硬碟on
: 主節點寫入硬碟,從節點收到並寫入硬碟並成功應用
首先使用 initdb
來初始化資料庫集群,資料庫集群是由單個資料庫實例所管理的資料庫集合。
which initdb
/usr/lib/postgresql/15/bin/initdb
initdb -D /tmp/primary_db/
nano /tmp/primary_db/postgresql.conf
# set listen_addresses to '*'
# set port to 5433
# set permission
sudo chown -R postgres:postgres /tmp/primary_db
sudo -i -u postgres
pg_ctl -D /tmp/primary_db start
psql --port=5433 postgres
create user requser replication;
nano /tmp/primary_db/pg_hba.conf
# add the following line
# host all requser 127.0.0.1/32 trust
sudo -i -u postgres
pg_ctl -D /tmp/primary_db restart