基于Docker的postgresql主備部署文檔
1 背景
目前項(xiàng)目的很多基礎(chǔ)組件需要用到postgresql感帅,且要求主從復(fù)制的部署方式.根據(jù)gitlab對(duì)postgres的要求,鏡像采用官方postgres:10.12鏡像.
2 環(huán)境
postgresql部署到專有云的ECS上.
10.129.8.212 部署主數(shù)據(jù)庫
10.129.8.214 部署從數(shù)據(jù)庫
3 安裝部署
3.1 主服務(wù)器
- docker拉取鏡像
docker pull postgres:10.12
- 啟動(dòng)容器
docker run -d --name kong-database \
-p 5432:5432 \
-e POSTGRES_PASSWORD=Qwer@1234 \
-v /home/work/data/postgres:/var/lib/postgresql/data \
postgres:10.12
-v : 建立數(shù)據(jù)卷,將 docker 內(nèi)的文件系統(tǒng)掛載到宿主機(jī)上帚屉, linux 目錄:/home/work/data/postgres, docker 容器對(duì)應(yīng)的路徑 /var/lib/postgresql/data
- 進(jìn)入啟動(dòng)的 docker 容器內(nèi)部吕粹,新建用于歸檔日志的目錄
docker exec -it kong-database /bin/bash
mkdir -p /var/lib/postgresql/data/pg_archive
- 進(jìn)入 postgres 客戶端庭敦,新建用于同步數(shù)據(jù)的用戶
# 切換到 postgres 用戶
su postgres
# 進(jìn)去 postgres 客戶端
psql
# 創(chuàng)建用戶
CREATE ROLE replica login replication encrypted password 'replica';
注:注意語句最后添加分號(hào)
創(chuàng)建用戶成功之后历涝,控制臺(tái)會(huì)顯示 "CREATE ROLE"扭倾,利用 \du
命令可以查看 postgres 的用戶列表
[圖片上傳失敗...(image-cc7ae0-1586956407823)]
通過 \q
退出 postgres 控制臺(tái)淀零,并通過 exit
退出 postgres 用戶
- 修改 pg_hba.conf 文件
修改 pg_hba.conf 文件,允許剛創(chuàng)建的 replica 用戶從 10.129.8.214 從服務(wù)器上連接主服務(wù)器膛壹。
vi /var/lib/postgresql/data/pg_hba.conf
如上顯示 vi 命令沒有安裝驾中,通過如下命令進(jìn)行安裝
_
apt-get update
apt-get install vim
安裝成功之后,再次修改 pg_hba.conf 文件模聋,進(jìn)入最后部分肩民,添加如下:
host replication replica 10.129.8.214/32 trust #允許214機(jī)器使用 replica 用戶來復(fù)制
- 修改 postgresql.conf
listen_addresses = '*' # 監(jiān)聽所有IP
archive_mode = on # 允許歸檔
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f' # 用該命令來歸檔logfile segment
wal_level = hot_standby #開啟熱備
max_wal_senders = 32 # 這個(gè)設(shè)置了可以最多有幾個(gè)流復(fù)制連接,差不多有幾個(gè)從链方,就設(shè)置幾個(gè)
wal_keep_segments = 64 # 設(shè)置流復(fù)制保留的最多的xlog數(shù)目持痰,一份是 16M,注意機(jī)器磁盤 16M*64 = 1G
wal_sender_timeout = 60s # 設(shè)置流復(fù)制主機(jī)發(fā)送數(shù)據(jù)的超時(shí)時(shí)間
max_connections = 100 # 這個(gè)設(shè)置要注意下祟蚀,從庫的max_connections必須要大于主庫的
- 重啟容器
通過 exit
命令退出容器工窍,并重啟啟動(dòng)容器
docker restart kong-database
3.2 從服務(wù)器
- 同樣利用 docker 在 10.129.8.214 機(jī)器上新建一個(gè) postgres 容器
docker run -d --name kong-database \
-p 5432:5432 \
-e POSTGRES_PASSWORD=Qwer@1234 \
-v /home/work/data/postgres:/var/lib/postgresql/data \
postgres:10.12
- 拷貝主服務(wù)器數(shù)據(jù)
通過 docker exec -it kong-database /bin/bash
進(jìn)入容器內(nèi)部,拷貝主服務(wù)器數(shù)據(jù)
su postgres # 切換 postgres 用戶
rm -rf /var/lib/postgresql/data/* # 清楚從庫數(shù)據(jù)
pg_basebackup -h 192.168.14.187 -U replica -D /var/lib/postgresql/data -X stream -P
mkdir -p /var/lib/postgresql/data/pg_archive
執(zhí)行完上述命令之后前酿,容器自動(dòng)退出
[圖片上傳失敗...(image-ac34b7-1586956407823)]
切換到宿主機(jī)的 root 賬戶患雏,進(jìn)入 /home/work/data/postgres
目錄。
- 添加 recovery.conf 文件
通過 vi /home/work/data/postgres/recovery.conf
添加恢復(fù)配置文件
standby_mode = on # 說明該節(jié)點(diǎn)是從服務(wù)器
primary_conninfo = 'host=10.129.8.212 port=5432 user=replica password=replica' # 主服務(wù)器的信息以及連接的用戶
recovery_target_timeline = 'latest'
- 修改 postgresql.conf
vi /home/work/data/postgres/postgresql.conf
wal_level = hot_standby
max_connections = 1000 # 一般查多于寫的應(yīng)用從庫的最大連接數(shù)要比較大
hot_standby = on # 說明這臺(tái)機(jī)器不僅僅是用于數(shù)據(jù)歸檔薪者,也用于數(shù)據(jù)查詢
max_standby_streaming_delay = 30s # 數(shù)據(jù)流備份的最大延遲時(shí)間
wal_receiver_status_interval = 10s # 多久向主報(bào)告一次從的狀態(tài)纵苛,當(dāng)然從每次數(shù)據(jù)復(fù)制都會(huì)向主報(bào)告狀態(tài),這里只是設(shè)置最長的間隔時(shí)間
hot_standby_feedback = on # 如果有錯(cuò)誤的數(shù)據(jù)復(fù)制,是否向主進(jìn)行反饋
- 啟動(dòng)容器
通過 docker start kong-database
再次啟動(dòng)容器
4 校驗(yàn)主從部署
到 10.129.8.212主服務(wù)器地址上校驗(yàn)主從是否部署成功
通過 docker exec -it kong-database /bin/bash
進(jìn)入容器內(nèi)部
su postgres
psql
select client_addr,sync_state from pg_stat_replication;
得到如下結(jié)果則表示主從復(fù)制成功
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
---------------+------------
10.129.8.214 | async
(1 row)
如果還不放心,可以在主數(shù)據(jù)庫中創(chuàng)建新表和插入數(shù)據(jù),觀察從服務(wù)器是否有復(fù)制過來,