身為一個在雲端環境中摸爬滾打多年的技術老貓,我深刻體會到資料函式庫效能、可擴充套件性和高用性對於應用程式的重要性。這篇文章將分享我在 AWS 上使用 PostgreSQL 的一些經驗,包含 RDS 執行個體設定、EC2 連線管理、原生備份與還原策略、RDS 讀取副本設定、以及 pglogical 雙向複製的實戰技巧,希望能幫助大家少走一些彎路。

PostgreSQL 雲端佈署:RDS 執行個體設定與連線管理

首先,我們來看看如何在 AWS 上建立 PostgreSQL 執行個體,並透過 EC2 執行個體進行連線管理。

使用 RDS 快速建立 PostgreSQL 執行個體

  graph LR
    B[B]
    D[D]
    F[F]
    A[登入 AWS 管理主控台] --> B{選擇 RDS 服務};
    B --> C[建立資料函式庫];
    C --> D{選擇 PostgreSQL 引擎};
    D --> E[設定執行個體引數];
    E --> F{設定網路和安全};
    F --> G[啟動資料函式庫];
  1. 登入 AWS 管理主控台,選擇 RDS 服務,然後點選「建立資料函式庫」。
  2. 選擇 PostgreSQL 作為資料函式庫引擎,並選擇您需要的版本。
  3. 設定執行個體識別碼、主要使用者名稱和密碼等引數。
  4. 選擇執行個體類別、儲存型別和大小等。
  5. 設定 VPC、子網路群組和安全群組等網路和安全設定。
  6. 最後,點選「建立資料函式庫」啟動您的 PostgreSQL 執行個體。

RDS 讓建立和管理 PostgreSQL 執行個體變得非常簡單,它自動處理許多底層的基礎架構設定,讓您可以專注於應用程式開發。選擇正確的執行個體類別和儲存型別對於效能至關重要,建議根據您的應用程式需求進行調整。

透過 EC2 執行個體連線到 RDS

  graph LR
    B[B]
    A[啟動 EC2 執行個體] --> B{安裝 PostgreSQL 使用者端};
    B --> C[設定安全群組];
    C --> D[使用 psql 連線];
  1. 啟動一個 EC2 執行個體,並確保它與 RDS 執行個體位於同一個 VPC 中。
  2. 在 EC2 執行個體上安裝 PostgreSQL 使用者端工具:
sudo yum update -y
sudo yum install -y postgresql
  1. 設定 EC2 執行個體的安全群組,允許從 EC2 執行個體連線到 RDS 執行個體的 5432 埠。
  2. 使用 psql 指令從 EC2 執行個體連線到 RDS 執行個體:
psql --host=<RDS_ENDPOINT> --port=5432 --username=<USERNAME> --password=<PASSWORD> --dbname=<DATABASE_NAME>

使用 EC2 執行個體作為跳板連線到 RDS 執行個體是一種常見的做法,它可以提供更高的安全性和控制性。確保 EC2 執行個體的安全群組設定正確,以防止未經授權的存取。

PostgreSQL 資料函式庫備份與還原策略

資料函式庫備份是至關重要的,它可以保護您的資料免受意外損失。以下是在 AWS 上進行 PostgreSQL 備份和還原的幾種方法。

使用 pg_dump 進行原生備份和還原

  graph LR
    B[B]
    A[SSH 登入 EC2] --> B{建立備份目錄};
    B --> C[使用 pg_dump 備份];
    C --> D[上傳備份到 S3];
    D --> E[使用 pg_restore 還原];
  1. SSH 登入您的 EC2 執行個體。
  2. 建立一個目錄來儲存備份:mkdir ~/backups
  3. 使用 pg_dump 建立資料函式庫的備份:
pg_dump -h <RDS_ENDPOINT> -p 5432 -U <USERNAME> -Fc -f ~/backups/backup.dump <DATABASE_NAME>
  1. 將備份檔案上傳到 S3 儲存貯體,以便長期儲存。
  2. 使用 pg_restore 從備份檔案還原資料函式庫:
