Docker PG流复制搭建实操

news2025/1/16 21:28:56

目录标题

      • 制作镜像
        • 1. 删除旧的容器
        • 2. 创建并配置容器
        • 3. 初始化数据库并启动
      • 主库配置参数
        • 4. 配置主库
        • 5. 修改 `postgresql.conf` 配置
      • 备库配置参数
        • 6. 创建并配置备库容器
        • 7. 初始化备库
      • 流复制
        • 8. 配置&检查主库复制状态
        • 9. 检查备库配置
      • 优化建议
      • 问题1:FATAL: using recovery command file "recovery.conf" is not supported

制作镜像

1. 删除旧的容器
docker rm -f pg15.7
2. 创建并配置容器
docker run -it --name=pg15.7 --restart=always --entrypoint=/bin/bash --user=root \
  -e PGDATA=/pgdata/ \
  -v /opt/qfusion/master/data:/pgdata \
  k8smaster.qfusion.irds/irds/postgres-15:v1.4.1-202409251139

# sed -e 's|^mirrorlist=|#mirrorlist=|g' \
#     -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
#     -i.bak \
#     /etc/yum.repos.d/Rocky*.repo
# -- 设置yum源缓存
# dnf makecache -y
# yum repolist

mv /etc/yum.repos.d/pgdg-redhat-all.repo /root
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf install -y --enablerepo=powertools postgresql14-devel unzip redhat-rpm-config openssl-devel
dnf install iproute

echo 'export PATH=$PATH:/usr/pgsql-15/bin' >> ~/.bashrc
source ~/.bashrc


3. 初始化数据库并启动
chown -R postgres:postgres /pgdata
su - postgres 
/usr/pgsql-15/bin/initdb -D /pgdata/ 
/usr/pgsql-15/bin/pg_ctl -D /pgdata/ -l logfile start
docker commit pg15.7 pg15.7-build

主库配置参数

172.18.12.100 主
172.18.12.101 备

创建网络

docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.12.1 mynet

docker network

4. 配置主库
mkdir -p /opt/qfusion/master/data

docker rm -f pg15.7-master
docker run -it --name=pg15.7-master --restart=always  --entrypoint=/bin/bash --user=root \
  --network=mynet --ip 172.18.12.100 \
  -e POSTGRES_PASSWORD=master \
  -p 5432:5432 \
  -v /opt/qfusion/master/data:/pgdata \
  pg15.7-build 


echo "host replication replica 172.18.12.101/32 trust" >> /pgdata/pg_hba.conf
tail /pgdata/pg_hba.conf

psql
CREATE ROLE replica login replication encrypted password 'replicationpassword';

pg_hba.conf

5. 修改 postgresql.conf 配置
grep -E 'listen_addresses|wal_level|max_wal_senders|wal_keep_segments|hot_standby|synchronous_commit|synchronous_standby_names|archive_mode|archive_command' postgresql.conf
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
#wal_level = replica                    # minimal, replica, or logical
#synchronous_commit = on                # synchronization level;
#archive_mode = off             # enables archiving; off, on, or always
                                # (empty string indicates archive_command should
#archive_command = ''           # command to use to archive a logfile segment
#max_wal_senders = 10           # max number of walsender processes
#synchronous_standby_names = '' # standby servers that provide sync rep
#hot_standby = on                       # "off" disallows queries during recovery
#hot_standby_feedback = off             # send info from standby to prevent

sed -i 's/^#listen_addresses = .*/listen_addresses = \'*\'/' postgresql.conf

sed -i 's/^#archive_mode = .*/archive_mode = on/' postgresql.conf

grep -E 'listen_addresses|archive_mode' /pgdata/postgresql.conf

备库配置参数

6. 创建并配置备库容器
docker rm -f pg15.7-slave1

mkdir -p /opt/qfusion/slave1/data

docker run -it --name=pg15.7-slave1 --restart=always --entrypoint=/bin/bash --user=root \
  --network=mynet --ip 172.18.12.101 \
  -e POSTGRES_PASSWORD=master \
  -p 5433:5432 \
  -v /opt/qfusion/slave1/data:/pgdata \
  pg15.7-build
7. 初始化备库

su - postgres
chown -R postgres:postgres /pgdata

pg_basebackup -Fp --progress -R -h 172.18.12.100 -U replica -D /pgdata -X stream

# rm -rf /pgdata/*

默认生成的文件
cat postgresql.auto.conf
ls -l standby.signal

docker restart pg15.7-slave1

nohup /usr/pgsql-15/bin/pg_ctl -D /pgdata/ -l logfile start

流复制

8. 配置&检查主库复制状态
# 替换synchronous_standby_names 为standby1
sed -i 's/^#synchronous_standby_names = .*/synchronous_standby_names = standby1/' postgresql.conf
grep synchronous_standby_names /pgdata/postgresql.conf

SELECT pg_reload_conf();

SELECT pg_reload_conf();

SELECT * FROM pg_stat_replication;
9. 检查备库配置
# 增加 application_name=standby1 到 postgresql.auto.conf,默认是 walreceiver
vi /pgdata/postgresql.auto.conf
primary_conninfo = 'user=replica passfile=''/home/postgres/.pgpass'' channel_binding=prefer host=172.18.12.100 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any application_name=standby1'


# 检查synchronous_commit是否为on,如果不是需要修改
show synchronous_commit;

# 在主库查看视图
SELECT application_name, state, sync_state FROM pg_stat_replication;

参数级别

