在docker上部署postgresSQL主从

一、主从规划

因为就一台服务器,所以两台服务器的ip是一样的,我采用了不同的端口

IP地址名称备注
x.x.x.x:1922mymaster主库
x.x.x.x:1921mystl备库

需要提前配置好Docker容器

二、创建PostgresSQL的Docker镜像

docker pull postgres:14

在这里插入图片描述
查看镜像是否创建成功

docker images

在这里插入图片描述

三、主库部署

1、建立pgsql主库的data地址

以root用户创建目录

mkdir -p /usr/local/datamaster

2、启动docker镜像

# 一些参数的说明
# docker run 
#     --name <docker_nname>    # 启动后容器的名称 
#     --restart=always 					# docker的自动重启
#     -v <data_address>:/var/lib/postgresql/data		# 数据卷挂载,前面的地址即为第一步创建的地址
#     -e POSTGRES_PASSWORD=<password>	# pgsql的密码
#     -p <port>:5432				# 端口映射,
#     -d  <image_id>				# 镜像名或ID

docker run --name mymaster -e POSTGRES_PASSWORD=这里是你的密码 -p 1922:5432 -v /usr/local/datamaster/postgres:/var/lib/postgresql/data -d postgres:14

在这里插入图片描述
查看数据库是否创建成功

docker ps

在这里插入图片描述
记住名称,后边要用

3、docker内操作

# 进入docker容器,这里这个mymaster就是上边记住的名称
docker exec -it mymaster bash
# 进入pgsql
su postgres
psql

在这里插入图片描述

# 创建复制用户
CREATE ROLE replica login replication encrypted password '这里是你的密码!';
# 查看是否创建成功
\du
# 退出
exit
exit

在这里插入图片描述

4、修改配置文件

退出容器
进入该数据库创建容器时初配置的数据文件位置
在这里插入图片描述
/usr/local/datamaster/postgres/arc 必须存在,如果不存在,则也需要mkdir一次

mkdir -p /usr/local/datamaster/postgres/arc
chmod 777 /usr/local/datamaster/postgres/arc
# 修改<data_address>/postgresql.conf
vim postgresql.conf

archive_mode = on
archive_command = 'test ! -f /usr/local/datamaster/postgres/arc/%f'
wal_level = replica
max_wal_senders = 32
wal_keep_size = 16
wal_sender_timeout = 60s
# 以下两个检查一下,我的docker启动后,自动就配置好了,如果被注释了,也需要修改
listen_addresses = '*'
max_connections = 100

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 修改<data_address>/pg_hba.conf
vim pg_hba.conf
# 在最后新增一行
host    replication     replica         172.0.0.0/8            md5

在这里插入图片描述

因为加载了数据卷,第三四步对配置文件的修改,和对不用Linux启动的pgsql本质上没有太大的差别,甚至可以认为是相同的操作

# 因为配置了自动重启<--restart=always>,所以无需手动重启docker,不过也可以手动重启
# 重启docker
docker restart mymaster

在这里插入图片描述

四、部署从数据库

1、建立psql备库的data地址

以root用户创建目录

mkdir -p /usr/local/data

2、启动docker镜像

# 一些参数的说明
# docker run 
#     --name <docker_nname>    # 启动后容器的名称 
#     --restart=always 					# docker的自动重启
#     -v <data_address>:/var/lib/postgresql/data		# 数据卷挂载,前面的地址即为第一步创建的地址
#     -e POSTGRES_PASSWORD=<password>	# pgsql的密码
#     -p <port>:5432				# 端口映射,
#     -d  <image_id>				# 镜像名或ID

docker run --name mystl -e POSTGRES_PASSWORD=这里是你的密码 -p 1921:5432 -v /usr/local/data/postgres:/var/lib/postgresql/data -d postgres:14

3、备库从主库同步

进入容器