pg_restore -h <RDS_ENDPOINT> -p 5432 -U <USERNAME> -d <DATABASE_NAME> -v ~/backups/backup.dump

pg_dump 是一個功能強大的工具,可以建立 PostgreSQL 資料函式庫的邏輯備份。-Fc 引數指定使用自定義格式,這是一種壓縮的二進位格式,可以提高備份和還原的速度。

利用 RDS 快照進行備份和還原

RDS 快照是資料函式庫執行個體在特定時間點的完整副本。您可以使用快照來建立新的 RDS 執行個體,或者將現有執行個體還原到先前的狀態。

  graph LR
    B[B]
    A[在 RDS 控制檯中選擇執行個體] --> B{建立快照};
    B --> C[從快照還原];
  1. 在 RDS 控制檯中選擇您的 PostgreSQL 執行個體。
  2. 點選「動作」>「建立快照」。
  3. 為快照提供一個名稱,然後點選「建立快照」。
  4. 要從快照還原,請選擇快照,然後點選「動作」>「還原快照」。

RDS 快照提供了一種簡單與可靠的備份和還原方法。自動備份功能可以自動建立快照,並根據您設定的保留期進行管理。

(以下內容待續)

PostgreSQL 資料函式庫複製實戰:提升效能與高用性

在建構高用性和高效能的應用程式時,資料函式庫複製是不可或缺的技術。我將分享使用 AWS RDS 和 pglogical 擴充套件來實作 PostgreSQL 資料函式庫複製的實戰經驗。

首先,我們需要在 AWS RDS 上設定 PostgreSQL 執行個體,並安裝 pglogical 擴充套件。pglogical 是一個根據邏輯複製的 PostgreSQL 擴充套件,提供更靈活的複製設定。

設定 pglogical 涉及幾個關鍵步驟:

  1. 建立 pglogical 擴充套件: 在主資料函式庫和所有副本上建立 pglogical 擴充套件。

  2. 建立複製集合: 在主資料函式庫上建立一個複製集合,用於定義要複製的資料。

  3. 建立訂閱: 在每個副本上建立一個訂閱,訂閱主資料函式庫的複製集合。

  4. 插入測試資料: 在主資料函式庫中插入一些測試資料,並觀察資料是否同步到副本。

  5. 驗證複製: 在一個執行個體上修改 AdventureWorks 資料函式庫中的資料,確認變更是否同步到其他執行個體。

  6. 監控複製狀態: 使用以下命令檢查訂閱狀態:

SELECT * FROM pglogical.show_subscription_status();
  graph LR
    subgraph 讀取副本架構
        A[主資料函式庫] -->|讀取副本| B(讀取副本 1)
        A -->|讀取副本| C(讀取副本 2)
    end
    subgraph 雙向複製架構
        D[主資料函式庫 1] <-->|雙向複製| E[主資料函式庫 2)
    end

圖表說明瞭讀取副本和雙向複製的架構。讀取副本架構中,主資料函式庫的資料單向複製到讀取副本,適用於讀取負載大的應用。雙向複製架構允許兩個主資料函式庫之間雙向同步資料,適用於需要資料雙向同步的場景。

透過 pglogical,我們可以輕鬆設定 PostgreSQL 的讀取副本和雙向複製,提升應用程式效能和高用性。

資料函式庫遷移策略:從其他資料函式庫系統轉移到 PostgreSQL

資料函式庫遷移是複雜的過程,需要仔細規劃和執行。我將分享四種將資料從其他資料函式庫系統遷移到 PostgreSQL 的策略。

方案一:本地 PostgreSQL 伺服器遷移到 AWS EC2/RDS

