设为首页 收藏本站
查看: 956|回复: 0

[经验分享] PostgreSQL的数据存储(三)---数据缓存去和数据存储层的接口

[复制链接]

尚未签到

发表于 2016-11-21 07:15:11 | 显示全部楼层 |阅读模式
2.2  良好的接口层抽象
  通过研究f_smgr数据结构,我们可以清晰分解出如下IO函数需要的操作:
  接口名称
  接口下层函数
  功能
  smgr_init
  mdinit
  初始化一些系统需要的状态等,调用关系如下:
  smgrinit
  BaseInit
  AutoVacLauncherMain
  AutoVacWorkerMain
  AuxiliaryProcessMain
  PostgresMain
  从上面的调用关系可以看出,系启动的过程中,完成初始化的工作
  smgr_create
  mdcreate
  创建一个“relation”(注意PG中,此处的“relation”指的是一个表的数据,而对象的定义,诸如视图、序列等,都是存储对的定义在系统表pg_class中,没有外存可见的文件存在)
  smgrcreate
  fsm_extend
  RelationCreateStorage
  smgr_redo
  ATExecSetTableSpace
  vm_extend
  XLogReadBufferExtended
  从上面的调用关系可以看出,新建、扩展、日志重做等操作会调用到创建relation。
  smgr_read
  mdread
  从指定的“relation”中读出指定块的数据到“数据缓冲区”,物理读操作。
  smgrread
  ReadBuffer_common
  ReadBufferExtended
  ReadBufferWithoutRelcache
  copy_relation_data
  从上面的调用关系可以看出,物理读操作,只与数据缓冲区打交道
  smgr_prefetch
  mdprefetch
  从外存上预先读入数据到数据缓冲区。
  f_smgr.smgr_prefetch
  f_smgr
  smgrprefetch
  PrefetchBuffer
  BitmapHeapNext
  ExecBitmapHeapScan
  ExecProcNode
  LocalPrefetchBuffer
  PrefetchBuffer
  从上面的调用关系可以看出,预取功能是为bitmap扫描做的。除此外,本函数是为异步IO做的,但实际上PG还是采用的同步IO函数实现的本函数,
  smgr_write
  mdwrite
  物理写操作,把数据缓冲区中的信息,刷出到外存
  f_smgr.smgr_write
  f_smgr
  smgrwrite
  FlushBuffer
  FlushRelationBuffers
  LocalBufferAlloc
  _bt_blwritepage
  从上面的调用关系可以看出,物理写操作,都是与数据缓存区层打交道。
  smgr_nblocks
  mdnblocks
  计算一个“relation”所使用的块(8k一个块)的个数
  smgr_extend
  mdextend
  一个“relation”空间不够的时候,自动扩展文件大小
  smgr_truncate
  mdtruncate
  对一个“relation”空间做截断操作
  smgr_immedsync
  mdimmedsync
  刷出一个“relation”的内容到外存
  smgr_pre_ckpt
  mdpreckpt
  做checkpoint之前,预先做一些操作
  smgr_sync
  mdsync
  同步刷出数据到外存。(恢复过程中使用,暂不研究)
  smgr_post_ckpt
  mdpostckpt
  做checkpoint之后,收尾做一些操作(删除一些在事务没有完成前不能删除的文件)
  smgr_exists
  mdexists
  判断外存文件是否存在
  smgr_unlink
  mdunlink
  删除一个外存文件(一个“relation”)
  smgr_close
  mdclose
  关闭一个外存文件(一个“relation”)
  smgr_shutdown
  NULL
  系统关闭时,存储系统是否需要做些收尾工作,如果需要,可以置于此
  以上函数,init可以对应shutdown,open对应close,read对应write,create对应unlink,其他操作,是一些辅助类型的操作,但是必要。如,计算块的个数、文件扩展、截断、文件是否存在等等。注意,理解这些操作,就能理解一个接口层,抽象后,可以支持哪些操作了。
在数据缓冲区改进方式中,我们曾经提出,使用异步IO改进数据库系统的效率,如果我们改造存储层,则可以先从这一层做起,但接口的抽象,基本类似于上述内容。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303102-1-1.html 上篇帖子: PostgreSQL数据库重命名 下篇帖子: PostgreSQL的数据存储(二)---数据缓存去和数据存储层的接口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表