优化建议

  1. 确保网络连接:确保主备库之间的网络连接稳定,避免因网络问题导致复制失败。
  2. 监控和报警:使用监控工具(如 Prometheus、Grafana)监控主备库的复制状态,设置报警规则,及时发现并处理问题。
  3. 备份和恢复:定期备份主备库的数据,确保在出现故障时能够快速恢复。
  4. 性能调优:根据实际负载调整 postgresql.conf 中的参数,如 max_wal_senderswal_keep_segments 等,以优化复制性能。

希望这些步骤和优化建议能帮助您更好地配置和管理 PostgreSQL 的主备复制。如果有任何问题或需要进一步的帮助,请随时联系。

在这里插入图片描述

问题1:FATAL: using recovery command file “recovery.conf” is not supported

tail postgresql-Mon.log
2025-01-13 09:41:22.194 UTC [122] LOG:  starting PostgreSQL 15.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit
2025-01-13 09:41:22.194 UTC [122] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2025-01-13 09:41:22.194 UTC [122] LOG:  listening on IPv6 address "::", port 5432
2025-01-13 09:41:22.195 UTC [122] LOG:  listening on Unix socket "/run/postgresql/.s.PGSQL.5432"
2025-01-13 09:41:22.196 UTC [122] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2025-01-13 09:41:22.199 UTC [126] LOG:  database system was interrupted; last known up at 2025-01-13 09:29:27 UTC
2025-01-13 09:41:22.208 UTC [126] FATAL:  using recovery command file "recovery.conf" is not supported
2025-01-13 09:41:22.209 UTC [122] LOG:  startup process (PID 126) exited with exit code 1
2025-01-13 09:41:22.209 UTC [122] LOG:  aborting startup due to startup process failure
2025-01-13 09:41:22.209 UTC [122] LOG:  database system is shut down

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题:SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页:https://jianhongbai.github.io/SynCamMaster/ 代码:https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…

C++类与对象(一)—学习记录

序言:要想开发一款成功的应用程序,其开发者必须充分了解并实现用户的需求。作为一个设计良好的类,既要有直观且易于使用的接口,也必须具备高效的实现过程。 一、类与对象基本概念 面向对象程序设计的主要特点为抽象、封装、继承与…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想:数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架: create-react-app ,目前使用它安装默认是19版本,我们这里降为18…

Jmeter数据库

jmeter之操作数据库 一、下载jdbc 驱动,安装jdbc驱动 2、将驱动存放在4个路径下 (1)C:\Program Files\Java\jre1.8.0_60\lib (2)第二个存放的包 C:\Program Files\Java\jre1.8.0_60\lib\ext (3&#xf…

nginx: [emerg] bind() to 0.0.0.0:80 failed 端口被占用

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 查看被占用的端口 被系统占用了 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/HTTP 然后再进入nginx文件夹目录下…

《C++11》深入剖析正则表达式库:解锁文本处理的高效之道

在现代编程领域,文本处理是一项不可或缺的任务,而正则表达式无疑是这一领域的强大利器。C11标准库的引入,为C开发者带来了正则表达式库,极大地丰富了C在文本处理方面的能力。本文将全方位、多角度地深入探讨C11正则表达式库&#…

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…

机器学习-归一化

文章目录 一. 归一化二. 归一化的常见方法1. 最小-最大归一化 (Min-Max Normalization)2. Z-Score 归一化(标准化)3. MaxAbs 归一化 三. 归一化的选择四. 为什么要进行归一化1. 消除量纲差异2. 提高模型训练速度3. 增强模型的稳定性4. 保证正则化项的有效…

STC的51单片机LED点灯基于KEIL

前言: 该文源于回答一个朋友的问题,代码为该朋友上传,略作修改,在此说明问题以及解决问题的思路,以减少新手错误。 电路图: 该位朋友未上传电路图,说明如下: stc8g1k08a-sop8控制…

手撕Transformer -- Day6 -- DecoderBlock

手撕Transformer – Day6 – DecoderBlock 目录 手撕Transformer -- Day6 -- DecoderBlockTransformer 网络结构图DecoderBlock 代码Part1 库函数Part2 实现一个解码器Block,作为一个类Part3 测试 参考 Transformer 网络结构图 Transformer 网络结构 DecoderBlock 代…

【功能测试总结】

功能测试 1. 功能测试用例1.1 设计用例容易出现的问题 2. 如何写用例2.1 什么是好的用例2.2 测试用例设计常见方法 3. 用例分级 1. 功能测试用例 1.1 设计用例容易出现的问题 基础功能点用例覆盖不全/描述不清 描述不清 什么是正常内容,仅看用例能否知道该输入什么…

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…

基于Springboot + vue实现的旅游网站

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门: Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译: Iahub正在为国际信息学奥林匹克竞赛(IOI)做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢? 一排中有n个球…

Vue3播放视频报ReferenceError: SharedArrayBuffer is not defined

解决办法 前端本地测试vue.config.js server: {headers: {"Cross-Origin-Opener-Policy": "same-origin","Cross-Origin-Embedder-Policy": "require-corp",}, }, 后端vue.js生产环境 跨域隔离 是一种现代Web安全策略,…

Android BottomNavigationView不加icon使text垂直居中,完美解决。

这个问题网上千篇一律的设置iconsize为0,labale固定什么的,都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果:垂直方向,文本不居中,看着很难受 问题解决之后:舒服多了 其实很简单&…

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器,使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口,让子类决定实列化哪一个类,工厂模式使一个类的实例化延迟到其子类; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作…

【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代,零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径&#xff0…