此方案著重於將本地 PostgreSQL 伺服器遷移到 AWS 雲端環境。

  1. 建立資料函式庫備份: 使用 pg_dump 命令建立本地 PostgreSQL 資料函式庫的備份。

    pg_dump -U <your_username> -W -F t -f adventureworks_backup.tar adventureworks
    
  2. 傳輸備份到 AWS: 將備份檔案傳輸到 AWS EC2 或 RDS 執行個體。EC2 可使用 SCP 命令,RDS 則可先上傳到 S3 儲存貯體。

  3. 驗證遷移: 在 EC2 或 RDS 執行個體上還原備份,並驗證資料完整性。EC2 上使用 pg_restore 命令,RDS 則透過 PostgreSQL 使用者端連線執行還原操作。

  graph LR
    C[C]
    EC2[EC2]
    RDS[RDS]
    A[本地伺服器] -->|備份| B(備份檔案)
    B -->|傳輸| C{EC2/RDS?}
    C -- EC2 --> D[EC2 執行個體]
    C -- RDS --> E[RDS 執行個體]
    D -->|還原| F[驗證]
    E -->|還原| F

此流程圖展示了本地 PostgreSQL 伺服器遷移到 AWS 的步驟。首先備份資料函式庫,然後根據目標環境 (EC2 或 RDS) 選擇傳輸方式,最後在目標環境還原並驗證。

這個方案讓企業可以利用 AWS 的雲端優勢,提升資料函式庫的可擴充套件性和可用性。

Pgloader:簡化 PostgreSQL 資料遷移

pgloader 是一款功能強大的工具,可以簡化資料遷移到 PostgreSQL 的過程。

  1. 安裝 pgloader: 使用系統套件管理器安裝 pgloader。

    sudo apt-get update
    sudo apt-get install -y pgloader
    
  2. 建立 pgloader 命令檔: 建立一個 .load 檔案,設定來源和目標資料函式庫連線資訊,以及遷移選項。

  3. 執行遷移: 使用 pgloader 命令執行遷移。

從 MySQL 遷移到 PostgreSQL

使用 pgloader 將資料從 MySQL 遷移到 PostgreSQL 十分便捷。步驟與上述類別似,只需調整命令檔中的連線字串和資料型別轉換設定。

設定 Foreign Data Wrapper (FDW)

FDW 允許 PostgreSQL 存取外部資料函式庫的資料。以下是如何設定 FDW 連線到 MySQL:

  1. 安裝 FDW: 安裝 postgresql-13-mysql-fdw 套件。

  2. 定義伺服器物件: 使用 CREATE SERVER 命令定義 MySQL 伺服器。

  3. 定義使用者對映: 使用 CREATE USER MAPPING 命令建立 PostgreSQL 使用者與 MySQL 使用者的對映關係。

  4. 建立 FDW 表格: 使用 CREATE FOREIGN TABLE 命令建立指向 MySQL 表格的 FDW 表格。

  5. 遷移資料: 使用 INSERT INTO ... SELECT 語法將資料從 FDW 表格複製到 PostgreSQL 表格。

  graph LR
    A[PostgreSQL] --> B(FDW)
    B --> C[MySQL]

此圖展示了 PostgreSQL 透過 FDW 存取 MySQL 資料的架構。FDW 作為橋樑,讓 PostgreSQL 可以直接查詢和操作 MySQL 資料。

透過 FDW,我們可以整合不同資料函式庫系統的資料,實作更靈活的資料管理。

PostgreSQL 的 Write-Ahead Logging (WAL) 與 Vacuum 程式對於資料函式庫效能和穩定性至關重要。WAL 機制確保資料函式庫的可靠性,而 Vacuum 則負責回收儲存空間並提升查詢效能。本文中,玄貓將分享多年 PostgreSQL 調校經驗,教你如何有效管理 WAL 檔案、設定歸檔策略、最佳化 Vacuum 程式,開發高效能與安全的 PostgreSQL 資料函式庫。

WAL 檔案管理與效能調校

WAL 檔案的持續增長會佔用大量儲存空間,影響效能。啟用 WAL 壓縮能有效減少 WAL 檔案大小,特別適用於大型資料函式庫。

啟用 WAL 壓縮

postgresql.conf 檔案中,找到 wal_compression 引數,設定為 on

wal_compression = on

重新啟動 PostgreSQL 服務以套用變更:

sudo systemctl restart postgresql

調整 WAL 相關引數

除了壓縮,還可以調整其他 WAL 引數來最佳化效能:

