Docker 中 PostgreSql 主从热备,主从切换计划
环境阐明
- Docker
- Windows 11
- PostgreSql 17
树立进程
0. 宿主机预备:
- 找个当地创立一个文件夹用来挂载容器中数据库Data文件夹,这儿我用的是:
C:\Users\Administrator\docker\Postgresql\replication
1. 主数据库预备:
- 履行docker run 指令,创立主数据库容器:pgsmaster
docker run --name pgsmaster -p 5400:5432 -e POSTGRES_PASSWORD=123456 -v C:\Users\Administrator\docker\Postgresql\replication\pgsmaster:/var/lib/postgresql/data -d postgres
- 增加仿制人物用户:
# 1.进入容器
docker exec -it pgsmaster bash
# 2.衔接PostgreSQL
psql -U postgres
# 3.创立用户
// replicator: 仿制账号; 123456: 认证暗码
create role replicator login replication encrypted password '123456';
# 4.验证用户
\du
# 呈现如下列表则用户创立成功
List of roles
Role name | Attributes
-----------+-------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
replicator | Replication
-
宿主机找到挂载文件夹:
C:\Users\Administrator\docker\Postgresql\replication\pgsmaster
下的postgresql.conf
文件,修正装备:1. listen_addresses ='*' 2. wal_level = replica
-
找到
pg_hba.conf
文件,最终一行增加装备:
host replication replicator 172.17.0.0/16 md5
- 重启容器:
docker restart pgsmaster
到这儿主数据库就预备好了~
2. 从数据库预备:
- 相同履行docker run 指令,创立一个从数据库容器:
docker run --name pgsslave -p 5401:5432 -e POSTGRES_PASSWORD=123456 -v C:\Users\Administrator\docker\Postgresql\replication\pgsslave:/var/lib/postgresql/data -d postgres
- 进入容器,进行主库仿制:
# 1. 进入容器
docker exec -it pgsslave bash
# 2. 切换postgres用户
su postgres
# 3. 清空data文件夹
rm -rf /var/lib/postgresql/data/*
# 4. 履行仿制, 需求输入暗码即主数据库创立仿制用户replicator的暗码‘123456’
pg_basebackup -h 172.17.0.6 -U replicator -R -P -v -C --slot=pgsslave -D /var/lib/postgresql/data
[!NOTE] 指令阐明:
-R 阐明会创立standby.signal文件,以及弥补postgresql.auto.conf的内容
-P 显现备份进展
-v 显现愈加详细信息
-C 一起创立仿制槽
-slot 指定仿制槽的姓名(一个备库一个姓名)
-D 生成备库的途径
[!NOTE] 仿制槽的优点:
主库的业务日志一向处于翻滚耗费的状况,假如备库下线,跟着主库频频的数据变化,或许就会存在当备库从头上线后,现已找不到之前没有拉取的业务日志的状况(被主库收回掉了)。
可是有了仿制槽,主库就会为仿制槽保存它没有消费的日志,等候它上线后进行消费。当然价值是对磁盘的耗费,不过只需备库不是永久丢掉,磁盘耗费关于大部分场景来说不是问题。
可是假如备库永久丢掉了,要记住删去主库中对应的仿制槽。删去仿制槽的句子为 :select pg_drop_replication_slot('pgsslave');
- 重启容器
docker restart pgsslave
- 承认是否成功, 主库履行下列查询即可
select * from pg_replication_slots;\\查询主库中的插槽
select * from pg_stat_replication;\\查询已树立衔接的备份库
主从切换
1. 从库切换成主库
运用以下句子将从库切换成主库
select pg_promote();
此刻,从库data中的standby.signal文件已删去;并修正pg_hba.conf 文件,ip改为原主库ip
host replication replicator 172.17.0.0/16 md5
2. 删去原主库仿制槽
select pg_drop_replication_slot('pgsslave2');
3. 将原从库的data备份到原主库
这一步是全量备份,所以要注意假如库很大,会很费时间,尽管官方文档说不会影响其他客户端,可是肯定会耗费主库的cpu,内存,磁盘I/O以及带宽;
pg_basebackup -h 172.17.0.7 -U replicator -R -P -v -C --slot=pgsslave -D /var/lib/postgresql/data
此刻,主库就会变成从库,从库中也能查询到对应的备份衔接
测验
1. 监控推迟
PostgreSQL 供给了一些体系视图和函数来检查仿制推迟:
pg_stat_replication
:该视图显现主数据库的流仿制状况,包含从数据库的仿制推迟。能够运用以下查询来检查当时的推迟:
SELECT
application_name,
client_addr,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replication_lag
FROM pg_stat_replication;
-- 其间,replication_lag 表明主数据库当时生成的 WAL 日志比从数据库已使用的日志多出多少个字节。则表明是推迟巨细。
2. 主库宕机
- 从库中止承受WAL日志,等候主库康复。
- 从库查询服务不受影响,能够持续承受只读查询。
- 主库手动康复后,从库会开端从主库接纳 WAL 日志并康复同步,康复进程是主动的。
3. 从库宕机
- 从库中止承受WAL日志且无法供给查询服务。
- 主库读写正常,不受影响。
- 从库手动康复后,从库主动消费积压的WAL日志并与主库同步。