postgresql主从搭建教程
使用docker部署postgresql,并搭建主从配置
两台节点ip地址:192.168.221.120,192.168.221.121
前置准备工作:
两台机器分别安装docker,拉取镜像
docker pull postgres:14.7-alpine3.17
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
主节点执行:
#创建映射目录
mkdir /data/postgres
#启动容器
docker run -d -p 5432:5432 -v /data/postgres/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=JiaLve123! --name postgres postgres:14.7-alpine3.17
#进入容器
docker exec -it postgres bash
#进入命令行
psql -U postgres
#创建用于复制的用户
CREATE ROLE replica login replication encrypted password 'replica';
#修改vi /var/lib/postgresql/data/pg_hba.conf文件末尾添加下面这行,第三列是上面创建的用于复制的用户名,第四列为从节点ip地址
host replication replica 192.168.221.121/24 md5
#修改vi /var/lib/postgresql/data/postgresql.conf文件中以下值
listen_addresses = '*' #允许数据库监听所有IP地址,即可以通过任何网络接口连接。
archive_mode = on #启用归档模式,允许数据库将 WAL(Write-Ahead Logging)日志文件存档。
archive_command = '/bin/date' #只是将日期打印出来,取消了真正的归档。
wal_level = replica #设置为 replica,表示开启了逻辑复制以支持热备。
max_wal_senders = 10 #设置能够连接到主服务器进行 WAL 复制的最大连接数。这是为了支持有多个从服务器的场景。
wal_keep_size = 1024 #设置 WAL 文件的保留大小,以兆字节(M)为单位。超过这个大小的日志文件将不会被删除,以便后续从备份中进行还原。
wal_sender_timeout = 60s #设置 WAL 发送者(主服务器)发送数据的超时时间,这里是60秒。
max_connections = 100 #设置数据库允许的最大连接数。在这里要注意,从库的最大连接数必须大于主库的连接数,确保从库可以处理主库发送的所有连接。
#退出容器,并重启
docker restart postgres
从节点执行:
#启动容器,注意这里没有进行数据卷挂载,因为后面要删除数据将主节点数据同步过来
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=JiaLve123! --name postgres postgres:14.7-alpine3.17
#进入容器
docker exec -it postgres bash
#删除数据,并将主节点数据同步过来(注意-h后面跟着的是主节点ip,-U后面是主节点创建的用于复制的用户名,需要输入密码时就是用于复制的用户名的密码)
rm -rf /var/lib/postgresql/data/* && pg_basebackup -h 192.168.221.120 -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data
#数据同步后容器会关闭。再启动即可
docker start postgres
#再进入容器创建standby.signal
docker exec -it postgres bash
#创建文件vi /var/lib/postgresql/data/standby.signal 添加下面这行内容声明从库
standby_mode = 'on'
#修改文件vi /var/lib/postgresql/data/postgresql.conf 修改以下配置
wal_level = replica # 设置 WAL 日志的级别为 replica,表示开启逻辑复制以支持热备。
primary_conninfo = 'host=192.168.221.120 port=15432 user=replica password=replica' # 配置主库ip地址以及端口号,以及用于复制的用户名和密码
hot_standby = on # 在恢复期间允许查询。这是在流复制过程中,从库在进行 WAL 日志恢复的同时允许查询读取。
recovery_target_timeline = latest # 设置恢复的目标时间线。在这里,设置为 latest 表示从库将一直尝试连接到主库的最新时间线上。
max_connections = 120 #必须大于主节点的连接数。这确保从库可以处理主库发送的所有连接请求。
#重启从库
docker restart postgres
查看主从状态
#进入主节点容器,
docker exec -it postgres bash
#进入pg命令行
psql -U postgres
#查询是否正在同步
select client_addr,sync_state from pg_stat_replication;
#sql查询结果类似下面则代表正在同步
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
-----------------+------------
192.168.221.121 | async
(1 row)
测试:
-- 主节点创建数据库
create database test;
-- 从节点查看是否同步过来了,进入命令行执行:
\l
-- 从节点能够看到test数据库说明主从搭建完成,大功告成!!!