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)
相关推荐
计算机小手几秒前
高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
经验分享·docker·webrtc·开源软件
云和数据.ChenGuang1 小时前
微服务技术栈
微服务·云原生·架构
笨鸟贤妃1 小时前
Ubuntu 22.04 安装 Docker & Compose 最新最简单完整指南
ubuntu·docker·compose
感哥1 小时前
Docker存储
docker
灞波儿奔波儿灞2 小时前
Lucky STUN穿透结合群晖NAS实现docker下transmission监听端口动态更新
docker·群晖·stun·lucky
知识分享小能手2 小时前
React学习教程,从入门到精通, React 新创建组件语法知识点及案例代码(11)
前端·javascript·学习·react.js·架构·前端框架·react
江团1io02 小时前
微服务雪崩问题与系统性防御方案
微服务·云原生·架构
LDelon2 小时前
iOS GitSubModule CocoaPod 制作私有源本地组件库
架构
小毛驴8503 小时前
所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
git·docker·微服务
chat2tomorrow3 小时前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl