当前位置: 首页 > news >正文

在 Docker 中搭建 PostgreSQL16 主从同步环境

1. 环境搭建

本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库,详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebackup 同步数据,并最终验证同步状态。

1.1. 主库搭建

# 创建docker容器互联网络
docker network create pg-network# 创建映射目录
mkdir /data/postgresdocker run -d -p 5500:5432 -v /docker-data/pgmaster:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgmaster --network=pg-network postgres:16.4

1.2. 从库搭建

# 创建从库
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgslave1 --network=pg-network postgres:16.4

1.3. 查看主库和从库 IP

# 查看容器IP pgmaster = 172.18.0.2
docker inspect pgmapgmaster = 172.18.0.2ster | grep IPAddress
# pgslave1 = 172.18.0.3
docker inspect pgslave1 | grep IPAddress

1.4. 主库配置

设置主服务的连接信息, 从库使用pg_basebackup同步过来数据后可以直接使用这个配置去同步数据

# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF
  1. host=172.18.0.2 主库 IP , 这里因为使用了 同一个网络 pg-network, 所以可以直接通信
  2. user=repl password=repl 主库数据库中用于同步数据的角色和密码, 等下需要创建

设置只允许哪几个 IP 个角色可以复制数据

# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF

主库创建用于复制的角色

# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster

# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres
# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster

1.5. 拷贝主库数据

进入从属容器内部, 使用pg_basebackup 同步主库的数据到从库

# 进入从属容器
docker exec -it pgslave1 /bin/bash
# 同步主服务器数据, 注意 这里的 /docker-data/opt/postgresql-16.0/data 是容器内部的数据
pg_basebackup -Fp --progress -D /docker-data/opt/postgresql-16.0/data/ -R -h 172.18.0.2 -p 5432 -U repl --password

在本地创建目录, 将容器的数据拷贝出来

# 创建目录
mkdir -p /docker-data/opt/postgresql/pgslave1
# 将容器内部的数据复制到外部
docker cp pgslave1:/docker-data/opt/postgresql-16.0/data /docker-data/opt/postgresql/pgslave1

1.6. 重新启动从库

删除容器, 重新启动从库

# 删除容器
docker rm -f pgslave1# 重新开启容器, 注意映射目录
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
-v /docker-data/opt/postgresql/pgslave1/data:/var/lib/postgresql/data \
--name pgslave1 --network=pg-network -d postgres:16.4

1.7. 验证

docker logs -f pgslave1

img

可以看到这里已经开始同步了

或者可以使用 select * from pg_stat_wal_receiver;

img

create table db_order(id bigint primary key ,name varchar(255)
);insert into db_order(id,name) values (1,'zhangsan');

2. 完整命令

# 创建docker容器互联网络
docker network create pg-network# 创建映射目录
mkdir /data/postgresdocker run -d -p 5500:5432 -v /docker-data/pgmaster:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgmaster --network=pg-network postgres:16.4# 创建从库
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgslave1 --network=pg-network postgres:16.4# 查看容器IP pgmaster = 172.18.0.2
docker inspect pgmapgmaster = 172.18.0.2ster | grep IPAddress
# pgslave1 = 172.18.0.
docker inspect pgslave1 | grep IPAddress# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres
# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster# 进入从属容器
docker exec -it pgslave1 /bin/bash
# 同步主服务器数据, 注意 这里的 /docker-data/opt/postgresql-16.0/data 是容器内部的数据
pg_basebackup -Fp --progress -D /docker-data/opt/postgresql-16.0/data/ -R -h 172.18.0.2 -p 5432 -U repl --password# 创建目录
mkdir -p /docker-data/opt/postgresql/pgslave1
# 将容器内部的数据复制到外部
docker cp pgslave1:/docker-data/opt/postgresql-16.0/data /docker-data/opt/postgresql/pgslave1# 删除容器
docker rm -f pgslave1# 重新开启容器, 注意映射目录
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
-v /docker-data/opt/postgresql/pgslave1/data:/var/lib/postgresql/data \
--name pgslave1 --network=pg-network -d postgres:16.4

img

能看到 redo starts 说明已经开始同步了

create table db_order(id bigint primary key ,name varchar(255)
);insert into db_order(id,name) values (1,'zhangsan');

查询同步状态

select * from pg_stat_wal_receiver;

img

http://www.lryc.cn/news/466933.html

相关文章:

  • SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)
  • 判断浏览器环境,前端打开微信浏览器
  • 【算法笔记】前缀和算法原理深度剖析(超全详细版)
  • linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架
  • 经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】
  • Python画笔案例-088 绘制 滚动的汉字
  • Redis 5.0 安装配置(Windows)
  • 金融行业:办公安全防护专属攻略
  • python如何基于numpy pandas完成复杂的数据分析操作?
  • Linux中定时任务调度工具——crontab
  • 思维+差分,CF 1884C - Medium Design
  • 简单介绍冯诺依曼体系
  • kernel32.dll下载地址:如何安全地恢复系统文件
  • 【高等数学】多元微分学 (一)
  • Python爬取京东商品信息,详细讲解,手把手教学(附源码)
  • 大家有没有了解过TLKS-PLGS这款接地电阻在线监测装置?它在电力系统中能发挥什么作用呢?
  • Shell中的函数
  • 通过IP地址或者主机名添加打印机20241023
  • 基于SpringBoot+Vue智慧养老关爱系统【提供源码+答辩PPT+参考文档+项目部署】
  • 新手教学系列——利用短效代理快速搭建代理池
  • 实体与DTO如何转换
  • Docker 安装Postgres和PostGIS,并制作镜像
  • ES6:let和const命令解读以及变量的解构赋值
  • java-collection集合整理0.9.4
  • ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误
  • 现代C语言:C23标准重大更新
  • Maven进阶——坐标、依赖、仓库
  • Android中的内存泄漏及其检测方式
  • 【雷电模拟器命令合集操作大全】官方文档整理贴
  • redis的配置文件解析