主要观点:构建pg_search
时优先考虑写吞吐量,选择了优化写的 Log-Structured Merge (LSM)树数据结构,但此结构破坏了 Postgres 复制,尤其是物理复制;深入探讨了 LSM 树、复制安全的含义、Postgres 的 Write-Ahead Log (WAL) 如何保证物理一致性、逻辑一致性所需的原子日志记录以及利用hot_standby_feedback
设置等内容。
关键信息:
- LSM 树通过将随机写转为顺序写提高写吞吐量,数据先存于内存缓冲 memtable,满后刷到磁盘成段文件,通过合并等操作逐渐向下层移动。
- 可靠的分布式数据库需保证物理和逻辑一致性,物理一致性指副本包含有效数据,逻辑一致性确保数据反映数据库的连贯稳定视图。
- Postgres 的 WAL 用于记录主服务器存储块的变化并同步到备用服务器以保证物理一致性,原子性是物理一致性的要求,防止数据结构损坏。
- VACUUM 会干扰并发事务的执行并影响逻辑一致性,LSM 树因压缩频繁更易出现此类问题。
hot_standby_feedback
允许备用服务器告知主服务器从其角度哪些数据可安全清理,有助于减少元组被过早清理的可能性。
重要细节:pg_search
使用展开的链表存储 Postgres 缓冲,通过手递手锁定保证主服务器上链表的物理一致性。- 对于多节点操作,
pg_search
使用写时复制(Copy-on-Write)克隆链表并原子交换头部。 - 每个 Postgres 元组有
xmin
和xmax
元数据属性,hot_standby_feedback
利用此信息让主服务器更智能地决定清理操作的时机。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。