基于Docker-compose实现的Postgresql-11的主从复制

参考文章:

http://t.csdn.cn/EnOVn

http://t.csdn.cn/XTJqZ
记录一次主从复制的配置经历

服务器主从角色分配

ipdb 版本角色
192.168.33.23411
192.168.33.22511

docker-compose.yml文件

version: "3.3"
services:postgres:image: postgresql-gis:11.12-2.5.5container_name: postgres-11.12 #容器名restart: alwaysenvironment:POSTGRES_USER: #用户名POSTGRES_PASSWORD: # 密码ports:- 15332:5432volumes:- /data/pgdata:/var/lib/postgresql/data	#持久化映射目录

主库配置:

1 创建专用于主从复制的角色

在主库中创建一个专用于复制的角色,角色名onlyrepl ,密码Lin****rd

create role onlyrepl login replication encrypted password 'Lin****rd';

在这里插入图片描述

2 修改pg_hba.conf

在本地本地映射路径/data/pgdata

修改主库/data/pgdata/pg_hba.conf文件:新增onlyrepl相关的配置。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# 新增:用来做备份的用户,onlyrepl
host    replication     onlyrepl        192.168.33.234/24         md5
host    all             onlyrepl        192.168.33.234/24         trust
  • 注意IP地址(192.168.33.234/24)是本地的是该网段内的IP地址,获取方式:

    ip addr show | grep inet

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfooevdW-1688020919095)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629090738753.png)]

3 修改 postgresql.conf文件

修改 /data/pgdata/postgresql.conf文件

新增以下配置

wal_level = replica        # minimal, replica, or logical
archive_mode = on        # enables archiving; off, on, or always
archive_command = 'cp %p /var/lib/pgsql/11/data/pg_archive/%f'        # command to use to archive a logfile segment
max_wal_senders = 10       # max number of walsender processes
wal_keep_segments = 10240    # in logfile segments, 16MB each; 0 disables
wal_sender_timeout = 60s    # in milliseconds; 0 disables
log_directory = 'log'    # directory where log files are written

带注释完整版

port = 5432max_connections = 1000listen_addresses = '*' #监听本机所有ip,也可以按需设置shared_buffers = 1280MB            # 数据库的缓存数据大小,建议设置为系统内存的25~50%之间full_page_writes = on#日志配置log_destination = 'csvlog' #日志格式,值为stderr,csvlog,syslog,and eventlog之一logging_collector = on #开启日志功能,默认是off不启用日志log_directory = 'log' #日志路径,默认是PGDATA的相对路径,即{PGDATA}/log,可以使用自定义目录log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' #日志文件命名形式,使用默认即可log_rotation_age = 1d #单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件log_rotation_size = 1024MB #单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到1024M,否则将新生成一个日志文件log_truncate_on_rotation = on #当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志log_lock_waits = off #控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是offlog_statement = 'all' # none, ddl, mod, all 控制记录哪些SQL语句,none不记录;ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句;mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等;all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句log_duration = on #记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长log_min_duration_statement = 0 #-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句,log_min_duration_statement会将SQL语句和耗时在同一行记录log_connections = off #不记录连接日志log_disconnections = off #不记录连接断开日志log_line_prefix = '%m [%p] %u %d %r' #日志输出格式,根据需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口等信息)log_timezone = 'Asia/Shanghai' #日志时区,和服务器设置同一个时区#主从复制相关
wal_level = replica	#这个配置用于设置WAL(Write-Ahead Logging)的级别。`replica`级别允许将WAL记录发送到从服务器(standby)以进行流复制(streaming replication)。archive_mode = on	#这个配置用于启用归档模式,它将WAL记录写入归档目录而不是仅写入WAL日志文件。archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f' #这个配置用于设置归档命令,它定义了如何将WAL记录从WAL日志文件复制到归档目录。在这个例子中,它使用`cp`命令将WAL日志文件复制到指定的归档目录。wal_keep_segments = 10240 #这个配置用于设置WAL日志文件的最大数量。当达到这个限制时,PostgreSQL将开始删除最旧的WAL日志文件。这个配置可以保留足够长的WAL日志文件以支持从服务器的恢复。wal_sender_timeout = 60s #这个配置用于设置WAL发送者(WAL sender)的超时时间。如果在指定的时间内没有从主服务器(primary)接收到新的WAL记录,则WAL发送者将关闭连接。

