暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

《PostgreSQL 14 internals》中文版,快来了

原创 xiongcc 2024-06-21
1245

前言

各位读者好久不见,关于《PostgreSQL14 internals》书籍翻译的事情,在此很高兴地告诉各位,所有章节都已经复核完毕了,进度快的话这一两个月内。由于笔者不是内核开发出身,为了确保翻译质量,我前前后后总共审核了四轮:

  1. 第一轮粗糙翻译成中文
  2. 第二轮逐字逐句总体过一遍,主要过滤一些错别字、语法问题,以及确保翻译风格符合国内读者的习惯
  3. 第三轮将有疑惑的地方,筛选出来,与主作者 Egor 和 postgrespro 团队沟通确认
  4. 第四轮主要审查相对复杂的章节,比如 Buffer cache、统计信息等等

图片

翻译过程十分艰辛,耗费笔者大量精力与时间,好在终于快看到了曙光,毕竟鸽了这么久了。

痛并快乐着

聊聊翻译过程中的感受,就一个字——累,说不累那是假的,从最开始萌生翻译的想法,迄今大概也花了两年时间有余。我在去年 4 月 23 号的时候也简单写过一篇感想,👉🏻聊聊PostgreSQL 14 internal这本书,耗时 7 个月完成初稿翻译。翻译过程,花费了我大量业余时间,最为夸张的时候,每天基本都是十二点往后才睡 (工作繁忙 + 自学语言 + 翻译 + 杂七杂八的副业等等),所以标题我也很戏谑地自嘲道——痛并快乐着,但是老实说,这本书让我对 PostgreSQL 的理解更为深入,是一本不可多得的优质书籍。

《PostgreSQL14 internal》 原版是俄文,再之翻译成英文版,最后由我翻译为了中文 (按照作者意思,可能后面不会再有更多的种类,在此也十分感谢作者的授权),另外由于语言之间存在着诸多差异,所以许多地方直译过来特别生硬以及难以理解,举个栗子

The server log shows the number of written buffers, some statistics on WAL file changes after the checkpoint, the duration of the checkpoint, and the distance (in bytes) between the starts of two neighboring checkpoints

此处的 distance 直译过来就是距离,描述的是检查点之间的"距离",何为距离?日志中也有一些内容,比如 distance=9213 kB, estimate=9213 kB

如果是新手的话,看到这个距离肯定十分晕乎,实际上其描述的是检查点之间的 WAL 日志量,内核用来预估后面的 WAL 日志的预分配。又比如关于 walsender 传输 WAL 的细节:

So if a replica does not receive WAL entries while the required pages are still in the OS buffers of the primary server, the data has to be read from disk. But the access will still be sequential rather than random.

如果直译过来的话就是 (来自谷歌翻译):

因此,如果副本服务器未收到 WAL 条目,而所需页面仍在主服务器的 OS 缓冲区中,则必须从磁盘读取数据。但访问仍将是连续的,而不是随机的。

是不是也搞的云里雾里?我最开始也不理解,所以特意去请教了 Egor,翻译过程中失真了,其准确含义是

walsender进程直接从文件中读取 WAL 条目,如果备库没有接收到需要的 WAL 条目,那么 walsender 进程将从文件中读取,只是读取过程是顺序的,而不是随机的 (也有可能在主库的操作系统缓存中找到相应的 WAL 条目)。

以上,这一段也是我实际翻译出来的内容,一来减少困惑的地方,二来读起来能够直截了当地领会其中含义。再加上许多专业术语,比如 ring buffer,buffer ring,tranche (我最开始看到这个 tranche 也是懵逼的状态,十分晦涩的专业术语,此术语用于描述一组"锁集",比如我们熟知的 Buffermapping),generic plan 等等。

还有种种,为了确保翻译质量,我基本上都一一进行了确认,耗时久是正常的,经常也能在①群②群里看到一些读者戏谑道怎么鸽了这么久,当真是实属无奈啊,一个人精力着实有限。

除此之外,这本书中还包含了大量内核原理,比如

  1. 老生常谈的页剪枝
  2. 一些打破 MVCC 隔离性的行为
  3. 锁升级
  4. TOAST 不经过 ring buffer
  5. 两条 UPDATE 语句导致的死锁
  6. 什么情况下索引扫描和顺序扫描的结果不一致 (非索引损坏这些 corner case)
  7. NLJ,MergeJoin,HashJoin 等成本计算方式,以及并非所有场景都是选择代价低的 (有一个 fuzz_factor)

以上只是冰山一角,更多原理各位可以等到此书正式出版。另外,虽然是此书是基于 14 所写 (17 马上也要正式发布),但是正如作者所述,其中原理都是互通的,并且短期内不会有太大的变化 (比如进程改线程、DIO、存储引擎等),相信读者阅读此书定能够有所收获。

书名

哦对了,还有一点让笔者抓脑壳的地方,就是书名,此书原名是 14 internal,我最开始想着取为"PostgreSQL 14 内幕原理",但是清华出版社的老师说现在不让用"内幕"一词了,或许"内核原理"、"内幕指南"等等也成,暂时还没有敲定,容我再琢磨琢磨,各位读者有好的建议也欢迎下方留言讨论,一经采纳,定当感激不尽,我也会额外赠送一份浓缩了我多年工作经验的"PostgreSQL DBA Daily 5.0"纸质大图。

后话

就聊这么多吧,总而言之,翻译过程十分艰辛,其中心酸只有笔者知道,但是好在快见到曙光了,各位可以等待中文本书籍的正式发布 (快的话就这一两个月)。正好中文书籍也空档很久了,填补一下这块。

感谢各位读者的支持!

最后修改时间:2024-06-24 12:31:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论