docker exec -it mystl bash
# 删除原数据
# 注:因为启动了docker自启动,删除文件目录,会导致容器退出,甚至报错无法再次进入
# 所以以下两步【删除数据,迁移数据】最好快速连续执行
# 也可以直接执行迁移数据的操作,确认报错是【文件已存在,无法迁移】后,再【删除】后【迁移】
rm -rf /var/lib/postgresql/data/*
# 迁移主库数据
pg_basebackup -R -D /var/lib/postgresql/data -P -h 你的主机IP -p 1922 -U replica
# 提示输入密码
这一步要快

# 出现以下代表数据迁移
26288/26288 kB (100%), 1/1 tablespace
# 退出docker
exit
exit
# 重启docker容器
docker restart mystl

在这里插入图片描述
tip:如果删除之后备库崩了,可以退出备库,docker restart mystl重启docker然后在进入备库

4、检查是否同步

# 在从库的</url/local/data/>存在postgresql.auto.conf文件,自动出现以下内容代表数据创建成功
cat postgresql.auto.conf


primary_conninfo = 'user=replica password=123456 channel_binding=prefer host=172.16.23.77 port=10031 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

在这里插入图片描述

五、测试主从数据库

主库:
在这里插入图片描述
备库:
在这里插入图片描述

### 使用 Docker 配置 PostgreSQL 主从复制 #### 准备工作 为了确保能够顺利部署 PostgreSQL主从架构,在 Ubuntu 20.04 中先完成必要的准备工作。 安装 Docker 并验证其正常运行状态[^2]。接着,下载所需版本的 PostgreSQL 源码包至指定目录 `/home/yt/software/pg`: ```bash sudo su cd /home/yt/ mkdir -p software/pg cd /home/yt/software/pg apt install wget -y wget https://ftp.postgresql.org/pub/source/v14.6/postgresql-14.6.tar.gz ``` 不过,对于大多数用户来说,直接拉取官方提供的 Docker 镜像会更加便捷高效,无需手动编译源代码。 #### 创建主节点 (Master) 启动主服务器实例时,建议通过 `-e POSTGRES_PASSWORD=yourpassword` 设置密码参数来增强安全性,并挂载本地文件夹作为数据卷以便持久化存储: ```bash docker run --name master \ -e POSTGRES_USER=replica_user \ -e POSTGRES_PASSWORD=yourpassword \ -v /path/to/masterdata:/var/lib/postgresql/data \ -d postgres:14.6 ``` 这里 `POSTGRES_USER` 和 `POSTGRES_PASSWORD` 是用来设置用于复制操作的用户名及其对应的访问凭证;而 `/path/to/masterdata` 则应替换为实际路径下的目标位置。 #### 构建从节点 (Slave) 当主库已经成功上线之后,则可以着手准备备用机了。同样地,利用 Docker 命令快速构建一个新的容器实例充当副本角色: ```bash docker run --name slave \ -e POSTGRES_USER=replica_user \ -e POSTGRES_PASSWORD=yourpassword \ -v /path/toslavedata:/var/lib/postgresql/data \ -p 15432:5432 \ -d postgres:14.6 ``` 注意端口号映射部分做了调整 (`-p 15432:5432`) ,这有助于区分不同服务之间的通信地址冲突问题。 #### 初始化同步过程 为了让两个数据库之间建立联系并保持一致的状态,需要执行一次全量备份动作。借助于 pg_basebackup 工具可轻松达成此目的: ```bash pg_basebackup -h 192.168.1.1 -p 15432 -U replica_user -Fp -Xs -Pv -R -D /var/lib/postgresql/data ``` 上述命令中的选项含义如下: - `-h`: 指定远端主机 IP 地址; - `-U`: 登录账户名; - `-Fp`: 表明采用 tar 格式的物理拷贝方式; - `-Xs`: 启动流模式传输 WAL 日志条目; - `-Pv`: 显示进度信息以及详细输出; - `-R`: 自动生成 recovery.conf 文件以供后续恢复流程调用; - `-D`: 设定目的地路径。 一旦初始化完成后,便实现了从节点与主节点的数据一致性。 #### 测试连接性 最后一步就是确认整个集群能否稳定运作。可以通过 Navicat 等图形界面工具来进行直观检验,也可以编写简单的 SQL 查询语句测试读写分离效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会编程的喵星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值