4 重启主库

docker重启,或者docker -compose up 都行

docker restart postgres-11.12docker logs --tail=200  postgres-11.12

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irhgU9ug-1688020919096)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629094542259.png)]

  • 重启成功即可

从库配置

1 创建一个新的pg容器

  1. 创建目录:/tools/docker-compose/pg3

  2. 配置docker-compose.yml

    version: "3.3"
    services:postgres:image: postgresql-gis:11.12-2.5.5container_name: pg-achiverestart: alwaysenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: Lin****rdports:- 15335:5433volumes:- /tools/docker-compose/pg3/pgdata:/var/lib/postgresql/data
    
  3. 启动该容器docker-compose up -d

  4. 检查是否成功 docker-compose logs

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ww3FCmnX-1688020919096)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629095442071.png)]

2 复制主库的数据

清空从数据库的data目录rm -rf /var/lib/postgresql/data/

执行指令pg_basebackup -Fp --progress -D /var/lib/postgresql/data/ -R -h 192.168.33.234 -p 15332 -U onlyrepl --password

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSXbdqh3-1688020919097)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629101519714.png)]

  • 成功执行复制

  • 重启容器测试数据已复制过来

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjAOIwQV-1688020919097)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629102415812.png)]

⭐️遇到无法删除data路径的解决方法

我在操作时遇到无法删除路径的问题,导致报错如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SG2qZhAz-1688020919097)(docker-compose环境下postgresql-11的主从复制.assets/image-20230629101747715.png)]

解决的思路:将主库data文件使用basebackup指令拷贝到docker容器内部的一个临时路径,再使用docker cp指令将data文件拷贝到linux的路径中,重启容器后,新的容器就可以启用新的data文件

# 在docker容器内执行
pg_basebackup -Fp --progress -D /var/lib/postgresql/backup/ -R -h 192.168.33.234 -p 15332 -U onlyrepl --password
# 输入密码docker cp pg3:/var/lib/postgresql/backup/ /tools/docker-compose/pg3/data
##其中,`/tools/docker-compose/pg3/pgdata`为您要将备份文件存储到本地的路径

3 修改从库配置文件 postgresql.conf

listen_addresses = '*'            # what IP address(es) to listen on;
port = 5432                # (change requires restart)
shared_buffers = 128MB            # min 128kB
dynamic_shared_memory_type = posix    # the default is the first option
wal_level = replica        # minimal, replica, or logical
wal_sender_timeout = 60s    # in milliseconds; 0 disablesmax_connections = 1000 #最大连接数hot_standby = on #说明这台机器不仅仅是用于数据归档,也用于数据查询max_standby_streaming_delay = 30s #数据流备份的最大延迟时间wal_receiver_status_interval = 10s #间隔时间hot_standby_feedback = on #如果有错误的数据复制,是否向主进行反馈#日志配置log_destination = 'csvlog' #日志格式,值为stderr,csvlog,syslog,and eventlog之一logging_collector = on #开启日志功能,默认是off不启用日志log_directory = 'log' #日志路径,默认是PGDATA的相对路径,即{PGDATA}/log,可以使用自定义目录log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' #日志文件命名形式,使用默认即可log_rotation_age = 1d #单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件log_rotation_size = 1024MB #单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到1024M,否则将新生成一个日志文件log_truncate_on_rotation = on #当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志log_lock_waits = off #控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是offlog_statement = 'none' # none, ddl, mod, all 控制记录哪些SQL语句,none不记录;ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句;mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等;all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句log_duration = on #记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长log_min_duration_statement = 0 #-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句,log_min_duration_statement会将SQL语句和耗时在同一行记录log_connections = off #不记录连接日志log_disconnections = off #不记录连接断开日志log_line_prefix = '%m [%p] %u %d %r' #日志输出格式,根据需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口等信息)log_timezone = 'Asia/Shanghai' #日志时区,和服务器设置同一个时区

4 创建恢复文件recovery.conf

