PostgreSQL【高可用篇】02:PostgreSQL14版本【Docker环境】主从复制搭建

一、环境准备

1、环境信息

192.168.184.191  pg-01  主节点
192.168.184.192  pg-02  从节点
192.168.184.193  pg-03  从节点

2、安装docker

docker基础操作可参考:Docker常见操作

(1)安装docker服务

# 卸载docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
 
# 安装docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
 
# 启动
sudo systemctl start docker
 
# 设置开启启动
sudo systemctl enable docker
 
# 验证docker版本
docker --version

在这里插入图片描述

(2)设置镜像加速器【国内镜像地址都失效了】

使用科学上网吧。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://dynfmcgc.mirror.aliyuncs.com"]
}
EOF
service docker restart
service docker status

在这里插入图片描述

2、创建PostgresSQL的Docker镜像

(1)pull镜像

docker pull postgres:14

在这里插入图片描述
如果pull不了的话,就下载网盘中的镜像,自己导入即可

链接: https://pan.baidu.com/s/1SNMDDyHh1gJNgHQ9-cn53w?pwd=4ddd
提取码: 4ddd 
docker load < /root/postgre14.tar.gz

(2)查询镜像

docker images

在这里插入图片描述

二、主库部署

1、建立主库数据挂载目录

mkdir -p /usr/local/datamaster

在这里插入图片描述

2、启动docker镜像

docker run --name mymaster -e POSTGRES_PASSWORD=admin -p 1922:5432 -v /usr/local/datamaster/postgres:/var/lib/postgresql/data -d postgres:14

在这里插入图片描述

# 一些参数的说明
# 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

3、查看是否创建成功

docker ps

在这里插入图片描述

4、创建复制用户

(1)进入docker

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

在这里插入图片描述

(2)创建复制用户

# 创建复制用户
CREATE ROLE replica login replication encrypted password 'admin';
# 查看是否创建成功
\du
# 退出
exit
exit

在这里插入图片描述

5、修改配置文件

(1)检查是否存在归档目录

cd /usr/local/datamaster/postgres
ll

在这里插入图片描述
如果不存在则进行创建

mkdir -p /usr/local/datamaster/postgres/arc
chmod 777 /usr/local/datamaster/postgres/arc

在这里插入图片描述

(2)修改配置文件postgresql.conf

cd /usr/local/datamaster/postgres
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

(3)修改配置文件pg_hba.conf

cd /usr/local/datamaster/postgres
vim pg_hba.conf
# 在最后新增一行
host    replication     replica         172.0.0.0/8            md5
host    replication     replica         192.0.0.0/8            md5

在这里插入图片描述

6、重启服务

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

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

在这里插入图片描述

三、部署从库192节点

1、建立psql备库的data地址

mkdir -p /usr/local/data

在这里插入图片描述

2、启动docker镜像

docker run --name mystl01 -e POSTGRES_PASSWORD=admin -p 1921:5432 -v /usr/local/data/postgres:/var/lib/postgresql/data -d postgres:14

docker ps

在这里插入图片描述

# 一些参数的说明
# 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

3、备库从主库同步

(1)进入容器

docker exec -it mystl01 bash

在这里插入图片描述

(2)配置复制

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

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

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

注意:如果删除之后备库崩了,可以退出备库,docker restart mystl重启docker然后在进入备库

4、检查是否同步

cd /usr/local/data/postgres
cat postgresql.auto.conf

在这里插入图片描述
如下,说明成功

# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica password=admin channel_binding=prefer host=192.168.184.191 port=1922 sslmode=prefer sslnegotiation=postgres sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

四、部署从库193节点

1、建立psql备库的data地址

mkdir -p /usr/local/data

在这里插入图片描述

2、启动docker镜像

docker run --name mystl02 -e POSTGRES_PASSWORD=admin -p 1920:5432 -v /usr/local/data/postgres:/var/lib/postgresql/data -d postgres:14

docker ps

在这里插入图片描述

# 一些参数的说明
# 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

3、备库从主库同步

(1)进入容器

docker exec -it mystl02 bash

在这里插入图片描述

(2)配置复制

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

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

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

4、检查是否同步

cd /usr/local/data/postgres
cat postgresql.auto.conf

在这里插入图片描述
如下,说明成功

# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica password=admin channel_binding=prefer host=192.168.184.191 port=1922 sslmode=prefer sslnegotiation=postgres sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

五、测试验证主从

1、主库创建测试数据

create database mydb1;
create database mydb2;
create database mydb3;
\c mydb1;
create schema mydb1_pgtest1;
create schema mydb1_pgtest2;
create schema mydb1_pgtest3;
\c mydb2;
create schema mydb2_pgtest1;
create schema mydb2_pgtest2;
create schema mydb2_pgtest3;
\c mydb3;
create schema mydb3_pgtest1;
create schema mydb3_pgtest2;
create schema mydb3_pgtest3;

