前提条件
3台服务器并安装Docker
配置PostgreSQL主节点
远程连接PostgreSQL主节点,依次运行以下命令,安装PostgreSQL。
输入
mkdir postgresql
命令,创建postgresql文件夹。输入
cd postgresql
命令,进入postgresql文件夹。输入
vim docker-compose.yml
命令,并将以下内容写入,创建docker-compose.yml文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15version: '3.1'
services:
postgres:
image: postgres:16.1
container_name: postgresql
restart: always
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=<数据库密码>
- TZ=Asia/Shanghai
volumes:
- ./data/:/var/lib/postgresql/data
ports:
- "5432:5432"输入
docker-compose up -d
命令,启动PostgreSQL。
在主节点上创建数据库账号replica(用于主从复制),并设置密码及登录权限和备份权限。
输入命令
docker exec -it postgresql bash
,进入postgresql容器。输入命令
su - postgres
,登录postgres用户。输入
psql
命令进入PostgreSQL交互终端,当显示postgres=#时表示成功进入交互终端。输入以下SQL语句创建数据库账号replica,并设置密码及登录权限和备份权限。
1
CREATE ROLE replica login replication encrypted password '<备份账户密码>';
输入以下SQL语句查询账号是否创建成功。返回记录包含replica,表示已创建成功。
1
SELECT usename from pg_user;
终端输入
\q
,退出SQL终端。输入exit
命令,退出postgres用户,再输入exit
命令,退出容器。
修改创建的postgresql文件夹下data文件中pg_hba.conf文件,检查并设置replica用户白名单,允许从节点密码认证连接和允许用户从replication数据库进行数据同步。
1
2host all all all scram-sha-256 #允许用户密码认证连接
host replication all all scram-sha-256 #允许用户从replication数据库进行同步修改创建的postgresql文件夹下data文件中postgresql.conf文件,分别找到以下参数,并将参数修改为以下内容。
1
2
3
4
5
6
7
8
9listen_addresses = '*' #监听的IP地址
wal_level = replica #启用热备模式
max_wal_senders = 10 #同步最大的进程数量
wal_sender_timeout = 60s #流复制主机发送数据的超时时间
max_connections = 100 #最大连接数,从库的max_connections必须要大于主库的
# 注意,如果配置同步复制,建议是一主二从,防止从库同步异常导致主库hang住。
synchronous_commit = on #开启同步复制
synchronous_standby_names = 'ANY 1 (slave1, slave2)'
#只要primary端wal传到任意一台standby并commit就OK,这里填写的是备库primary_conninfo中application_name参数值。运行
docker restart postgresql
命令,重启服务。
配置PostgreSQL从节点
远程连接PostgreSQL从节点1,同上PostgreSQL主节点安装操作,安装PostgreSQL。
使用pg_basebackup基础备份工具指定备份目录(注意:备份后主节点不可进行任何操作,直到验证从节点正常才可操作主节点)。
输入命令
docker exec -it postgresql bash
,进入postgresql容器。进入 /var/lib/postgresql/data 目录,在目录下创建 data_new 文件夹
运行以下命令,使用pg_basebackup基础备份工具指定备份目录。
1
pg_basebackup -h <主节点ip> -p 5432 -U replica -D <保存路径> -X stream -P -R
注意:-R选项用于创建用于replication的配置文件,生成$PGDATA/standby.signal文件,该文件必须存在,用来标识这是一个备库。
输入
exit
命令,退出容器。
修改创建的postgresql文件夹下data文件夹下data_new文件夹中postgresql.conf文件,分别找到以下参数,并将参数修改为以下内容。
1
2
3
4
5
6recovery_target_timeline = 'latest' #流复制同步到最新的数据
max_connections = 1000 # 最大连接数,从节点需设置比主节点大
hot_standby = on # 开启热备
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 1s # 从节点向主节点报告自身状态的最长间隔时间
hot_standby_feedback = on # 如果有错误的数据复制向主进行反馈修改创建的postgresql文件夹下data文件夹下data_new文件夹中postgresql.auto.conf文件,在 primary_conninfo 参数配置添加
application_name=slave1
。1
primary_conninfo = '******** application_name=slave1'
输入命令,将data_new文件夹中内容替换创建的postgresql文件夹下data文件夹内容。
运行
docker restart postgresql
命令,重启服务。远程连接PostgreSQL从节点2,重复从节点1操作(将slave1改为slave2)。
检测验证
在主节点中进入PostgreSQL交互终端,输入以下SQL语句,在主库中查看从库状态。
运行以下命令,登录postgres用户。
1
su - postgres
输入
psql
命令进入PostgreSQL交互终端,当显示postgres=#时表示成功进入交互终端。运行以下命令,在主库中查看从库状态,返回结果如下图,表示可成功查看到从库状态。
1
select * from pg_stat_replication;
终端输入
\q
,并按Enter退出SQL终端。输入exit
命令,并按Enter退出PostgreSQL。