在内存引擎中,有大量数据保存在内存中,因此,WAL(预写日志文件)不再适合保存内存中所有的数据。为了能够让WAL与内存引擎适配,所以使用WAL管理模块负责预写日志文件管理工作。
如下图,一个 Writer 对象封装一个 WriteBatch 以及其对应的一些配置信息,如分配到的 SeqNumber、线程状态信息、是否写 WAL 日志、是否写入 Memtable 等。Writer 对象之间组成一个双向链表,新插入 WriteBatch 将封装为 Writer 结构插入到链表末尾,等待编入 WriteGroup 进行处理。
WriteGroup 由一组相邻的 Writer 构成,分为一个 Leader 和多个 Follower 。在一个 WriteGroup 里面,重要部分(WAL 日志写)甚至是所有的写操作(包括 WAL 日志写和Memtable 写)都由 Leader 完成。Leader 可以是第一个插入到空链表的 Writer,也可以是上一个 WriteGroup 执行结束以后获取到的链表头部的 Writer。Leader 将负责协调 WriteGroup 内写操作的有序执行,适时地唤醒 Follower,并在 WriteGroup 执行结束唤醒新的Leader 执行新一轮的 WriteGroup 写。
在默认情况下:
将多条数据合并至一次WAL的写入,以减少写入磁盘的次数,可以极大提高数据库写入的性能。在内存引擎中,保留了组提交的写入方式。
在内存引擎中,多条数据合并为一条数据,由Leader线程负责写入WAL。之后,唤醒组内的Follower线程,多线程并发写入Memtable。待所有线程写入完Memtable后,公布Last Sequence,完成本次组的写入过程,并唤醒下一个Leader。我们不但简化数据的写入流程,而且保存了高效的组提交方式。
(1)WAL管理模块与落盘模块的目的都是数据库快速恢复。
(2)删除wal文件的时机
WAL文件删除的时机是落盘模块中,落盘队列中所有落盘节点全部落盘后的时间点为依据的。
(3)数据库的恢复
WAL管理模块的数据是内存块中的最新数据,在数据恢复过程中,首先恢复WAL文件的数据,根据WAL文件中的数据,优先恢复对应落盘节点的数据。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。