假设我要写一个简单的数据库(在linux上工作),必须满足以下条件:
它只有两个功能:
- write_chunk(索引,字节)
- read_chunk(索引)
其中索引是从0到1M的整数,字节是100字节的 block 。 我希望在每次调用 write_chunk 之后自动传输文件状态。
所以我想确定:
- 100 字节 block 写入文件中的位置索引*100
- 所有 100 个字节均以原子方式写入(或根本不写入)
- 如果写入时突然断电(之前有效的100字节 已恢复)
我想象这样的实现:
编写函数实现:
- 在开始写入 100 个字节之前,我们复制前 100 个字节 将索引*100定位到另一个文件以进行回滚(索引也被复制)。 我们还使用哈希对所有回滚文件数据进行签名。在回滚时执行 fsync。
- 然后我们开始在位置index*100处写入新的100个字节,执行 fsync。
- 如果第 2 步正常,我们将删除回滚文件中的所有数据。
- 我们将 ok 返回给函数调用者。
读取函数实现:
如果我们开始读取并回滚文件不为空且有效,我们 从回滚恢复 100 字节并删除回滚或直接删除 如果哈希无效则回滚。
我们从位置索引*100读取 block 并返回数据
使用以下算法安全吗?
所以我想确定我与 MySQL 或 PostgreSQL 等数据库处于相同的安全级别在提交后执行插入语句。
我可以使用哪些技术来保证原子和持久写入?我的意思是我可能还需要对 block 使用一些哈希来确保它有效或使用回滚文件的双重副本。或者一次一点地将数据存储在回滚文件中,以确保磁盘子系统刷新。 (我听说即使我在写入后调用 fsync 也不安全,这取决于磁盘子系统,然后它会物理写入数据)。
最佳答案
只要没有并发性,即只允许同时运行这些函数之一,这应该就可以工作。
为什么不使用简单的嵌入式数据库?
关于mysql - 安全写入部分文件算法(原子部分写入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581747/