这部分纯理论内容,结合配图和数据进程了解流复制的工作逻辑。
PostgreSQL在数据目录下的pg_wal(旧版为pg_xlog)子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。
把WAL日志传送到另一台服务器有两种方式,分别是:
wal日志即write ahead log预写式日志,简称wal日志。wal日志可以说是PostgreSQL中十分重要的部分,相当于oracle中的redo日志。
当数据库中数据发生变更时:
change发生时:先要将变更后内容计入wal buffer中,再将变更后的数据写入data buffer;
commit发生时:wal buffer中数据刷新到磁盘;
checkpoint发生时:将所有data buffer刷新的磁盘。
如果没有wal日志,那么每次更新都会将数据刷到磁盘上,并且这个动作是随机i/o,性能可想而知。并且没有wal日志,关系型数据库中事务的ACID如何保证呢?因此wal日志重要性可想而知。其中心思想就是:先写入日志文件,再写入数据。
最简的主从配置完成后,可以观察主库和从库启动的进程。
[pg@localhost ~]$ ps -auxf|grep postgres|grep -v grep
pg 31569 0.0 0.4 396536 17048 pts/0 S 10:17 0:00 /usr/pgsql-10/bin/postgres -D /data/db2
pg 31570 0.0 0.0 251456 1952 ? Ss 10:17 0:00 \_ postgres: logger process
pg 31571 0.0 0.0 396632 3416 ? Ss 10:17 0:00 \_ postgres: startup process recovering 000000010000000000000001
pg 31572 0.0 0.0 396536 3704 ? Ss 10:17 0:00 \_ postgres: checkpointer process
pg 31573 0.0 0.0 396536 3212 ? Ss 10:17 0:00 \_ postgres: writer process
pg 31574 0.0 0.0 251452 1988 ? Ss 10:17 0:00 \_ postgres: stats collector process
pg 4314 0.0 0.1 403804 4236 ? Ss 11:41 0:00 \_ postgres: wal receiver process streaming 0/16BEDA0
pg 4304 0.0 0.4 396536 17040 pts/0 S 11:41 0:00 /usr/pgsql-10/bin/postgres -D /data/db1
pg 4305 0.0 0.0 251456 1956 ? Ss 11:41 0:00 \_ postgres: logger process
pg 4307 0.0 0.0 396688 3688 ? Ss 11:41 0:00 \_ postgres: checkpointer process
pg 4308 0.0 0.0 396536 3448 ? Ss 11:41 0:00 \_ postgres: writer process
pg 4309 0.0 0.1 396536 6348 ? Ss 11:41 0:00 \_ postgres: wal writer process
pg 4310 0.0 0.0 396944 3080 ? Ss 11:41 0:00 \_ postgres: autovacuum launcher process
pg 4311 0.0 0.0 251588 2180 ? Ss 11:41 0:00 \_ postgres: stats collector process
pg 4312 0.0 0.0 396828 2520 ? Ss 11:41 0:00 \_ postgres: bgworker: logical replication launcher
pg 4315 0.0 0.0 397328 3568 ? Ss 11:41 0:00 \_ postgres: wal sender process pg ::1(43162) streaming 0/16BEDA0
主要分为以下几个流程:
Postgresql数据库提供了五种同步模式,同步模式主要由synchronous_commit参数控制。下面简单介绍一下五种同步模式的区别: