其他
PostgreSQL 中的 smgr 接口
🐘smgr
smgr
是PostgreSQL 提供的存储管理器,具有以下公共接口例程来存储表和索引的元组。在我看来,PostgreSQL 主要有三种类型的文件保存在磁盘上:1)“配置”相关文件,如 postgresql.conf、pg_hba.conf 和 pg_control 等;
2) 预写日志文件,即 WAL;
3)存储表和索引元组的实际文件。旨在仅处理后者。
smgr smgr
static const f_smgr smgrsw[] = {
/* magnetic disk */
{
.smgr_init = mdinit,
.smgr_shutdown = NULL,
.smgr_open = mdopen,
.smgr_close = mdclose,
.smgr_create = mdcreate,
.smgr_exists = mdexists,
.smgr_unlink = mdunlink,
.smgr_extend = mdextend,
.smgr_prefetch = mdprefetch,
.smgr_read = mdread,
.smgr_write = mdwrite,
.smgr_writeback = mdwriteback,
.smgr_nblocks = mdnblocks,
.smgr_truncate = mdtruncate,
.smgr_immedsync = mdimmedsync,
}
};
md
开始,因为PostgreSQL在过去被设计用于处理磁盘。 要体验smgr界面,一个简单的想法是构建TCP / IP服务器和客户端。看「在服务器端」,添加逻辑来实现一些基本接口,如创建、打开、读取、写入和关闭。然后,定义一个简单的协议,以指示具有相应错误代码的不同操作。「在客户端」,将 smgr.c 中的“mdxxxx”替换为可以通过 TCP/IP 连接将这些文件操作转发到服务器端的函数。然后,从服务器读取或写入页面或向服务器写入页面的结果将发送回调用方。
🎄通过这些最小的更改,可以设置一个非常简单的原型来分离计算和存储。但是,如果要将计算和存储分开的工作解决方案,则需要考虑更多因素。一个名为neon的开源计算和存储解决方案旨在通过更全面的设计来实现这一目标。
🐥例如,可以在 pagestore_smgr.c 中找到接口的实现之一,下面显示了一些更改。smgr
static const struct f_smgr neon_smgr =
{
.smgr_init = neon_init,
.smgr_shutdown = NULL,
.smgr_open = neon_open,
.smgr_close = neon_close,
.smgr_create = neon_create,
.smgr_exists = neon_exists,
.smgr_unlink = neon_unlink,
.smgr_extend = neon_extend,
.smgr_prefetch = neon_prefetch,
.smgr_read = neon_read,
.smgr_write = neon_write,
.smgr_writeback = neon_writeback,
.smgr_nblocks = neon_nblocks,
.smgr_truncate = neon_truncate,
.smgr_immedsync = neon_immedsync,
.smgr_start_unlogged_build = neon_start_unlogged_build,
.smgr_finish_unlogged_build_phase_1 = neon_finish_unlogged_build_phase_1,
.smgr_end_unlogged_build = neon_end_unlogged_build,
};
在重新实现或包装这些 SMGR 接口后,可以将表和索引元组写入本地缓存,并生成相应的 WAL 以供以后重做使用。有关更多详细信息,您可以在“pagestore_smgr.c”中查看源代码。
在这篇博文中,我们讨论了smgr接口,并为那些对「PostgreSQL如何处理元组存储」感兴趣的人提出了一个简单的想法。我们还为那些想要深入了解PostgreSQL存储细节的人提供了一个真实的例子。
🐘点击蓝字 阅读原文