一、环境准备
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;