使用pg_basebackup实现简单的异步流复制

news/2025/3/13 13:06:01/文章来源:https://www.cnblogs.com/wzu-hqj/p/18769689

pg_basebackup实现简单的异步流复制

进行本节实验前,请先配置好docker镜像源

实验目的

了解现代数据库系统(PG)如何实现高可用性的

  1. 高可用性:主库故障时备库可快速接管服务,减少业务中断时间。
  2. 数据冗余:通过实时同步机制(WAL日志)保障数据安全,避免单点故障导致数据丢失。
  3. 负载分担:备库可承担只读查询,分担主库压力(需配置hot_standby = on)。
  4. 灾难恢复:异地部署备库可应对物理环境故障(如机房断电、网络中断)。

Docker环境下

下载Postgres的Docker Image镜像

在终端输入以下指令,下载最新的postgresql的docker镜像:

docker pull postgres

如果遇到连接超时等错误,尝试换一下docker-hub的镜像源(教程网上有)。

创建PG专属数据卷

docker volume create postgre-data

在 Docker 中,挂载数据卷(Volume Mounting)是一种非常重要的机制,用于在容器和宿主机之间或者容器与容器之间共享和持久化数据。(来源:豆包AI)

作用
1.持久化

当容器被删除时,容器内部产生的数据也会随之丢失。通过挂载数据卷,可以将数据存储在宿主机或 Docker 管理的卷中,即使容器被删除,数据仍然可以保留下来。

2. 数据共享

可以在多个容器之间共享同一个数据卷,实现容器间的数据交互。比如,一个 Web 应用容器和一个日志处理容器可以共享同一个日志数据卷,Web 应用将日志写入数据卷,日志处理容器从该数据卷读取日志进行分析。

3. 方便开发和调试

在开发过程中,可以将宿主机上的代码目录挂载到容器内部,这样在宿主机上修改代码后,容器内的代码也会同步更新,无需重新构建和启动容器,提高开发效率。

这里就是让容器内部的数据同步到宿主机,不会丢失数据。

创建并运行容器pg1(作为主库)

docker run -id --name=pg1 -v postgre-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e LANG=C.UTF-8 postgres

在挂载的数据卷内配置(推荐)

找到外置数据卷的文件夹位置,Ubuntu1604的文件夹位置为/var/lib/docker/volumes/postgre-data/_data

在docker外部(宿主机)执行命令(需要超级用户):

vim /var/lib/docker/volumes/postgre-data/_data/postgresql.conf

在最后加入以下配置:

x wal_level = replica         # 启用WAL日志归档
max_wal_senders = 3        # 允许最多3个复制连接
hot_standby = on           # 备库可提供读服务(需重启生效)

通过命令hostname -i查看本机ip,并将本机ip加入pg_hba.conf文件:

vim /var/lib/docker/volumes/postgre-data/_data/pg_hba.conf
host replication all <your-hostname>/16 md5  # 允许Docker网络内的复制连接

直接在容器里修改配置(不推荐)

进入容器pg1,切换到用户postgres

su postgres
cd ~
cd data

编辑data文件夹下,PG的配置文件postgresql.conf,加入以下配置:

wal_level = replica         # 启用WAL日志归档
max_wal_senders = 3        # 允许最多3个复制连接
hot_standby = on           # 备库可提供读服务(需重启生效)

通过命令hostname -i查看本机ip,并将本机ip加入pg_hba.conf文件:

host replication all <your-hostname>/16 md5  # 允许Docker网络内的复制连接

更新配置

重启容器pg1

sudo docker restart pg1

或者使用pg_ctl

sudo pg_ctl restart

在容器pg1中建立新的数据库和数据表用于验证备库是否成功复制

