使用 Docker 搭建 PostgreSQL 12 主从环境
環(huán)境準(zhǔn)備:一臺安裝了Docker的Linux服務(wù)器。
為了簡化演示環(huán)境,這里只用一臺服務(wù)器來演示,通過不同端口來區(qū)分。
01
—
創(chuàng)建一個docker bridge 網(wǎng)路用于測試
docker network create --subnet=172.18.0.0/24 dockernetwork docker network ls設(shè)置了網(wǎng)段為 172.18.0.0,規(guī)劃主從庫IP端口如下:
主庫 172.18.0.101:5432
從庫 172.18.0.102:5433
02
—
拉取 postgres:12 鏡像
docker pull postgres:1203
—
創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)目錄
mkdir -p /data/psql/master mkdir -p /data/psql/slave mkdir -p /data/psql/repl chown 999:999 /data/psql/master chown 999:999 /data/psql/slave chown 999:999 /data/psql/replmaster:主庫數(shù)據(jù)
slave:從庫數(shù)據(jù)
repl:臨時使用復(fù)制數(shù)據(jù)
04
—
運(yùn)行master容器
docker run -d \ --network dockernetwork --ip 172.18.0.101 -p 5432:5432 \ --name pg12master -h pg12master \ -e LANG="C.UTF-8" \ -e 'TZ=Asia/Shanghai' \ -e "POSTGRES_DB=postgres" \ -e "POSTGRES_USER=postgres" \ -e "POSTGRES_PASSWORD=postgres" \ -v /data/psql/master:/var/lib/postgresql/data \ postgres:1205
—
查看容器運(yùn)行情況
docker ps -a -f network=dockernetwork --format "table {{.Names}}\t{{.Image}}\t{{.RunningFor}}\t{{.Status}}\t{{.Networks}}\t{{.Ports}}"06
—
創(chuàng)建主從流復(fù)制專用賬號
用客戶端工具連接數(shù)據(jù)庫后執(zhí)行以下語句,這里我使用了pgAdmin4。
CREATE ROLE repuser WITHLOGINREPLICATIONCONNECTION LIMIT 5PASSWORD 'Q1w2E#';pgAdmin 也可以用 docker 來啟動。
docker pull dpage/pgadmin4 mkdir -p /data/pgadmin4 chown 5050:5050 /data/pgadmin4docker run -d --restart=unless-stopped \ --network dockernetwork --ip 172.18.0.105 \ --name pgadmin4 -h pgadmin4 \ -e TZ=Asia/Shanghai \ -e 'PGADMIN_DEFAULT_EMAIL=admin@pgadmin4.com' \ -e 'PGADMIN_DEFAULT_PASSWORD=pgadmin4' \ -p 5430:80 \ -v /data/pgadmin4:/var/lib/pgadmin \ dpage/pgadmin4通過 http://ip:5430/即可訪問pgadmin4,賬號密碼如腳本所示。具體使用也很簡單,自己摸索下就懂了。
07
—
修改配置文件 /data/psql/master/pg_hba.conf
cd /data/psql/master nano pg_hba.conf在文末添加如下一行,其中 repuser 即我們新建的主從專用賬號,172.18.0.102/32 為從庫 ip。
host replication repuser 172.18.0.102/32 md508
—
修改配置文件 /data/psql/master/postgresql.conf
nano postgresql.conf查找文件中以下幾個參數(shù),并調(diào)整如下:
archive_mode = on archive_command = '/bin/date' max_wal_senders = 10 wal_keep_segments = 16 synchronous_standby_names = '*'09
—
重啟主庫使設(shè)置生效
#使用 pg_ctl stop 安全停止數(shù)據(jù)庫 docker exec -it -u postgres pg12master pg_ctl stop docker start pg12master10
—
創(chuàng)建從庫容器
docker run -d \ --network dockernetwork --ip 172.18.0.102 -p 5433:5432 \ --name pg12slave -h pg12slave \ -e LANG="C.UTF-8" \ -e 'TZ=Asia/Shanghai' \ -e "POSTGRES_DB=postgres" \ -e "POSTGRES_USER=postgres" \ -e "POSTGRES_PASSWORD=postgres" \ -v /data/psql/slave:/var/lib/postgresql/data \ -v /data/psql/repl:/var/lib/postgresql/repl \ postgres:12這里我們把/data/psql/repl掛載到容器中,再看下容器列表:
docker ps -a -f network=dockernetwork --format "table {{.Names}}\t{{.Image}}\t{{.RunningFor}}\t{{.Status}}\t{{.Networks}}\t{{.Ports}}"主從庫容器都已經(jīng)跑起來了,當(dāng)然了,這個從庫還沒配置。
11
—
進(jìn)入從庫容器,同步初始主庫數(shù)據(jù)到 repl 目錄
docker exec -it -u postgres pg12slave /bin/bash pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h 172.18.0.101 -p 5432 -U repuser根據(jù)提示輸入repuser的密碼Q1w2E#后,會在宿主機(jī)的 /data/psql/repl 目錄生成備份。
備份成功,退出容器。
exit12
—
重建 slave 容器
通過上一步的初始備份,現(xiàn)在可以使用 /data/psql/repl 里的數(shù)據(jù)重建 slave容器了。首先刪除slave目錄,然后將repl目錄改為slave,這個目錄就是從庫的數(shù)據(jù)目錄了。
docker stop pg12slave && docker rm pg12slave cd /data/psql/ rm -rf slave mv repl slave cd /data/psql/slave# postgresql.auto.conf 將含有復(fù)制所需信息 cat postgresql.auto.conf檢查 postgresql.auto.conf 文件里是否包含如下內(nèi)容:
primary_conninfo = 'user=repuser password=''Q1w2E#'' host=172.18.0.101 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'正確無誤后,重建容器。
這里不再掛載repl了,slave容器運(yùn)行起來后,主從創(chuàng)建完成。
13
—
查看主從復(fù)制信息
# 驗(yàn)證主從 ps -aux | grep postgres # 主庫有 walsender 進(jìn)程如下 postgres: walsender repuser # 從庫有 walreceiver 進(jìn)程如下 postgres: walreceiver連接主庫,通過sql可以查詢復(fù)制信息:
14
—
總結(jié)
以上是在單機(jī)環(huán)境下的演示,在實(shí)際生產(chǎn)環(huán)境中,只要調(diào)整相應(yīng)的賬號密碼ip端口即可實(shí)現(xiàn)類似效果,其他配置信息具體根據(jù)自己需要再行調(diào)整。
dotnet core 下連接PostgreSQL的庫主要是Npgsql,Entity Framework Core 下可以使用包Npgsql.EntityFrameworkCore.PostgreSQL。相較于MySQL,PostgreSQL對SQL標(biāo)準(zhǔn)的支持更完整,功能更強(qiáng)大。網(wǎng)上對這兩個數(shù)據(jù)庫的比較很多,這里就不多贅述了。
歡迎關(guān)注公眾號 "dotnet 新征程"
總結(jié)
以上是生活随笔為你收集整理的使用 Docker 搭建 PostgreSQL 12 主从环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帮 vs2019 找回丢失的 SDK
- 下一篇: Asp.Net Boilerplate微