使用 Bitnami PostgreSQL Docker 映象快速設定流複製叢集

為少發表於2022-04-22

image

bitnami-docker-postgresql 倉庫

原始碼: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_USERPOSTGRESQL_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_HOSTPOSTGRESQL_MASTER_PORT_NUMBER 引數連線到 master 並從 master 複製初始資料庫。POSTGRESQL_REPLICATION_USERPOSTGRESQL_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 例項配置為非同步複製。為了保證更高的資料穩定性(以犧牲一些效能為代價),可以使用以下環境變數設定同步提交(即,在將事務提交寫入一組副本之前,事務提交不會將成功返回給客戶端)。

使用 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 引數定義不同的複製組。

更多

相關文章