為 AlloyDB Omni 設定 pgBackRest

本頁面說明如何設定 AlloyDB Omni,搭配開放原始碼資料庫備份伺服器 pgBackRest,保護資料。

啟用 TDE 的叢集支援使用 pgBackRest 進行透明備份和還原,您不需要執行任何額外步驟。詳情請參閱「建立啟用 TDE 的叢集」。

如需 Kubernetes 相關資訊,請參閱「在 Kubernetes 中備份及還原」。

如要進一步瞭解 pgBackRest,請參閱使用手冊。

事前準備

設定 AlloyDB Omni 以搭配 pgBackRest 運作之前,請先完成下列必要條件:

基本設定 (含本機備份)

本節步驟將引導您完成 pgBackRest 的基本設定。基本設定不會啟用排程備份功能。詳情請參閱「設定排定備份」。

由於 pgBackRest 是與 AlloyDB Omni 相容的彈性第三方產品,您可以視需要和偏好設定修改這些步驟。

將備份磁碟區掛接至容器

為方便管理,強烈建議您為 pgBackRest 備份建立並掛接獨立磁碟區。如要設定新的磁碟區,請完成下列步驟:

  1. 如果容器正在執行,請停止並移除。

    Docker

    docker stop CONTAINER_NAME
    docker rm CONTAINER_NAME

    Docker

    docker stop CONTAINER_NAME
    docker rm CONTAINER_NAME

    Podman

    podman stop CONTAINER_NAME
    podman rm CONTAINER_NAME

    Podman

    podman stop CONTAINER_NAME
    podman rm CONTAINER_NAME

    請替換下列變數:

    • CONTAINER_NAME:您為容器使用的名稱。
  2. 在容器的檔案系統中建立備份目錄。

    Docker

    mkdir -p BACKUP_DIR
    

    Docker

    mkdir -p BACKUP_DIR
    

    Podman

    mkdir -p BACKUP_DIR
    

    Podman

    mkdir -p BACKUP_DIR
    

    替換下列變數:

    • BACKUP_DIR:儲存備份的主機目錄。
  3. 使用新的備份磁碟區重新建立容器。

    Docker

    docker run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    google/alloydbomni:latest
    

    Docker

    docker run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    google/alloydbomni:latest
    

    Podman

    podman run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    docker.io/google/alloydbomni:latest
    

    Podman

    podman run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    docker.io/google/alloydbomni:latest
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
    • NEW_PASSWORD:新容器建立後,指派給容器 postgres 使用者的密碼。請注意,只有在 DATA_DIR 是新位置時,NEW_PASSWORD 才會設定新密碼。
    • DATA_DIR:儲存資料的主機目錄路徑。
    • BACKUP_DIR:儲存備份的主機目錄。
    • HOST_PORT:主體機器上的 TCP 通訊埠,容器應將自己的通訊埠 5432 發布至該通訊埠。如要一併在主體機器上使用 PostgreSQL 預設通訊埠,請指定 5432。
  4. 將容器中的備份目錄設為可由 postgres 讀取。

    Docker

    docker exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Docker

    docker exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Podman

    podman exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Podman

    podman exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。

設定本機備份

pgBackRest 會為每次備份建立子目錄,並包含純文字資訊清單檔案。

pgBackRest 使用「節」一詞來指稱 PostgreSQL 資料庫叢集的設定。節區名稱可任意指定,不一定要與主機伺服器、PostgreSQL 叢集或資料庫名稱相符。pgBackRest 說明文件建議根據叢集的功能命名 stanza。

備份作業會將資料寫入存放區。pgBackRest 支援在特定節中寫入多個存放區。與存放區相關的大多數設定參數都會以數值建立索引。例如 repo1-。與 PostgreSQL 叢集相關的參數也會獨立建立索引。舉例來說,stanza 中第一個 PostgreSQL 叢集專屬的參數會加上 pg1- 前置字元。

pgBackRest 會使用名為 pgbackrest.conf 的設定檔,保存全域和段落專屬參數。

如要建構及初始化設定檔,以便備份 AlloyDB Omni 叢集,請在主機端備份目錄中建立 pgbackrest.conf 檔案,該目錄是在將備份磁碟區掛接至容器或建立備份目錄時建立。

[global]
# Paths (all mandatory):



repo1-path=/var/lib/postgresql/backups
spool-path=/var/lib/postgresql/backups/spool
lock-path=/var/lib/postgresql/backups


# Retention details:
repo1-retention-full=3
repo1-retention-full-type=count
repo1-retention-diff=16

# Force a checkpoint to start backup immediately:
start-fast=y

# Logging parameters:



log-path=/var/lib/postgresql/backups

log-level-console=info
log-level-file=info

# Recommended ZSTD compression:
compress-type=zst

# Other performance parameters:
archive-async=y
archive-push-queue-max=1024MB
archive-get-queue-max=256MB
archive-missing-retry=y

[global:archive-push]
process-max=2

[global:archive-get]
process-max=2

[omni]
pg1-user=postgres
pg1-socket-path=/tmp



pg1-path=/var/lib/postgresql/data


