【數據庫】【postgres】將docker部署的正在運行的單節點Postgresql調整爲主從結構的Postgresql

背景

現有一需求是將線上postgres從單節點提升到主從結構,網上所說方案大多都是從無到有的配置一個主從的pg數據庫,對於運行中的pg擴展沒有資料,所以本人在測試環境測通了一種方法,在此記錄一下,給有類似需求的大兄弟們提供一些方便,可以結合自己的業務情況進行參考。

環境(阿里雲)&配置

  • 操作系統:ubuntu 16.4
  • 數據庫版本:postgres10
  • docker版本:18.09.7
  • docker-compose版本:1.17.1

postgres的鏡像配置

version: '2'
services:
 postgres:
   restart: always
   image: postgres:10
   container_name: postgres
   privileged: true
   ports:
     - 6432:5432
   environment:
     POSTGRES_PASSWORD: postgres
     PGDATA: /var/lib/postgresql/data/pgdata
   volumes:
     - /data/pg_data:/var/lib/postgresql/data/pgdata

操作步驟

簡要描述

主節點需要操作的步驟

在掛載出來的配置文件pg_hba.conf,增加replica用戶,用於同步。下方的ip換成你的服務器

host    replication     replica     <ip>/32                 md5

然後在docker容器中給postgres設置密碼,登錄和備份權限。

docker-compose exec postgres bash # 進入容器內部
su postgres # 切換權限
psql # 進入postgres的sql界面
CREATE ROLE replica login replication encrypted password 'replica' # 創建用戶,引號中設置你需要的密碼

在掛載出來的配置文件postgresql.conf,添加下面的參數

wal_level = hot_standby 
max_wal_senders = 32 
wal_keep_segments = 256 
wal_sender_timeout = 60s 
max_connections = 100 

接下來就重啓容器,後續只需要動從的機器就能把主從機器給配置好了。

docker-compose restart postgres

從節點需要操作的步驟

重點思路: 從節點主要是如果要替換掉以前這個文件下所有的文件的話,那麼docker容器會不斷的重啓,導致添加從節點的失敗,現在的方案就是同步到另外一個文件夾下面,然後把文件配置的路徑指向新的路徑。

version: '2'
services:
  postgres:
    restart: always
    image: postgres:10
    container_name: postgres
    privileged: true
    ports:
      - 6432:5432
    environment:
      POSTGRES_PASSWORD: postgres
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - /data/pg_data:/var/lib/postgresql/data/pgdata
      - /data/pg_bak:/var/lib/postgresql/data/pgbak

啓動pg服務,然後備份主庫數據的命令如下

pg_basebackup -F p --progress -D /var/lib/postgresql/data/pgbak -h <ip> -p 5432 -U replica --password

接下來就是在pgbak中添加recovery.conf文件

宿主機中添加recovery.conf可以直接去掛載的目錄下添加,如果是容器內添加recovery.conf得先下載vim,下載vim命令如下:

apt-get update
apt install vim

recovery.conf的內容就得按照自己的情況去做調整

standby_mode = on  # 這個說明這臺機器爲從庫
primary_conninfo = 'host=<ip> port=6432 user=replica password=postgres'  
recovery_target_timeline = 'latest' 

在postgresql.conf添加如下參數

max_connections = 1000 
hot_standby = on  
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 1s
hot_standby_feedback = on 

修改一下docker-compose配置重新啓動postgres服務,要刪除掉以前的容器。

version: '2'
services:
  postgres:
    restart: always
    image: postgres:10
    container_name: postgres
    privileged: true
    ports:
      - 6432:5432
    environment:
      POSTGRES_PASSWORD: postgres
      PGDATA: /var/lib/postgresql/data/pgbak
    volumes:
      - /data/pg_data:/var/lib/postgresql/data/pgdata
      - /data/pg_bak:/var/lib/postgresql/data/pgbak

下面是要運行的命令

docker-compose stop postgres
docker-compose rm postgres
docker-compose up -d postgres

這樣按道理來說就已經好了,最後去主節點上面驗證一下就好了,驗證的sql在下方。去哪查大家應該知道,就不重複展示了。

select * from pg_stat_replication;

這種方案還是有很多弊端,尤其在數據量偏大的時候會有比較多的問題,有什麼更好的方案歡迎留言,下次我可以調試一下新的方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章