背景
現有一需求是將線上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;
這種方案還是有很多弊端,尤其在數據量偏大的時候會有比較多的問題,有什麼更好的方案歡迎留言,下次我可以調試一下新的方案。