🔐 动作一:签发终极密码本(backup_manifest 的诞生)

  • 物理背景:主库的 walsender 进程已经把所有数据块和 backup_label 发完了,并且等到了归档成功的信号。它准备断开网络了。
  • 合规与防篡改逻辑:但在断开前的最后一秒,PG 13+ 的内核会执行一个神圣的动作——它会把这 3 个小时内发送给你的成千上万个文件,逐一进行极度消耗 CPU 的 SHA-256 哈希计算
  • 网络下发:它将这些哈希值、文件大小、最后修改时间,统一打包成一个 JSON 格式的数字密码本,名为 backup_manifest,顺着网线发给客户端。
  • 工业级意义:有了它,这 5TB 的备份集就拥有了“法医级”的防篡改证明。未来哪怕在 S3 上存放了 5 年,只要用 pg_verifybackup 工具一扫,任何一个比特的静默损坏(Bit Rot)或黑客篡改,都会立刻引发系统红色警报!密码本发完,walsender 发送 CommandComplete,光荣退役,服务端网络正式断开。

🕳️ 动作二:页缓存的死亡陷阱(The Page Cache Illusion)

  • 客户端的恐怖现状:此时客户端(pg_basebackup)已经收到了所有文件。你在 Linux 终端上敲 ls -lh,也能看到 5TB 的文件整整齐齐地躺在目录里。
  • 物理真相这是操作系统给你制造的幻觉! 在 Linux 底层,你写入的数据其实全部堆积在内存的 Page Cache(页缓存) 里。底层的物理机械硬盘/固态硬盘,根本还没来得及把这 5TB 的磁道/闪存颗粒真正刻录完毕。
  • 灾难推演:如果在这一秒钟,备份服务器所在机架的电源线被踢掉。内存瞬间清空。等你重启机器,你会发现那 5TB 的目录里,全都是大小为 0 的空文件,或者内部全是乱码的碎块。备份彻底碎尸万段!

🔨 动作三:极度暴力的 fsync 狂飙(数据的物理镇压)

为了打破这个幻觉,pg_basebackup 在退出前,会亲自接管对硬件的绝对控制权!

  • 源码级微操(fsync_pgdata:客户端程序开始遍历刚才下载的所有文件。
  • 物理狂飙:它对着每一个数据文件(比如 base/16384/12345),极其无情地向 Linux 内核发起 fsync() 系统调用
  • 底层咬合fsync() 是一条极其昂贵、极其霸道的指令。它会强制命令操作系统的电梯调度算法(I/O Scheduler)停下其他工作,必须立刻、马上把这个文件在内存中的脏数据,物理击穿到硬盘的盘片上! 硬盘不回传“写入成功”的物理电信号,fsync() 就死死阻塞,绝不放行。

🗄️ 动作四:连“名字”都不放过(目录 inode 的终极锁定)

这是淘汰 99% 面试者、只有真正写过底层 C 语言存储引擎的大神才懂的绝对死角!

  • 逻辑漏洞:你以为把文件内容的 fsync 刷完就安全了吗?不!在 Linux 中,文件的“内容”和文件的“名字(所在目录)”是两码事。
  • 灾难推演:如果你只刷了文件内容,没刷目录。突然断电后,文件内容确实在硬盘上了,但由于目录的元数据(inode 映射)没刷下去,系统重启后,这个文件变成了没有名字的“孤儿”,被无情地扔进 lost+found 目录,数据库依然无法启动!
  • 架构师的变态微操pg_basebackup 客户端不仅会 open() 文件,它还会极其变态地去 open() 每一个子目录本身(例如打开 base/ 目录,获取到一个目录的文件描述符 fd),然后对着这个“目录”发起 fsync()
  • 物理定性:这一步,是把文件名的映射关系,死死地用钉子焊死在文件系统的目录树上。绝对的万无一失!

🏁 动作五:完美的句号

当这几万个文件、几百个目录的 fsync() 全部成功返回,没有报出任何 I/O 错误。 pg_basebackup 进程才会长舒一口气,在你的终端上打印出那句神圣的:

base backup completed

随后,进程返回退出码 0,完美销毁。


了解 www.876873.xyz 的更多信息

订阅后即可通过电子邮件收到最新文章。

🔴 第五阶段:防篡改与绝对落地 (备份结束):等您坐沙发呢!

发表评论