【问题标题】:Concurrent read and writers through cloned data structures?通过克隆数据结构进行并发读写?
【发布时间】:2016-10-16 11:03:44
【问题描述】:

我阅读了this 的问题,但它并没有真正帮助。

首先也是最重要的事情:时间性能是我正在开发的应用程序的重点

我们有一个客户端/服务器模型(如果我们愿意,甚至可以是分布式或云)和一个托管在服务器上的数据结构 D。每个客户端请求包括:

  1. D读到一些东西
  2. 最终D上写点东西
  3. 最终删除D上的某些内容

我们可以说,在这个应用程序中,接收到的操作数之间的关系可以描述为delete<<write<<read。另外:

  1. 读取操作不能绝对等待:它们必须立即处理
  2. 写入和删除可以等待一段时间,但越快越好。

根据上面的描述,任何锁机制都是不可接受的:这意味着读取操作可以等待,这是可以接受的(对不起,如果我强调这么多,但这真的很关键点)。

一致性不是必需的:如果执行了写入/删除操作,然后读取操作看不到写入/删除效果,这没什么大不了的。这会更好,但不是必需的。

解决方案应该是数据结构独立的,所以无论我们写在矢量、列表、地图还是唐纳德特朗普的脸上都无关紧要。

数据结构可能会占用大量内存。

到目前为止我的解决方案:

我们使用两台服务器:第一台服务器(称为f)具有Df,第二台服务器(称为s)已更新Ds

f 使用Df 回答客户端请求,并将写入/删除操作发送到s。然后s 依次应用写/删除操作Ds

在某个时刻,所有未来的客户端请求都会重定向到s。同时,fs 更新为Ds 到其Df

现在,fs 角色互换:s 将使用 Ds 回答客户请求,f 将保持 Ds 的更新版本。交换过程会定期重复。

请注意,为了简单起见,我故意省略了很多细节(例如,一旦交换完成,f 必须在应用从s 收到的写入/删除操作之前完成所有待处理的客户端请求与此同时)。

为什么我们需要两台服务器?因为数据结构可能太大而无法放入一个内存中。

现在,我的问题是:文学中有一些类似的方法吗?我在 10 分钟内想出了这个协议,我觉得奇怪的是没有(更好的)与这个类似的解决方案已经被提出!

PS:我可能忘记了一些应用程序规范,请随时要求澄清!

【问题讨论】:

    标签: multithreading concurrency locking distributed lock-free


    【解决方案1】:

    您的方案有效。我看不出它有什么特别的问题。这基本上就像许多数据库运行其 HA 解决方案一样。他们将写入日志应用到副本。该模型在如何形成、访问和维护副本方面提供了很大的灵活性。故障转移也很容易。

    另一种技术是使用持久数据结构。每次写入都会为您返回一个新的独立版本的数据。所有版本都可以以稳定且无锁的方式读取。版本可以随意保留或丢弃。版本尽可能多地共享底层状态。

    通常,树是此类持久性数据结构的基础,因为很容易更新树的一小部分并重用大部分旧树。

    您可能没有找到更复杂的方法的一个原因是您的问题非常普遍:您希望它完全适用于任何数据结构并且数据可能很大。

    SQL Server Hekaton 使用非常复杂的数据结构来实现任何数据库内容的无锁、可读、时间点快照。也许值得看看他们是如何做到的(他们发布了一篇描述系统每个细节的论文)。它们还允许 ACID 事务、可串行化和并发写入。全部无锁。

    同时,f 将 s 更新后的 Ds 复制到它的 Df 中。

    这个副本需要很长时间,因为数据很大。它会阻止读者。更好的方法是在接受新的写入之前将写入日志应用到可写副本。这样就可以连续接受读取。

    切换也是一个很短的时间段,读取的延迟可能比正常情况稍高。

    【讨论】:

    • 首先,感谢您的回答 :) 关于复制问题,您是对的,但我已经想到了不同的解决方案:f 在磁盘上复制Ds 之前 i> 交换。一旦交换发生,f 从磁盘Ds 加载到Df。在此过程未完成之前f 无法执行任何写入/删除操作,但这不是问题:复制过程完成后,这些操作会被缓冲并按顺序应用。
    • 是的,暂停写入会留下一个最近且可读的副本。那行得通。
    • 我想知道你愿意暂停写多久。如果数据太大以至于您需要两台服务器,您将不得不通过慢速网络复制大量数据。 100GB 在 100MB/s 是 20 分钟暂停。听起来很灾难。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2012-03-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多