【问题标题】:Safely write part of a file algorithm (atomic part write)安全地写入文件算法的一部分(原子部分写入)
【发布时间】:2019-07-02 01:35:18
【问题描述】:

假设我想写一个简单的数据库(在 linux 上工作),它必须满足以下条件:

它只有两个功能:

  1. write_chunk(索引,字节)
  2. read_chunk(索引)

其中 index 是从 0 到 1M 的整数,而 bytes 是 100 字节的块。 我希望在每次调用 write_chunk 后自动传输文件状态。

所以我想确定:

  1. 100 字节块写入文件中位置索引*100
  2. 所有 100 字节都以原子方式写入(或根本不写入)
  3. 如果在写入时突然断电(之前的有效 100 字节 已恢复)

我想象这样的实现:

编写函数实现:

  1. 在开始写入 100 字节之前,我们从 将 index*100 定位到另一个文件以进行回滚(索引也被复制)。 我们还使用哈希对所有回滚文件数据进行签名。在回滚时执行 fsync。
  2. 然后我们开始在位置索引*100 处写入新的 100 字节,执行 同步。
  3. 如果步骤 2 正常,我们将删除回滚文件中的所有数据。
  4. 我们返回 ok 给函数调用者。

读取函数实现:

  1. 如果我们开始读取和回滚的文件不是空且有效的,我们 从回滚中恢复 100 字节并删除回滚或仅删除 如果哈希无效则回滚。

  2. 我们从位置索引*100读取chunk并返回数据

我使用以下算法安全吗?

所以我想确保我与 mysql 或 postgresql 等数据库处于同一安全级别在提交后执行插入语句。

我可以使用什么技术来保证原子写入和持久写入,我的意思是我可能需要在块上使用一些散列来确保它有效或使用回滚文件的双重副本。或者一次将数据存储在回滚文件中,以确保磁盘子系统刷新。 (我听说即使我在写入后调用 fsync 也不安全,这取决于磁盘子系统,然后它会物理写入数据)。

【问题讨论】:

    标签: mysql database postgresql disk acid


    【解决方案1】:

    只要你没有并发,这应该可以工作,也就是说,只允许这些函数中的一个同时运行。

    你为什么不使用一个简单的嵌入式数据库

    【讨论】:

    • 这更多是为了研究目的,如果我实现类似演员模型的东西,我有数百万演员,演员的状态只能通过一个协程对自己可见,没有共享的数据块。跨度>
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2020-02-18
    • 2012-07-29
    • 1970-01-01
    • 2014-03-22
    • 2017-06-28
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多