这里使用两台服务器为192.168.1.1和192.168.1.2,其中192.168.1.1为主数据库,192.168.1.2为从数据库。
一. 配置192.168.1.1主数据库
1. docker compose文件如下(postgres.yml):
postgres:
image: postgres:14
container_name: postgres-master
ports:
- 5432:5432
volumes:
- ${BASE_VOLUME_PATH}/postgresql/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=root
- POSTGRES_PASSWORD=111@111
restart: always
2.启动数据库
docker compose -f postgres.yml up -d
3.创建主从复制用户
在主数据库中执行SQL语句:
CREATE ROLE replica_user login replication encrypted password '123456';
4. 修改pg_hba.conf配置
host replication replica_user 192.168.1.2/32 trust
5. 修改postgresql.conf配置
listen_addresses = '*' #监听所有IP
archive_mode = on #允许归档
archive_command = 'cp -i %p /4T/%f </dev/null' #用该命令来归档logfile segment。
wal_level = replica #开启热备
max_wal_senders = 10 #这个设置了可以最多有几个流复制连接
wal_keep_size = 1024 #设置wal的大小,单位M。
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 #从库的max_connections必须要大于主库的
6. 重启主数据库
docker restart postgres-master
二 配置192.168.1.2从数据库
1. 使用主数据库的docker compose文件,修改容器名称
postgres:
image: postgres:14
container_name: postgres-slave
ports:
- 5432:5432
volumes:
- ${BASE_VOLUME_PATH}/postgresql/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=root
- POSTGRES_PASSWORD=111@111
restart: always
2.启动数据库
docker compose -f postgres.yml up -d
3. 同步主节点数据
进入从库容器,删除自身的数据,同步主节点数据。
docker exec -it postgres-slave bash
cd /var/lib/postgresql/data/
rm -rf *
pg_basebackup -h 192.168.1.1 -p 15432 -U replica_user -Fp -Xs -Pv -R -D /var/lib/postgresql/data
4. 修改postgresql.conf配置
wal_level = replica # WAL 日志级别为 replica
primary_conninfo = 'host=192.168.1.1 port=15432 user=replica_user password=123456' # 主库连接信息
hot_standby = on # 恢复期间,允许查询
recovery_target_timeline = latest # 默认
max_connections = 120 # 大于等于主节点,正式环境应当重新考虑此值的大小
5. 重启从数据库容器
docker restart postgres-slave
三 验证
在主数据库上执行以下SQL,查看主从复制是否生效。
select client_addr,sync_state from pg_stat_replication;

在主数据库创建一张test表,查看从库是否也存在test表。
create table test_1(v1 varchar(100));

本文详细描述了如何使用Docker和docker-compose在两台服务器上配置PostgreSQL主从复制,包括主数据库的设置、从数据库的同步和验证过程。
2859

被折叠的 条评论
为什么被折叠?