-- 创建数据库
CREATE DATABASE student_db;-- 连接到新创建的数据库
\c student_db;-- 创建学生表
CREATE TABLE students (student_id SERIAL PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender CHAR(1),enrollment_date DATE
);-- 插入示例数据
INSERT INTO students (name, age, gender, enrollment_date)
VALUES ('张三', 20, 'M', '2024-09-01'),('李四', 21, 'F', '2023-09-01'),('王五', 22, 'M', '2022-09-01'),('赵六', 19, 'F', '2025-01-15'),('孙七', 23, 'M', '2022-03-20'),('周八', 20, 'F', '2024-07-10'),('吴九', 22, 'M', '2023-11-05'),('郑十', 21, 'F', '2024-04-25'),('王十一', 18, 'M', '2025-02-01'),('李十二', 24, 'F', '2021-09-30'),('张十三', 20, 'M', '2024-09-12'),('刘十四', 22, 'F', '2023-06-18'),('陈十五', 19, 'M', '2025-03-08');

pg2备库搭建(关键步骤)

创建备库容器(不挂载数据卷,由pg_basebackup初始化):
sudo docker run -d --name pg2 -e POSTGRES_PASSWORD=123456 postgres:latest bash -c "while true; do sleep 1; done" 

"while true; do sleep 1; done" 这部分是为了阻止容器刚开启就关闭(因为没有挂载数据卷,pg服务无法启动)。

执行 pg_basebackup
sudo docker exec -it pg2 'pg_basebackup -h <pg1的host> -U postgres -D /var/lib/postgresql/data -P -R -X stream -v'
  • -R:自动生成standby.signal文件并配置primary_conninfo
  • -X stream:实时传输未归档的WAL日志

或直接进入容器终端执行:

pg_basebackup -h <pg1的host> -U postgres -D /var/lib/postgresql/data -P -R -X stream -v
启动备库
sudo docker exec pg2 su postgres -c "pg_ctl start -D /var/lib/postgresql/data"

验证主备一致性

1. 主库检查
  • 查看复制状态

    SELECT client_addr, state, sync_state, sent_lsn, write_lsn 
    FROM pg_stat_replication;
    
    • 正常输出应包含备库IP,state = 'streaming'sync_state表示同步模式。
2. 备库检查
  • 确认恢复模式

    SELECT pg_is_in_recovery();  -- 返回`t`表示处于备库模式
    
  • 检查接收的WAL位置

    SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();
    
    • 应与主库的sent_lsnwrite_lsn一致。
3. 数据一致性验证
  • 主库写入测试数据

    CREATE TABLE test (id SERIAL PRIMARY KEY, data TEXT);
    INSERT INTO test (data) VALUES ('HA test');
    
  • 备库查询验证

    SELECT * FROM test;  -- 应返回与主库相同数据
    
4. 日志监控
  • 主库日志:出现streaming replication successfully connected to standby
  • 备库日志:持续输出started streaming WAL from primaryconsistent recovery state

其他

一般的postgreSQL镜像不包含vim,vi,netutils等常见工具,由于镜像是Debian系统,可以使用apt安装(需要超级用户权限):

apt-get update
apt-get install <tool-name>

docker 进入容器终端

docker exec -it <container-name> bash

退出容器/用户

exit

pg_basebackup运行后,可能会文件权限错误,可以在postgres用户下执行,将权限改为750或者700

sudo chmod -R <750/700> ~/data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day27 作业-通配符

今日作业要求 1.通配符和特殊符号篇整理所学通配符、特殊符号的符号表格 有哪些符号、以及作用 符号的具体用法2.正则表达式篇预习正则表达式,记录 正则符号、符号作用参照表今日练习题 1.笔记作业 1.参考老师提供的脑图大纲,做好自己的脑图笔记,包括符号有哪些符号的作用符…

高密度SNP芯片-代加工/激光/芯片/flowcell/河南/郑州/芯晨微纳

SNP芯片(Single Nucleotide Polymorphism Chip)是一种高通量基因分型技术,用于快速检测基因组中单核苷酸多态性(SNP)位点。通过预先设计的探针阵列,SNP芯片能够同时分析数十万至上百万个SNP位点,广泛应用于疾病关联研究、群体遗传学、药物基因组学和精准医学等领域。一、…