wal_buffers = 16MB  # WAL 資料的分享記憶體大小
checkpoint_timeout = 10min # 自動檢查點之間的最大時間間隔
max_wal_size = 2GB # 檢查點之間 WAL 資料的最大量
min_wal_size = 128MB # 保留的最小 WAL 空間量

wal_buffers 越大,WAL 資料在記憶體中停留的時間越長,減少 I/O 操作;checkpoint_timeout 越長,寫入效能越高,但還原時間也越長;max_wal_sizemin_wal_size 控制 WAL 檔案的大小,需要根據實際情況調整。

  graph LR
    B[B]
    off[off]
    on[on]
A[WAL 檔案] --> B{wal_compression}
B -- on --> C[壓縮]
B -- off --> D[不壓縮]

WAL 歸檔策略

WAL 歸檔將 WAL 檔案備份到單獨的儲存位置,實作時間點還原 (PITR) 並支援複製場景。

設定歸檔命令

postgresql.conf 檔案中,設定 archive_command 引數,指定如何歸檔 WAL 檔案:

archive_command = 'rsync %p user@remotehost:/path/to/archive/%f'

user@remotehost:/path/to/archive/ 替換為你的遠端伺服器資訊和歸檔目錄路徑。

這個命令使用 rsync 將 WAL 檔案複製到遠端伺服器。%p 代表 WAL 檔案的完整路徑,%f 代表 WAL 檔案名稱。

啟用歸檔模式

設定 archive_mode 引數為 on 以啟動 WAL 檔案歸檔:

archive_mode = on

多目標歸檔

PostgreSQL 也支援多個歸檔目標,可以使用 archive_destinations 引數:

archive_destinations = '/local/archive/path, user@remotehost:/remote/archive/path'

多目標歸檔可以提高資料安全性和容錯能力。

  sequenceDiagram
    participant PostgreSQL
    participant Local Storage
    participant Remote Server

    PostgreSQL->>Local Storage: 歸檔 WAL 檔案
    PostgreSQL->>Remote Server: 歸檔 WAL 檔案

Vacuum 程式最佳化

Vacuum 程式回收 dead tuples 佔用的空間,提升查詢效能。

Vacuum 命令

VACUUM sales.orders; -- 基本 Vacuum 操作
VACUUM FULL sales.orders; -- 更徹底的清理,但會鎖定資料表
VACUUM (PARALLEL 2) sales.orders; -- 平行 Vacuum,加快處理速度

VACUUM 命令回收 dead tuples 的空間;VACUUM FULL 更徹底,但會鎖定資料表;VACUUM (PARALLEL) 利用多核心 CPU 加快處理速度。

自動 Vacuum

PostgreSQL 的自動 Vacuum 程式會根據資料表活動自動觸發 Vacuum。

SHOW autovacuum; -- 檢視自動 Vacuum 設定

postgresql.conf 中調整自動 Vacuum 引數:

autovacuum_vacuum_scale_factor = 0.1  -- 當 10% 的資料表被修改時執行 Vacuum
autovacuum_analyze_scale_factor = 0.05 -- 當 5% 的資料表被修改時執行 Analyze

autovacuum_vacuum_scale_factorautovacuum_analyze_scale_factor 控制自動 Vacuum 的觸發頻率。

監控 Vacuum 活動

SELECT relname, last_vacuum, last_autovacuum, n_dead_tup
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000; -- 查詢 dead tuples 數量超過 1000 的資料表

監控 Vacuum 活動可以幫助你瞭解資料函式庫的健康狀況,並及時調整 Vacuum 設定。

透過以上技巧,你可以有效管理 PostgreSQL WAL 和 Vacuum 程式,在效能和資料安全之間取得平衡。記住,根據你的實際環境和需求調整引數,才能達到最佳效果。

  graph LR
    A[WAL 設定] --> B(效能提升)
    C[WAL 歸檔] --> D(資料安全)
    E[Vacuum 最佳化] --> F(空間回收)
    F --> G(效能提升)
    B & G --> H(最佳效能)