\c mydb1;
create table mydb1_pgtest1.t1(id int primary key,name varchar(20));
create table mydb1_pgtest1.t2(id int primary key,name varchar(20));
create table mydb1_pgtest1.t3(id int primary key,name varchar(20));
INSERT INTO mydb1_pgtest1.t1 (id, name) VALUES(1, 'mydb1_pgtest1_t1');
INSERT INTO mydb1_pgtest1.t2 (id, name) VALUES(1, 'mydb1_pgtest1_t2');
INSERT INTO mydb1_pgtest1.t3 (id, name) VALUES(1, 'mydb1_pgtest1_t3');
create table mydb1_pgtest2.t2(id int primary key,name varchar(20));
INSERT INTO mydb1_pgtest2.t2 (id, name) VALUES(1, 'mydb1_pgtest2');
create table mydb1_pgtest3.t3(id int primary key,name varchar(20));
INSERT INTO mydb1_pgtest3.t3 (id, name) VALUES(1, 'mydb1_pgtest3');

\c mydb2;
create table mydb2_pgtest1.t1(id int primary key,name varchar(20));
INSERT INTO mydb2_pgtest1.t1 (id, name) VALUES(1, 'mydb2_pgtest1');
create table mydb2_pgtest2.t2(id int primary key,name varchar(20));
INSERT INTO mydb2_pgtest2.t2 (id, name) VALUES(1, 'mydb2_pgtest2');
create table mydb2_pgtest3.t3(id int primary key,name varchar(20));
INSERT INTO mydb2_pgtest3.t3 (id, name) VALUES(1, 'mydb2_pgtest3');

\c mydb3;
create table mydb3_pgtest1.t1(id int primary key,name varchar(20));
INSERT INTO mydb3_pgtest1.t1 (id, name) VALUES(1, 'mydb3_pgtest1');
create table mydb3_pgtest2.t2(id int primary key,name varchar(20));
INSERT INTO mydb3_pgtest2.t2 (id, name) VALUES(1, 'mydb3_pgtest2');
create table mydb3_pgtest3.t3(id int primary key,name varchar(20));
INSERT INTO mydb3_pgtest3.t3 (id, name) VALUES(1, 'mydb3_pgtest3');

在这里插入图片描述

2、从库查询数据

(1)查看有哪些数据库

\l+

在这里插入图片描述

(2)查看当前库有哪些schema

\c mydb1
\dn+
\c mydb2
\dn+
\c mydb3
\dn+

在这里插入图片描述

(3)查看有哪些表

\c mydb1
\dt mydb1_pgtest1.*
\dt mydb1_pgtest2.*
\dt mydb1_pgtest3.*

\c mydb2
\dt mydb2_pgtest1.*
\dt mydb2_pgtest2.*
\dt mydb2_pgtest3.*

\c mydb3
\dt mydb3_pgtest1.*
\dt mydb3_pgtest2.*
\dt mydb3_pgtest3.*

在这里插入图片描述

(3)查看表中数据

\c mydb1
select * from mydb1_pgtest1.t1;
select * from mydb1_pgtest2.t2;
select * from mydb1_pgtest3.t3;

\c mydb2
select * from mydb2_pgtest1.t1;
select * from mydb2_pgtest2.t2;
select * from mydb2_pgtest3.t3;

\c mydb3
select * from mydb3_pgtest1.t1;
select * from mydb3_pgtest2.t2;
select * from mydb3_pgtest3.t3;

在这里插入图片描述

要在Docker上安装主从PostgreSQL,可以按照以下步骤进行操作: 1. 首先,在Docker中安装PostgreSQL。可以使用以下命令来安装PostgreSQL容器: ``` docker run --name postgres \ --restart=always \ -e TZ=Asia/Shanghai \ -e POSTGRES_PASSWORD=ly123456 \ -p 5432:5432 \ -v /data/postgresql/data:/var/lib/postgresql/data \ -d postgres ``` 这个命令将创建一个名为 "postgres" 的PostgreSQL容器,并设置了密码为 "ly123456",将PostgreSQL的数据目录挂载到宿主机的"/data/postgresql/data"路径上。 2. 然后,配置主从复制。首先,检查postgresql.auto.conf文件是否包含"primary_conninfo"配置项,其中包含了主数据库的连接信息。可以使用以下命令查看文件内容: ``` cat /data/postgresql/data/postgresql.auto.conf ``` 如果没有该配置项,可以手动添加它。在文件末尾添加以下内容: ``` primary_conninfo = 'user=syncuser' ``` 其中,"syncuser"是在主数据库上创建的用于复制的用户。 3. 接下来,创建从数据库。可以使用以下命令创建一个新的PostgreSQL容器作为从数据库: ``` docker run -d -p 54321:5432 --name postgres --restart=always -v /devel/xwq/pgsql_data_dir/d14r1n17:/var/lib/postgresql/data/ 7e309048b14d ``` 这个命令将创建一个名为 "postgres" 的从数据库容器。 4. 重新启动容器以使配置生效: ``` docker restart postgres ``` 现在,你已经成功安装了主从PostgreSQL。你可以通过连接到主数据库和从数据库来进行验证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用docker搭建postgresql主从复制](https://blog.csdn.net/yyb1369584682/article/details/122498271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [docker PostgreSQL 14.1 主从配置](https://blog.csdn.net/huangwp2000/article/details/126361659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

做一个有趣的人Zz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值