PostgreSQL主从同步介绍
PostgreSQL 主从同步(也称为流复制)的原理是基于基于日志的复制机制(Write-Ahead Logging, WAL)进行的。这种机制使得数据在主数据库(Primary)和从数据库(Standby)之间保持同步,从而确保高可用性和数据冗余。
主从同步的基本概念
- 主数据库(Primary):负责处理所有写操作(插入、更新、删除)以及读操作。
- 从数据库(Standby):负责接收从主数据库传递来的WAL日志,并应用这些日志以保持数据的一致性。可以配置为只读以分担查询负载。
流复制原理
PostgreSQL 流复制的关键机制如下:
- WAL 日志:主数据库将所有变更首先写入 WAL 日志文件。这些日志记录了数据库的每一个修改操作。
- 发送 WAL 数据:主数据库将 WAL 日志发送给从数据库。发送是通过 WAL Sender 进程(
wal_sender
)来完成的。 - 接收和写入 WAL 数据:从数据库通过 WAL Receiver 进程(
wal_receiver
)接受来自主数据库的 WAL 日志,并将其写入本地存储。 - 应用 WAL 数据:从数据库将接收到的 WAL 日志应用到自身的数据库实例中,从而使数据与主数据库保持一致。
流复制的工作流程
-
主数据库写 WAL 日志:
- 主数据库生成的每个事务变更都会记录到 WAL 日志文件中。
- WAL 日志文件通常被以 16MB 为一个文件块存储,称为 WAL 段。
-
WAL Sender 发送日志:
- 主数据库的 WAL Sender 进程将最新的 WAL 日志记录发送给从数据库。
postgresql.conf
中的max_wal_senders
参数决定了可以启动多少个 WAL Sender 进程。
-
WAL Receiver 接收日志:
- 从数据库的 WAL Receiver 进程接收 WAL 日志,并将其保存在本地的 WAL 目录中。
- 从数据库启动时,配置文件
recovery.conf
中的standby_mode
设置为on
,并配置primary_conninfo
用于连接主数据库。
-
应用 WAL 日志:
- 从数据库将接收到的 WAL 日志应用到自己的数据文件中,以使其与主数据库保持同步。
- 在 PostgreSQL 13 版本及更高版本中,
recovery.conf
的内容被合并到postgresql.conf
中。
PostgreSQL 主从同步利用 WAL 日志文件实现数据同步,确保从数据库和主数据库之间的数据一致性。通过 WAL Sender 和 WAL Receiver 进程,变更数据被实时传输和应用,使系统能够有效地实现高可用性和负载均衡。