在mybatis中的sql别名为rs会报错问题,有没有大佬能解释一下

同事今天早上发现了bug,这段sql在navicat中正常运行,但是项目跑起来就会报错 SELECTs.security_id AS securityId,s.security_name AS securityName,s.ding_talk_id AS userId,rs.year_num AS yearNum,rs.shift_month_day AS shiftMonthDay,sh.id AS shiftId,sh.shift_name A…

网络虚拟存储 Iscsi实现方案

网络虚拟存储,通过Iscsi协议可以实现本地挂载磁盘,扩展本机设备存储。 Iscsi有以下实现方案,简单介绍下: 1.Powershell 脚本 PowerShell 提供了一些 cmdlet,比如 Get-iSCSITarget 和 New-iSCSISession,用于管理 iSCSI 会话。 PowerShell实现有比较完善的文档:简介 - Tra…

17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!

Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署。通过其直观的界面和丰富的功能,开发者可以在几分钟内构建和部署复杂的应用程序。Dokploy 提供了灵活的架构和多样的功能,适合各种规模的项目。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质…

为OpenEuler操作系统安装UKUI 桌面环境并设置root用户登录许可

UKUI 2.0是一款基于MATE的轻量级桌面环境,使用GTK和Qt开发,从开始菜单、控制面板、桌面任务栏以及桌面主题图标等不同层面进行了重新设计和实现,内容丰富,界面清爽。在视觉上,UKUI 2.0 遵循中华民族美学核心——观物取象,主色调采用了源自大自然的中国传统颜色,而图标及…

什么是大模型的量化和蒸馏

Quantization (量化) & Knowledge Distillation(蒸馏) Ollama:量化技术 量化是一种将模型中的浮点数参数(如32位浮点数)转换为低精度数值(如8位整数)的技术。通过减少数值的精度,可以显著减少模型的计算复杂度和存储需求。 量化类型: 1.权重量化:仅对模型的权重进行…

NocoBase 本周更新汇总:双因素身份认证(2FA)

本周更新包括:兼容历史按钮配置按钮权限,AI 集成插件等。原文链接:https://www.nocobase.com/cn/blog/weekly-updates-202503013 汇总一周产品更新日志,最新发布可以前往我们的博客查看。 本周我们发布了 NocoBase 1.6.0 版本,带来集群模式部署、安全策略优化和迁移管理等…

网站开发(1)**基础工具**

使用html、css和javascript进行网站前端开发,使用MySQL、java进行后端开发。 项目工程不算太大,使用VSCode进行编辑和管理。 **安装插件** 在VSCode中安装实时服务器插件:安装成功后,只需要对我们正在编写的html文件右键,选择“Open with Live Server”,然后选择指定浏览…

高密度SNP芯片/Flowcell加工工艺路线-芯晨微纳(河南)-专注于河南郑州激光代加工

★★★文章来源 网络、新闻采访、专利等公开信息,仅用于学习 文章由芯晨微纳(河南)光电科技有限公司搜集整理

使用MMSeg1.2.2进行可视化

1. 对image进行预测和mask进行可视化 1.1 使用mmsegmentation/tools/analysis_tools/feature_map_visual.py进行推理: 编写脚本进行可视化推理,需要打开wandb(详情可见MMSeg官方手册),输入格式为python feature_map_visual.py \ (imaeg_path) \ (configs_path) \ (checkpo…

四代固态纳米孔测序芯片/Flowcell加工工艺路线/厂家调研-芯晨微纳(河南)-专注于河南郑州激光代加工

纳米孔测序(Nanopore Sequencing)是一种基于单分子检测的第三代测序技术,其核心原理是通过纳米孔结构实时监测分子(如DNA、RNA)通过孔道时引起的电信号变化,从而实现碱基序列的识别。与传统的测序技术(如Illumina的合成测序)相比,纳米孔测序具有长读长、实时分析、无需…