Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南

Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南

文章目录

      • [Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南](#Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南)
        • [一 主从地址](#一 主从地址)
        • [二 创建db网络](#二 创建db网络)
        • [三 docker compose 文件](#三 docker compose 文件)
        • [四 部署主库](#四 部署主库)
        • [五 部署从库](#五 部署从库)
        • [六 查看进程](#六 查看进程)
        • [七 测试同步](#七 测试同步)

本文详细介绍了如何使用 Docker 和 Docker Compose 部署 PostgreSQL 主从架构,实现数据的高效同步。通过网络创建、配置 Docker Compose 文件、设置主从库以及数据同步测试,用户可以轻松搭建高可用的 PostgreSQL 主从集群。文章还包含详细的环境配置、命令执行以及同步测试的示例,确保从主库创建的数据能够实时同步到从库,为构建高可用的数据库环境提供了完整的部署流程和操作指南。

预备课 :Docker 安装与配置:从入门到部署

一 主从地址
IP地址 名称 备注
192.168.0.1 postgresql01 主库
192.168.0.2 Postgresql02 从库
二 创建db网络
shell 复制代码
docker network create --driver bridge dbnet
三 docker compose 文件

1)docker-compose.pgsqlmaster.yml

yaml 复制代码
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

yaml 复制代码
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)进入容器

shell 复制代码
docker exec -it your-容器-id /bin/bash

3)在容器中运行相关命令

shell 复制代码
# 切换为postgres用户
su postgres

# 运行 psql
psql
# 创建 replica 角色
CREATE ROLE replica login replication encrypted password 'replica'; #创建用户
#列出数据库用户和角色
\du
exit;

4)配置 postgresql.conf

shell 复制代码
# 在宿主机目录 ./pg/data 下编辑 postgresql.conf
sudo vi postgresql.conf

改为如下内容

properties 复制代码
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

properties 复制代码
# 新增配置
# 在宿主机目录 ./pg/data 下编辑 pg_hba.conf
host    replication     replica      192.168.0.2/32            trust
五 部署从库

1)启动 docker-compose.pgsqlslave.yml 文件

2)进入容器

shell 复制代码
docker exec -it your-容器-id /bin/bash

3)在容器中运行相关命令

shell 复制代码
# 此时可能会退出容器,只需要重新登入进去即可
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'
六 查看进程
shell 复制代码
# 主机
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
七 测试同步
shell 复制代码
# 在主机容器中
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)
相关推荐
孟健2 小时前
实测 agent-desktop:AI 控制桌面不截图、不占鼠标键盘,连点 55 次计算器 0 失误
人工智能·架构·开源
YYYing.3 小时前
【K8s系列 (一) 】Docker与容器(上篇)
docker·云原生·容器·kubernetes
你三大爷3 小时前
Netty / Kafka / Redis 保序问题的源码对比与 NIO 框架主流解法
后端·架构
神鹰手哥_起飞版3 小时前
从一张像素网格,理解康威生命游戏的核心机制
架构
csdn_aspnet4 小时前
使用 Docker 和 RedisInsight 设置 Redis 以进行本地开发
redis·docker·容器·redisinsight
张彦峰ZYF5 小时前
放行、排队与拒绝:限流设计的算法选型、数据结构与并发代价
后端·架构·滑动窗口·漏桶·令牌桶·高并发+限流
Trae_陈冀6 小时前
写详细设计总堆代码没逻辑?我做了个自动生成工具,3套模板+规范内置,输出直接过评审
架构·agent
Linye6 小时前
AI 越跑越偏?从 500 行臃肿规则到 80 行核心约束:多 Agent 项目中的「规则瘦身与防腐」四步排查法
人工智能·架构
Hespethorn7 小时前
112 个 Valgrind 错误,1 个根因:C++ 多线程服务的关机顺序复盘
后端·架构