# 调整参数:
recovery_target_timeline = 'latest'   #同步到最新数据
standby_mode = on          #指明从库身份
trigger_file = 'failover.now'
primary_conninfo = 'host=192.168.33.234 port=15332 user=onlyrepl password=Lin****rd'   #连接到主库信息

5 测试生效即可

  1. 主库创建一张表
  2. 检查从库是否同步
  3. 同步说明已经创建完成

主从切换(未测试)

文章:http://t.csdn.cn/Cy4Tn

要进行主从切换,需要遵循以下步骤:

1.停止主数据库

docker stop postgres-master

2.在从数据库中创建触发文件

docker exec -it postgres-slave touch /tmp/touch_me_to_promote_to_me_master

3.重新启动从数据库以使更改生效

docker restart postgres-slave

4.确认从数据库已经变成了主数据库

docker exec -it postgres-slave bash
psql -U postgres
SELECT pg_is_in_recovery();
exit

这将返回 false,表示从数据库现在是主数据库,主数据库现在是不可用的。

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

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

相关文章

Linux:LNMP上搭建discuz论坛(源码安装)

LNMP环境 Linux :LNMP(源码包安装)_鲍海超-GNUBHCkalitarro的博客-CSDN博客 discuz论坛 准备好源码包 LNMP环境正常 yum -y install unzip unzip Discuz_X3.3_SC_UTF8.zip # unzip 源码包名称 mv upload/ /usr/local/nginx/html/tarro…

云从科技大模型之路:昇思“黑土地”上的生态炼成记

文 | 智能相对论 作者 | 李永华 一线客户经理,为客户一键生成周全的资产配置建议; 中端管理人员,获得系统自动撰写的一整套数据分析报表,快速、准确授信; 金融市场的“操盘手”,能够实时获取那些影响市…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Be…

自动驾驶开源数据集(附下载链接)

自动驾驶是带动新兴产业的一个突破点,也是中国结合新能源汽车,实现汽车产业弯道超车的不二手段,是打破国外燃油车技术壁垒的关键一步!它不会停止,只是在蓄势待发! 数据集介绍:点击 自动驾驶场…

人机融合是自由与决定的交互

人机融合是指人类与机器之间的紧密合作与互动。在这种融合中,人类使用机器的能力来增强自身的能力,而机器则依赖人类的指导和判断来发挥作用。这种融合可以带来许多好处和机会,但也伴随着一些挑战和风险。 首先,人机融合可以为人类…

【线程池】Java线程池的内部类Worker详解

目录 一、简介 二、Worker类对象的类图 三、Worker类对象的解释 4.2 Worker继承自AQS有何意义? 四、Worker的主要代码 4.1 运行worker 4.2 worker和ThreadPool的关系 五、Worker源码分析 5.1 Worker实现接口Runnable,执行run方法 5.2 核心方法…

Kafka:Kafka资料整理

一、官网 二、博主文章 1、kafka是什么 • Worktile社区 三、源码解读

基于springboot+Redis的前后端分离项目(三)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 优惠券秒杀 优惠券秒杀1 -全局唯一ID2 -Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 优惠券秒杀-一人一单…

Docker创建Mysql容器

查看可以安装的mysql镜像: docker search mysql STARS为ok的就是官网支持我们可以安装的版本 拉取最新版本的mysql镜像: docker pull mysql:latest 拉取的时候如果网络不好的话可能会报错,报错后重新拉取就好 拉取成功后查看镜像: docker images 可以看到我已经拉取了…

Linux学习之服务管理工具systemctl

在CentOS 7中有两种服务集中管理工具: service systemctl /etc/init.d/中放着service的启动脚本。比如network这个脚本里边就有网络服务的启动脚本,cat network | wc -l可以看到这个文件中有264行内容。 /usr/lib/systemd/system下放着systemctl的启动脚…

【Rust】入门教程-7章

Package、Crate、Module 7.1 代码组织 7.2 路径 根级可以相互访问 super 关键字 pub struct 7.4 use关键字

RPC核心原理详解

什么是RPC? RPC的全称是Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现,但是不是只要通过网络通信访问到另一台机器的应用程序&#xff0c…