V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
tktk
V2EX  ›  Go 编程语言

基于 Gossip,新节点加入集群如何同步集群中现有数据和同步过程收到的新数据更新?

  •  
  •   tktk · 2020-05-16 11:31:57 +08:00 · 2850 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 项目简介: 一个分布式的 mqtt 的服务

    • 场景描述: 基于 Gossip,使用的 memberlist 库,新节点加入集群,需要同步集群中已连接的客户端信息和订阅信息,同时新节点可能还会收到集群中其他节点的广播数据更新。

    • 问题:

      1. 新节点如何保证数据的一致性,当其他节点已经存储了百万的客户端信息。新节点同步时如何处理?
      2. 同步现有数据时,收到的更新通知如何处理。
    • 我的思路: 新节点加入后,将收到的更新数据暂时缓存直到和其他节点同步完成再开始处理更新。同步信息过大只能分批次同步。但是 gossip 协议中的推拉模式下。一定时间推拉一次,如果数据量非常大的时候网络开销太大。不说百万,即使几万的客户端信息,一次推拉也是很大的开销。如果分批次处理代码就会变复杂。所以想和大家讨论一下如何解决。

    5 条回复    2021-12-01 18:25:56 +08:00
    joesonw
        1
    joesonw  
       2020-05-16 14:34:45 +08:00
    你这个需求上 raft 呀, gossip 适合 eventually consistent.
    tktk
        2
    tktk  
    OP
       2020-05-16 15:25:27 +08:00
    @joesonw raft 的强一致性,但是新的节点进入还是必须同步之前已经存在的数据吧 ? 我选 gossip 的原因是我更看重可用性和分区性。我刚才想了一下决定不同步订阅和客户端信息了。像 redis 集群一样直接广播收到的消息,让各个节点自行检查自己是否要要处理。
    Sunmxt
        3
    Sunmxt  
       2020-05-17 02:01:35 +08:00
    个人感觉解法是,将状态放到专门的地方( redis 等等),或自己设计一个增量同步的协议,自己保证最终一致性,后者感觉会比较多坑。memberlist 基于那篇 SWIM 的论文,其 boardcast 是用于少量事件的同步的,最初应该就不是设计用来广播大量数据的。
    cqcsdzmt
        4
    cqcsdzmt  
       2021-12-01 11:34:18 +08:00
    哥们最终是怎么实现的呢?可以分享一下吗
    tktk
        5
    tktk  
    OP
       2021-12-01 18:25:56 +08:00
    @cqcsdzmt 直接用的别人的 raft 库,只要自己实现状态机就好了。https://github.com/lni/dragonboat
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4783 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:37 · PVG 13:37 · LAX 22:37 · JFK 01:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.