部分參數為必填,但如有需要,您可以調整其他參數來符合特定需求,例如:

  • repo1-path:備份寫入的目錄位置。建議您選擇主機伺服器和容器都能存取的位置。

  • log-path: 寫入記錄檔的目錄位置。如要將記錄檔寫入其他位置,不與備份檔案混在一起,請調整這項參數。

  • repo1-retention-full:要保留的完整備份數量。

  • repo1-retention-full-type: 保留率的評估依據是數量還是時間範圍 (天數)。

  • repo1-retention-diff: 要保留的差異備份數量。

設定檔中與 AlloyDB Omni 相容的其他非關鍵但建議的參數設定包括:

  • log-level-console:執行 pgBackup 指令時,寫入畫面 (STDOUT) 的記錄層級。您可以在設定檔中調整此值,或使用 --log-level-console 指令列引數覆寫此值。預設值為 warn。

  • start-fast: 強制檢查點快速啟動備份作業。預設值為 n。

  • archive-async: 非同步推送 WAL 區隔檔案,提升效能。預設值為 n。

  • :用於壓縮和傳輸的程序數量上限。process-max這通常會設為主要叢集上的 max_cpu/4,或備用叢集上的 max_cpu/2。預設值為 1。

  • compress-type:要使用的壓縮演算法。預設值為 gz。

還有許多其他 pgBackRest 設定參數可供調整。本文件僅涵蓋預設 AlloyDB Omni 設定的必要參數,以及一些建議的參數設定。如需完整的設定參數清單,請參閱 pgBackRest 設定參考資料線上說明文件。

設定 pgBackRest 後,必須建立節來初始化備份寫入的目標存放區,節會使用設定檔中設定的參數。

如要設定資料庫備份,請完成下列步驟:

  1. 使用 stanza-create 指令建立節。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  2. 設定資料庫備份。

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  3. 重新啟動容器。

    Docker

    docker restart CONTAINER_NAME
    

    Docker

    docker restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  4. 驗證備份設定。

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  5. 執行 pgBackRest 檢查。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。

執行備份

  1. 執行完整備份。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full backup
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full backup
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  2. 執行差異備份。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff backup
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff backup
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。
  3. 備份報表。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    請替換下列變數:

    • CONTAINER_NAME:容器名稱。

設定排程備份

如要設定排定的備份,請建立 Cron 工作,視需要執行 pgbackrest backup 指令。詳情請參閱「排定備份作業」。

自訂設定和遠端備份

基本設定完成後,您可以根據需求和偏好設定調整設定檔,方法是使用 pgBackRest 設定參考資料中記錄的選項。

包括指定位於遠端機器或雲端的其他備份存放區。如果您定義多個存放區,pgBackRest 會同時寫入所有存放區,做為預設備份動作。

舉例來說,pgBackRest 支援將 Cloud Storage bucket 做為備份存放區,並提供多種相關設定選項。下一節將示範其中一種使用方式。

使用 Cloud Storage 的設定範例

本節的步驟是以「使用本機備份進行基本設定」一節中介紹的設定檔為基礎。這些修改會定義 Cloud Storage bucket 中的第二個備份存放區,並透過 Identity and Access Management (IAM) 存取。

本範例中的自動驗證樣式,需要 AlloyDB Omni 叢集在 Compute Engine VM 執行個體上執行。如果不是在 Compute Engine VM 執行個體上執行 AlloyDB Omni,您仍可使用其他驗證方式 (例如儲存至本機檔案系統的 Google Cloud 服務帳戶金鑰),將資料備份至 Cloud Storage bucket。

如要擴充先前的設定檔,定義以 Cloud Storage 為基礎的 pgBackRest 存放區,請按照下列步驟操作:

  1. 設定 bucket 權限,允許附加至 VM 執行個體的服務帳戶寫入 bucket。這需要對該服務帳戶設定 Storage 物件使用者 IAM 角色。

  2. 在 pgbackrest.conf 檔案的 [global] 區段中加入下列幾行內容:

    # Cloud Storage access details:
    repo2-type=gcs
    repo2-gcs-key-type=auto
    repo2-storage-verify-tls=n
    
    # Cloud Storage bucket and path details:
    repo2-gcs-bucket=BUCKET_NAME
    repo2-path=PATH_IN_BUCKET
    
    # Cloud Storage backup retention parameters:
    repo2-retention-full=8
    repo2-retention-full-type=count
    

    替換下列變數:

    • BUCKET_NAME:要讓 pgBackRest 儲存備份的 Cloud Storage bucket 名稱。
    • PATH_IN_BUCKET:Cloud Storage bucket 中的目錄路徑,用於指示 pgBackRest 儲存備份。
  3. 使用 pgbackrest stanza-create 指令初始化雲端式備份位置:

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    請替換下列變數:

    • CONTAINER_NAME:您為容器使用的名稱。

使用 pgbackrest stanza-create 指令在 Cloud Storage bucket 中初始化備份存放區後,pgBackRest 可能會備份至兩個位置:

  • 本機檔案系統中的位置,在設定檔的其他位置定義為 repo1-path。如果未在 pgbackrest 指令中指定 --repo,則這是預設位置。

  • Cloud Storage bucket,使用本範例設定的 repo2-gcs-bucket 設定指令定義。如要使用 Cloud Storage bucket,請在 pgbackrest 指令中指定 --repo=2。

後續步驟