PolarDB 针对读写节点缓冲池进行了优化,优化内容是什么?
• 为了读写节点尽快地将产生的脏页刷到磁盘,减少读节点缓存在Parse Buffer中的Redo Log,只读节点会把已经应用的LSN 实时同步给读写节点。如果读写节点写入LSN 的write_lsn 和Safe LSN 差距超过设定的阈值,系统就会加快读写节点的刷脏频率,主动推进oldest_flush_lsn 位点,同时只读节点能释放自己Parse Buffer 中缓存的Redo Log,减少Runtime Apply 时需要应用的Redo Log 信息,提升只读节点的性能。
• 当一个页被频繁更新时,最新修改LSN 不断增大,始终大于Safe LSN,无法满足刷脏条件。最终,只读节点日志堆积在日志缓存里,没有缓冲接收新的日志。为了解决这个问题,系统引入了拷贝页(Copy Page)。当一个数据页由于不满足刷脏条件无法及时落盘时,系统会生成一个数据的拷贝页。该拷贝页的信息是其数据页的一个快照,拷贝页里存放的都是固定下来不再改变数据,原始数据页的最老修改LSN 更新为此拷贝页的最新修改LSN。由于拷贝页的最新修改LSN 不再变动,当该LSN 小于Safe LSN 时,拷贝页的数据便可以落盘,从而推进写节点刷新oldest_flush_lsn,进而释放只读节点的日志缓存。
• 数据库系统有一类数据页会被频繁地访问,如系统表空间以及回滚段表空间的回滚段表头页。为了提高执行效率和性能,当实例启动后,将这些被频繁访问的页读进内存,并不再被换出,即这些页被“钉”在缓冲池中,故被称为“pin pages”。这些页保留在缓冲池中,一方面避免换进换出影响读节点应用日志的效率;另一方面,这些数据页不会被只读节点换出,意味着再次需要这些数据页时它们已经在内存中,不需要重新从磁盘中再次读取,这样写节点在刷脏写出这些数据页时就可以不受“页的最新修改LSN(newest_modification)必须不能大于读节点应用日志的LSN(min_replica_ applied_lsn)”的限制,使数据页在写节点刷脏时更加平滑,避免出现用户线程因为无法获取到空闲页而触发刷脏操作释放空余的页,从而影响用户请求时间的情况。
以上内容摘自《云原生数据库原理与实践》,这本书可以在电子工业出版社天猫店购买。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。