bitnami-docker-postgresql 倉庫
流複製相關環境變數
使用以下環境變數,可以使用 Bitnami PostgreSQL Docker 映象
輕鬆設定流複製叢集:
POSTGRESQL_REPLICATION_MODE
: replication 模式。可能的值master
/slave
。沒有預設值。POSTGRESQL_REPLICATION_USER
: 首次執行時在主伺服器上建立的 replication 使用者。沒有預設值。POSTGRESQL_REPLICATION_PASSWORD
: replication 使用者密碼。 沒有預設值。POSTGRESQL_REPLICATION_PASSWORD_FILE
: 包含 replication 使用者密碼的檔案的路徑。這將覆蓋POSTGRESQL_REPLICATION_PASSWORD
中指定的值。沒有預設值。POSTGRESQL_MASTER_HOST
: replication master(slave 引數)Hostname/IP。沒有預設值。POSTGRESQL_MASTER_PORT_NUMBER
: replication master 的伺服器埠(slave 引數)。預設是5432
。
在複製(replication)
叢集中,您可以擁有一個主(master)
伺服器和零個或多個從(slave)
伺服器。 啟用複製後,master
節點處於讀寫模式,而 slave
節點處於只讀模式。 為了獲得最佳效能,建議將讀取限制在 slave
上。
第 1 步:建立 replication master
第一步是啟動 master。
$ docker run --name postgresql-master \
-e POSTGRESQL_REPLICATION_MODE=master \
-e POSTGRESQL_USERNAME=my_user \
-e POSTGRESQL_PASSWORD=password123 \
-e POSTGRESQL_DATABASE=my_database \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在此命令中,我們使用 POSTGRESQL_REPLICATION_MODE=master
引數將容器配置為 master
容器。使用 POSTGRESQL_REPLICATION_USER
和 POSTGRESQL_REPLICATION_PASSWORD
引數指定 replication
使用者。
步驟 2:建立 replication slave
接下來我們啟動一個 replication slave
容器。
$ docker run --name postgresql-slave \
--link postgresql-master:master \
-e POSTGRESQL_REPLICATION_MODE=slave \
-e POSTGRESQL_MASTER_HOST=master \
-e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在上面的命令中,使用 POSTGRESQL_REPLICATION_MODE
引數將容器配置為slave
。 在 replication slave
啟動之前,slave
容器使用 POSTGRESQL_MASTER_HOST
和 POSTGRESQL_MASTER_PORT_NUMBER
引數連線到 master
並從 master
複製初始資料庫。POSTGRESQL_REPLICATION_USER
和 POSTGRESQL_REPLICATION_PASSWORD
憑證用於向 master
進行身份驗證。為了改變 pg_hba.conf
的預設設定,slave
需要知道是否設定了 POSTGRESQL_PASSWORD
。
使用這兩個命令,您現在可以啟動並執行一個兩節點 PostgreSQL
主從(master-slave
)流複製叢集。 您可以通過新增/刪除從(slave)
伺服器來擴充套件叢集,而不會導致任何停機。
Note: 叢集完整地複製 master 伺服器,包括所有使用者和資料庫。
如果 master
伺服器當機,您可以重新配置一個 slave
伺服器作為 master
伺服器並通過建立觸發器檔案 /tmp/postgresql.trigger.5432
開始接受寫入。例如,以下命令將 postgresql-slave
重新配置為 master
伺服器:
$ docker exec postgresql-slave touch /tmp/postgresql.trigger.5432
Note: 需要更新叢集中其他
slave
伺服器的配置,以便他們知道新的master
伺服器。這將要求您根據我們的示例使用--link postgresql-slave:master
重新啟動其他slave
伺服器。
使用 Docker Compose
,可以使用以下方式設定主從複製:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_MASTER_PORT_NUMBER=5432
volumes:
postgresql_master_data:
使用以下方法縮放 slave
的數量:
$ docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
上面的命令將 slave
的數量增加到 3
。你可以用同樣的方法縮小。
Note: 您不應該擴大/縮小主節點的數量。始終只執行一個主節點。
同步提交
預設情況下,slave
例項配置為非同步複製。為了保證更高的資料穩定性(以犧牲一些效能為代價),可以使用以下環境變數設定同步提交(即,在將事務提交寫入一組副本之前,事務提交不會將成功返回給客戶端)。
POSTGRESQL_SYNCHRONOUS_COMMIT_MODE
: 建立同步提交的型別。可用選項有:on
、remote_apply
、remote_write
、local
和off
。 預設值為on
。有關更多資訊,請檢視官方 PostgreSQL 文件。POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS
: 確定將啟用同步複製的副本數。此數量不得超過您在叢集中配置的slave
的數量。
使用 Docker Compose
,可以按如下方式設定帶有同步提交的主從複製:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
- POSTGRESQL_SYNCHRONOUS_COMMIT_MODE=on
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
volumes:
- '/path/to/postgresql-persistence:/bitnami/postgresql'
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
postgresql-slave2:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
在上面的示例中,提交需要同時寫入主伺服器和其中一個從伺服器才能被接受。另一個 slave
將繼續使用非同步複製。使用以下 SQL
查詢對其進行檢查:
postgres=# select application_name as server, state,
postgres-# sync_priority as priority, sync_state
postgres-# from pg_stat_replication;
| server | state | priority | sync_state |
|-------------|-----------|----------|------------|
| walreceiver | streaming | 0 | sync |
| walreceiver | streaming | 0 | async |
Note: 對於更高階的設定,您可以通過設定
POSTGRESQL_CLUSTER_APP_NAME
環境變數,使用application_name
引數定義不同的複製組。