【发布时间】:2019-07-02 01:35:18
【问题描述】:
假设我想写一个简单的数据库(在 linux 上工作),它必须满足以下条件:
它只有两个功能:
- write_chunk(索引,字节)
- read_chunk(索引)
其中 index 是从 0 到 1M 的整数,而 bytes 是 100 字节的块。 我希望在每次调用 write_chunk 后自动传输文件状态。
所以我想确定:
- 100 字节块写入文件中位置索引*100
- 所有 100 字节都以原子方式写入(或根本不写入)
- 如果在写入时突然断电(之前的有效 100 字节 已恢复)
我想象这样的实现:
编写函数实现:
- 在开始写入 100 字节之前,我们从 将 index*100 定位到另一个文件以进行回滚(索引也被复制)。 我们还使用哈希对所有回滚文件数据进行签名。在回滚时执行 fsync。
- 然后我们开始在位置索引*100 处写入新的 100 字节,执行 同步。
- 如果步骤 2 正常,我们将删除回滚文件中的所有数据。
- 我们返回 ok 给函数调用者。
读取函数实现:
如果我们开始读取和回滚的文件不是空且有效的,我们 从回滚中恢复 100 字节并删除回滚或仅删除 如果哈希无效则回滚。
我们从位置索引*100读取chunk并返回数据
我使用以下算法安全吗?
所以我想确保我与 mysql 或 postgresql 等数据库处于同一安全级别在提交后执行插入语句。
我可以使用什么技术来保证原子写入和持久写入,我的意思是我可能需要在块上使用一些散列来确保它有效或使用回滚文件的双重副本。或者一次将数据存储在回滚文件中,以确保磁盘子系统刷新。 (我听说即使我在写入后调用 fsync 也不安全,这取决于磁盘子系统,然后它会物理写入数据)。
【问题讨论】:
标签: mysql database postgresql disk acid