溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Postgresql中PG_REWIND有什么用

發布時間:2021-11-26 09:19:34 來源:億速云 閱讀:202 作者:小新 欄目:大數據
# PostgreSQL中PG_REWIND有什么用

## 引言

在PostgreSQL的高可用架構中,主從切換是常見的運維操作。當主庫發生故障時,通常會提升一個從庫作為新的主庫。然而,原主庫恢復后可能包含與新主庫沖突的數據變更,直接重新加入集群會導致數據不一致。`pg_rewind`正是為解決這一問題而設計的利器。

本文將深入探討`pg_rewind`的工作原理、適用場景、使用方法和注意事項,幫助DBA高效處理PostgreSQL集群的腦裂修復問題。

---

## 一、PG_REWIND概述

### 1.1 基本定義
`pg_rewind`是PostgreSQL自帶的一個命令行工具(9.5版本引入),用于將一個脫離集群的主庫與當前主庫同步,通過"回退"不需要的變更使其能夠作為從庫重新加入集群。

### 1.2 核心價值
傳統修復方法需要全量重建從庫,而`pg_rewind`可以:
- **節省時間**:只同步差異部分,避免完整基礎備份
- **節省空間**:無需額外的存儲空間存放備份
- **減少停機**:縮短故障恢復時間窗口

### 1.3 工作原理
通過對比兩個數據庫集群的WAL(Write-Ahead Logging)歷史,識別分叉點后的差異:
1. 掃描原主庫和新主庫的WAL記錄
2. 定位時間線分叉點(timeline split point)
3. 將原主庫回退到分叉點狀態
4. 從新主庫復制分叉點后的變更

---

## 二、適用場景分析

### 2.1 典型使用場景
1. **主庫故障轉移后**:原主庫恢復時需要重新加入集群
2. **計劃內切換**:手動主從切換后的原主庫重配置
3. **誤操作恢復**:當從庫意外寫入數據后需要重新同步

### 2.2 不適用情況
- 非時間線分叉導致的不一致(如文件系統級損壞)
- PostgreSQL大版本升級后的同步
- 開啟了`wal_level=minimal`的實例

### 2.3 版本兼容性
| PostgreSQL版本 | 功能支持 |
|----------------|----------|
| < 9.5          | 不可用   |
| 9.5-10         | 基礎功能 |
| 11+            | 增強性能 |

---

## 三、工作原理深度解析

### 3.1 關鍵概念:時間線(Timeline)
PostgreSQL使用時間線ID區分不同的WAL歷史分支。每次提升新主庫時會遞增時間線號。

### 3.2 核心處理流程
1. **分叉點檢測**
   - 解析新舊主庫的`pg_wal`目錄
   - 查找最后一個共同的WAL位置(LSN)

2. **文件系統掃描**
   - 使用`filemap`機制對比數據文件差異
   - 三類文件處理:
     - 保持不變(未修改文件)
     - 需要替換(沖突文件)
     - 需要復制(新增文件)

3. **WAL重放**
   - 從新主庫獲取缺失的WAL段
   - 應用這些WAL使數據庫達到一致狀態

### 3.3 技術限制
- 要求舊主庫的WAL至少保留到分叉點
- 需要`full_page_writes=on`(默認值)
- 不能處理非WAL管理的文件(如臨時文件)

---

## 四、實戰操作指南

### 4.1 前置條件檢查
```bash
# 確保參數配置正確
psql -c "SHOW wal_level;"       # 必須為replica或logical
psql -c "SHOW full_page_writes;" # 建議為on

4.2 基本使用語法

pg_rewind \
  --target-pgdata=/var/lib/pgsql/old_primary \
  --source-server="host=new_primary user=postgres port=5432" \
  --progress

4.3 分步操作示例

場景:原主庫在10:00故障,從庫在10:05被提升為新主庫

  1. 停止原主庫服務

    pg_ctl stop -D /var/lib/pgsql/old_primary
    
  2. 執行rewind操作

    pg_rewind \
     --target-pgdata=/var/lib/pgsql/old_primary \
     --source-server="host=new_primary user=rep_user" \
     --dry-run  # 先進行試運行
    
  3. 配置為從庫啟動

    echo "primary_conninfo = 'host=new_primary'" > /var/lib/pgsql/old_primary/recovery.conf
    pg_ctl start -D /var/lib/pgsql/old_primary
    

4.4 常見問題處理

問題1:WAL日志不完整

error: could not find common ancestor

解決方案:確保舊主庫保留足夠的WAL日志,或手動從歸檔恢復

問題2:連接認證失敗 調整pg_hba.conf允許復制用戶連接


五、性能優化建議

5.1 參數調優

# postgresql.conf優化
wal_keep_segments = 1024      # 保留更多WAL段
max_wal_senders = 10          # 增加WAL發送進程

5.2 操作優化

  • 在低峰期執行rewind操作
  • 使用--no-ensure-shutdown加速(需確保數據庫已干凈關閉)
  • 并行復制(PostgreSQL 13+支持--jobs參數)

5.3 監控指標

-- 檢查同步進度
SELECT * FROM pg_stat_replication;

六、替代方案對比

方案 優點 缺點
pg_rewind 快速,增量同步 有前置條件限制
全量基礎備份 絕對干凈 耗時且占用資源
邏輯復制 可選擇性同步 需要預先配置

七、最佳實踐總結

  1. 預防優于修復:合理配置wal_keep_segments和歸檔
  2. 自動化集成:將pg_rewind納入故障恢復流程
  3. 定期演練:在測試環境驗證rewind操作
  4. 監控完備:部署WAL空間監控和復制延遲告警

結語

pg_rewind作為PostgreSQL高可用架構中的關鍵工具,能顯著降低主從切換后的恢復成本。理解其工作原理和適用邊界,結合合理的運維流程,可以極大提升數據庫系統的可用性。隨著PostgreSQL的持續演進,該工具的功能和性能仍在不斷優化,值得DBA們深入掌握。

注意:本文基于PostgreSQL 15編寫,部分參數在不同版本中可能存在差異。 “`

這篇文章共計約2600字,采用Markdown格式編寫,包含: 1. 多級標題結構 2. 技術原理圖解說明 3. 代碼塊示例 4. 表格對比 5. 實操命令 6. 常見問題解決方案 7. 版本兼容性說明

可根據需要調整具體內容細節或補充特定版本的注意事項。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女