Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南
文章目录
本文详细介绍了如何使用 Docker 和 Docker Compose 部署 PostgreSQL 主从架构,实现数据的高效同步。通过网络创建、配置 Docker Compose 文件、设置主从库以及数据同步测试,用户可以轻松搭建高可用的 PostgreSQL 主从集群。文章还包含详细的环境配置、命令执行以及同步测试的示例,确保从主库创建的数据能够实时同步到从库,为构建高可用的数据库环境提供了完整的部署流程和操作指南。
一 主从地址
二 创建db网络
docker network create --driver bridge dbnet
三 docker compose 文件
1)docker-compose.pgsqlmaster.yml
version: '3.0'
services:
postgresql:
image: postgres:14.5
restart: always
container_name: postgresql01
environment:
POSTGRES_PASSWORD: 12345678
working_dir: /postgresql
networks:
- dbnet
ports:
- "5432:5432"
volumes:
- ./pg/data:/var/lib/postgresql/data
networks:
dbnet:
external: true
2)docker-compose.pgsqlslave.yml
version: '3.0'
services:
postgresql:
image: postgres:14.5
restart: always
container_name: postgresql02
environment:
POSTGRES_PASSWORD: 12345678
working_dir: /postgresql
networks:
- dbnet
ports:
- "5432:5432"
volumes:
- ./pg/data:/var/lib/postgresql/data
networks:
dbnet:
external: true
四 部署主库
1)启动 docker-compose.pgsqlmaster.yml 文件
2)进入容器
docker exec -it your-容器-id /bin/bash
3)在容器中运行相关命令
# 切换为postgres用户
su postgres
# 运行 psql
psql
# 创建 replica 角色
CREATE ROLE replica login replication encrypted password 'replica'; #创建用户
#列出数据库用户和角色
\du
exit;
4)配置 postgresql.conf
# 在宿主机目录 ./pg/data 下编辑 postgresql.conf
sudo vi postgresql.conf
改为如下内容
listen_addresses = '*'
archive_mode = on
archive_command = '/bin/date'
max_connections = 300
max_wal_senders = 32
wal_sender_timeout = 60s
wal_keep_size = 16
wal_level = replica
5)配置 pg_hba.conf
# 新增配置
# 在宿主机目录 ./pg/data 下编辑 pg_hba.conf
host replication replica 192.168.0.2/32 trust
五 部署从库
1)启动 docker-compose.pgsqlslave.yml 文件
2)进入容器
docker exec -it your-容器-id /bin/bash
3)在容器中运行相关命令
# 此时可能会退出容器,只需要重新登入进去即可
rm -rf /var/lib/postgresql/data/*
# 注 此操作之后立即 运行 pg_basebackup 否则容易报错 无法备份
# 如果退出了,则再次进入
docker exec -it your-容器-id /bin/bash
# 进入容器之后运行
pg_basebackup -R -D /var/lib/postgresql/data -P -h 192.168.0.1 -p 5432 -U replica
# 显示 26288/26288 kB (100%), 1/1 tablespace
# 退出容器重启 docker
docker restart postgresql02
## 查看 ./pg/data 下的 postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica passfile=''/root/.pgpass'' channel_binding=prefer host=192.168.0.1 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
六 查看进程
# 主机
ps -ef|grep postgres
polkitd 10848 10828 0 9月28 ? 00:00:04 postgres
polkitd 10927 10848 0 9月28 ? 00:00:00 postgres: checkpointer
polkitd 10928 10848 0 9月28 ? 00:00:01 postgres: background writer
polkitd 10929 10848 0 9月28 ? 00:00:01 postgres: walwriter
polkitd 10930 10848 0 9月28 ? 00:00:02 postgres: autovacuum launcher
polkitd 10931 10848 0 9月28 ? 00:00:00 postgres: archiver last was 000000010000000000000003.00000028.backup
polkitd 10932 10848 0 9月28 ? 00:00:04 postgres: stats collector
polkitd 10933 10848 0 9月28 ? 00:00:00 postgres: logical replication launcher
polkitd 13939 10848 0 9月28 ? 00:00:01 postgres: walsender replica 192.168.0.2(34102) streaming 0/401A270
your 21783 21135 0 17:32 pts/1 00:00:00 grep --color=auto postgres
# 从机查看从数据库
docker ps |grep postgres
your-容器-id postgres:14.5 "docker-entrypoint.s…" 24 hours ago Up 24 hours 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgresql02
七 测试同步
# 在主机容器中
postgres=# create database test12;
CREATE DATABASE
postgres=# \list
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
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
test12 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(5 rows)
# 在从机查看已经同步
postgres=# \list
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
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
test12 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(5 rows)