V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liufude66
V2EX  ›  Java

请教一个开发中的问题,关于集群选举的。

  •  
  •   liufude66 · 2021-12-14 17:13:32 +08:00 · 1680 次点击
    这是一个创建于 1078 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的程序有个核心的功能,这个功能只能在众多节点中的一个节点上跑,现在的问题是万一这个节点挂了之后,怎么让其他节点接替这个节点,接着跑这个功能。感觉这个问题可以通过 master 选举来解决,但是以我们现有的开发能力和时间要求来开发一个选举功能不太现实。现在不知道怎么弄。

    8 条回复    2021-12-15 18:23:05 +08:00
    tedzhou1221
        1
    tedzhou1221  
       2021-12-14 17:53:20 +08:00
    那就直接用 zookeeper, 我们之前有个项目也是这样。
    leeraya
        2
    leeraya  
       2021-12-14 19:29:40 +08:00
    上 github 搜相关的开源项目
    zifangsky
        3
    zifangsky  
       2021-12-14 20:50:27 +08:00
    有两种思路可以实现:①直接使用 zk 的选主功能;②定时任务,所有节点同时执行,哪个节点本次获取到分布式锁就真正执行任务。
    joesonw
        4
    joesonw  
       2021-12-14 20:56:47 +08:00
    raft 协议.
    1. 当 slave 丢失 master 连接时, 向其他 slave 发送选举票
    2. 其他 slave 在收到第一个选票后, 向对方发送确认.
    3. 当某一个 slave 收到过半选票, 广播给其他 slave, 自己是 master
    4. 如果超时没收到过半选票, 回到 1, 重新发送.
    veightz
        5
    veightz  
       2021-12-15 02:01:18 +08:00 via iPhone
    curator 的封装就能支持,判断 isLeader
    Akiya
        6
    Akiya  
       2021-12-15 12:59:34 +08:00
    我感觉你的需求不只是做一个集群选举那么简单,选主只能保证一个任务只被执行一次,而且 master 挂掉以后,任务会发到其他节点。但是按照你的描述,任务还得支持中断恢复,这个就得从业务上面入手了,你需要给任务的每一步记录完成日志,新 leader 发现有未完成的任务就从中断的地方继续
    nekoneko
        7
    nekoneko  
       2021-12-15 18:19:31 +08:00
    那就 raft 算法,看看 consul 或者 nacos 的源码,自己实现一下
    nekoneko
        8
    nekoneko  
       2021-12-15 18:23:05 +08:00
    可以试试 JRaft
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4677 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:00 · PVG 18:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.