利用Docker部署PostgreSQL 12.4主從方式
通過Docker部署PG主從
主要用于測試,通過 Docker 快速部署 PG 主從。
環(huán)境架構(gòu)
基于PG 12.4 版本安裝
| IP | 角色 |
|---|---|
| 172.18.12.100 | 主 |
| 172.18.12.101 | 從 |
部署
下載鏡像,運(yùn)行容器,配置主從。
步驟1:下載鏡像
[root@lei ~]# docker pull postgres:12.4-alpine
官方鏡像地址:https://hub.docker.com/_/postgres?tab=description
可根據(jù)自己需要下載其他版本的 PG。
步驟2:配置網(wǎng)絡(luò)
在開始之前需要為每個容器指定一個IP,雖然不指定也可以,當(dāng)時IP可能 會隨時變動導(dǎo)致 PG 主從復(fù)制失敗。
所以最好手動為每個容器指定一個IP地址。
創(chuàng)建網(wǎng)絡(luò)
docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.12.1 mynet
查看當(dāng)前網(wǎng)絡(luò)配置
[root@lei ~]# docker inspect mynet
[
{
"Name": "mynet",
"Id": "9bcbf9f08168af8ee61f766014629bce6adbe11e00842f53ab2bc84615ddc2e2",
"Created": "2020-11-09T16:01:03.276711818+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.12.0/16",
"Gateway": "172.18.12.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
注意:指定IP地址,只能自定義網(wǎng)絡(luò)。
步驟3:運(yùn)行容器
通過指定端口映射,目錄映射,容器名,IP地址運(yùn)行容器。
- 主
[root@lei ~]# mkdir -p /home/pg_p/data [root@lei ~]# docker run --name pg_p --restart=always --network=mynet --ip 172.18.12.100 -v /home/pg_p/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:12.4-alpine
- 從
[root@lei ~]# mkdir -p /home/pg_s/data [root@lei ~]# docker run --name pg_s --restart=always --network=mynet --ip 172.18.12.101 -v /home/pg_s/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5433:5432 -d postgres:12.4-alpine
參數(shù)說明:
- –name:指定容器名,隨便寫
- –restart=always:表示容器隨著docker進(jìn)程自動啟動
- –network,–ip:容器指定IP
- -v :將容器內(nèi)的目錄映射(/var/lib/postgresql/data)到本機(jī)目錄(/home/pg_s/data)
- -e:其他參數(shù)
- -p:端口映射,將容器內(nèi)的端口映射到本機(jī)端口,前面是本機(jī)端口,后面是容器端口。
- -d:鏡像名稱
步驟4:正常配置主從相關(guān)參數(shù)
進(jìn)入容器命令:
[root@lei ~]# docker exec -it pg_p /bin/bash bash-5.0# su - postgres bff818d570c9:~$ psql psql (12.4) Type "help" for help. postgres=#
主庫
1.創(chuàng)建復(fù)制用戶
CREATE ROLE replica login replication encrypted password 'replica';
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
replica | Replication | {}
2.修改 pg_hba.conf
修改pg_hba.conf,允許 replica用戶從 172.18.12.101 從庫上連接主庫。
配置文件在本地:/home/pg_p/data目錄下,如:
host replication replica 172.18.12.101/32 trust #允許172.18.12.101使用 replica 用戶來復(fù)制
我這里改為0.0.0.0/0,表示所有IP都可以連接主庫,生產(chǎn)環(huán)境不要這么設(shè)置。
3.修改postgresql.conf
必須修改的配置是前面三個,后面幾個看情況修改。
listen_addresses = '*' # 監(jiān)聽所有IP archive_mode = on # 允許歸檔 wal_level = replica # 開啟熱備 archive_command = '/bin/date' # 用該命令來歸檔logfile segment,這里取消歸檔。 max_wal_senders = 32 # 這個設(shè)置了可以最多有幾個流復(fù)制連接,差不多有幾個從,就設(shè)置幾個 wal_keep_segments = 64 # 設(shè)置流復(fù)制保留的最多的xlog數(shù)目,一份是 16M,注意機(jī)器磁盤 16M*64 = 1G wal_sender_timeout = 60s # 設(shè)置流復(fù)制主機(jī)發(fā)送數(shù)據(jù)的超時時間 max_connections = 200 # 這個設(shè)置要注意下,從庫的max_connections必須要大于主庫的
4.最后重啟容器,使配置生效。
docker restart pg_p
5.驗證配置是否生效
postgres=# show archive_mode; archive_mode-------------- on(1 row)
從庫
修改從庫相關(guān)配置,以及從主庫初始化數(shù)據(jù)過來。
1.初始化數(shù)據(jù)
進(jìn)入容器刪除原始數(shù)據(jù)文件,利用pg_basebackup從主庫初始化數(shù)據(jù)。
[root@lei ~]# docker exec -it pg_s /bin/bash bash-5.0# su - postgres # 刪除原有數(shù)據(jù)文件 cedd81ee4e30:~$ rm -rf /var/lib/postgresql/data/* # 備份恢復(fù) cedd81ee4e30:~$ pg_basebackup -h 172.18.12.100 -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data pg_basebackup: initiating base backup, waiting for checkpoint to complete pg_basebackup: checkpoint completed pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1 pg_basebackup: starting background WAL receiver pg_basebackup: created temporary replication slot "pg_basebackup_43" 24636/24636 kB (100%), 1/1 tablespace pg_basebackup: write-ahead log end point: 0/2000138 pg_basebackup: waiting for background process to finish streaming ... pg_basebackup: syncing data to disk ... pg_basebackup: base backup completed
2.新增并配置standby.signal文件
standby_mode = 'on'
3.修改 postgresql.conf
wal_level = replica # WAL 日志級別為 replica primary_conninfo = 'host=172.18.12.100 port=5432 user=replica password=replica' # 主庫連接信息 hot_standby = on # 恢復(fù)期間,允許查詢 recovery_target_timeline = latest # 默認(rèn) max_connections = 120 # 大于等于主節(jié)點(diǎn),正式環(huán)境應(yīng)當(dāng)重新考慮此值的大小
4.重啟容器
[root@lei ~]# docker restart pg_s
步驟5:驗證主從是否正常
**方法1:**主庫上執(zhí)行以下命令,可以看到從庫信息
postgres=# select client_addr,sync_state from pg_stat_replication; client_addr | sync_state ---------------+------------ 172.18.12.101 | async (1 row)
**方法2:**主庫上新建數(shù)據(jù)庫
- 主庫
CREATE DATABASE
postgres=#
postgres=# \c lei
You are now connected to database "lei" as user "postgres".
lei=# create table test(name varchar(50));
CREATE TABLE
lei=# insert into test values('tom');
INSERT 0 1
- 從庫
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
lei | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres-# \c lei
You are now connected to database "lei" as user "postgres".
lei=# select * from test;
name
------
tom
(1 row)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker Network(網(wǎng)絡(luò))詳解
這篇文章主要介紹了docker Network(網(wǎng)絡(luò)),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
iptables使用及docker的iptables規(guī)則
Docker在創(chuàng)建容器時,會自動添加一些iptables規(guī)則來實現(xiàn)網(wǎng)絡(luò)隔離和轉(zhuǎn)發(fā)等功能,本文主要介紹了iptables使用及docker的iptables規(guī)則,具有一定的參考價值,感興趣的可以了解一下2023-12-12
jenkins+gitlab+nginx部署前端應(yīng)用實現(xiàn)
在日常開發(fā)中,往往可能同時多個項目并行進(jìn)行開發(fā),本文介紹了jenkins+gitlab+nginx部署前端應(yīng)用實現(xiàn),感興趣的可以了解一下2021-05-05
Docker?Desktop容器的自啟動設(shè)置修改步驟
Docker作為一種輕量級的容器化技術(shù),在開發(fā)、測試、部署等環(huán)節(jié)發(fā)揮著至關(guān)重要的作用,這篇文章主要介紹了Docker?Desktop容器的自啟動設(shè)置修改的相關(guān)資料,需要的朋友可以參考下2025-04-04
使用DockerFile構(gòu)建docker鏡像掛載目錄,數(shù)據(jù)卷同步問題
這篇文章主要介紹了使用DockerFile構(gòu)建docker鏡像掛載目錄,數(shù)據(jù)卷同步問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
docker中如何將jar包構(gòu)建成鏡像并執(zhí)行
這篇文章主要介紹了docker中如何將jar包構(gòu)建成鏡像并執(zhí)行問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
docker-compose啟動的容器一直處于restarting狀態(tài)的問題解決
本文主要介紹了docker-compose啟動的容器一直處于restarting狀態(tài)的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11

