【问题标题】:When is data persisted to disk when using IReliableDictionary2?使用 IReliableDictionary2 时数据何时保存到磁盘?
【发布时间】:2019-03-08 00:22:24
【问题描述】:

我们有一个实现 IReliableDictionary2 的 c# 可靠集合字典,并且由于序列化错误而注意到一些奇怪的东西。

我们的 X 类包含另一个类,Y 类。我们忘记将序列化添加到 Y 类。但是在 X 类被添加到可靠集合字典之后的几天,当我们检索一个实例时,Y 类也在那里十。

显然,可靠的集合字典只是在内存中,但在某些时候集合被持久化到磁盘,此时 Class Y 返回 null,因为它没有使用 [DataMember] 添加到序列化中。

所以问题是什么时候可靠的集合被持久化到磁盘上?对此有程序控制吗?或者这是某种集群设置?

【问题讨论】:

    标签: c# azure-service-fabric


    【解决方案1】:

    当您使用ReliableCollections 时,每个操作(即AddAsync)都会执行以下操作:

    1. 更新ITransaction本地存储(以提供read-your-own-writes semantics
    2. 序列化值并更新本地操作日志(保留)。
    3. 将这些字节发送到所有辅助副本以确保它们具有相同的信息。

    然后,当ITransaction 提交时,commit 条目将附加到日志并发送到所有辅助副本。在quorum 确认提交的那一刻,操作被认为已完成(请参阅here 了解更多信息)。

    所以总的来说,信息一直是序列化的。

    您看到“正确”结果的原因是因为大多数时候您使用的是同一个副本 - 主副本(这样做是因为只有主副本可以修改状态)和所有读取/ 来自同一副本的写入返回 正确 值。

    这里的技巧是 Service Fabric 可以在节点之间移动副本,即假设您的主副本位于 Node1 上。您的所有读取和写入都很好,但随后 Service Fabric 决定将您的主副本移动到 Node2 - 这会导致 Node2 上的新空闲副本通过将序列化数据传输到它来获取 initialized。初始化副本时,Node1 上的副本被降级,Node2 上的副本被提升。现在您的所有请求都是来自Node2 的服务器,而不是来自Node1 的服务器(有关服务和副本生命周期的更多信息,请参阅herehere)。

    【讨论】:

      【解决方案2】:

      问题应该是另一种方式:何时服务结构读取磁盘收集?

      当事务提交时,它会持久化数据(磁盘和内存缓存)。从磁盘读取数据可能有多种原因(例如,主节点已更改/重新启动..)

      【讨论】:

        【解决方案3】:

        主要问题:When is data persisted to disk when using IReliableDictionary2? 在堆栈溢出和文档中已经有很多答案。

        How is data in Reliable Dictionary in Azure Service Fabric persisted to disk

        此答案详细说明了如何更改和复制数据:Downsides of CommitAsync() w/o any changes to collection

        这个回答了它是如何存储在内存中的:Azure Service Fabric reliable collections and memory

        在您的案例中出现问题的原因很清楚:

        1. 您没有正确序列化数据,当数据被复制到其他副本时,它会丢失信息
        2. 正如许多其他问题和帖子中所解释的那样,数据存在于内存中,因此将此数据写入磁盘并将其读取到内存是没有意义的,原始副本与完整数据一起保存在内存中,这与复制了一个。
        3. 如果次要副本变为主要副本,则加载到内存中的数据将丢失信息。
        4. Reliable Dictionary 还有“缓存”功能,可将未使用的“冷”数据刷新到磁盘以释放内存,这是他们为更好地利用内存所做的改进之一,只要您的数据长时间未使用' 时间,他们从内存中删除字典值,而不是键,以释放空间,当您再次访问数据时,它将从磁盘加载。

        【讨论】:

          猜你喜欢
          • 2017-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 2018-02-26
          相关资源
          最近更新 更多