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

准备基于 redis 写个简单的集群 leader 选举,大家帮忙看看方案

  •  
  •   wencan · 2023-01-12 08:56:41 +08:00 · 1533 次点击
    这是一个创建于 700 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我对分布式和 redis 了解有限,所以还清大家帮忙看看。

    服务启动时,每个实例尝试对 key 加锁,加锁成功的成为 leader 。加锁办法为 lua 脚本。有更好的加锁办法,请推荐。 leader 实例退出时,解锁,pub 消息通知其它实例,其它实例开始尝试加锁。 锁有超时时间,每次超时时间过半,leader 给 key 续时。如果 leader 非正常原因挂掉,key 会超时。 其它实例间隔随机时间尝试加锁, 或者收到 leader 退出消息时也尝试加锁,加锁成功的成为 leader 。

    11 条回复    2023-01-13 06:58:23 +08:00
    leonme
        1
    leonme  
       2023-01-12 09:03:33 +08:00 via iPhone
    相比于 raft 协议的优势在哪儿?
    detached
        2
    detached  
       2023-01-12 09:15:30 +08:00
    楼上灵魂拷问了,你的 motivation 在哪里,你的 novelty 在哪里 hhhh
    Cola98
        3
    Cola98  
       2023-01-12 09:50:42 +08:00
    多个实例都尝试做加锁的时候怎么解决?
    morty0
        4
    morty0  
       2023-01-12 09:57:24 +08:00
    网络分区的情况怎么考虑
    sujin190
        5
    sujin190  
       2023-01-12 10:33:08 +08:00 via Android
    @morty0 redis 只能单主的,不存在网络分区问题吧,网络分区后 redis 在哪个区只有哪个区能用,都不在就都不能用
    ql562482472
        6
    ql562482472  
       2023-01-12 10:45:09 +08:00
    @detached 现在越来越觉得这非常重要,做事有逻辑,有出发点,有落地点 怪不得以前进不去大厂 小厂自嗨的看多了 还真的能理解这些了
    rrfeng
        7
    rrfeng  
       2023-01-12 10:48:59 +08:00
    不错,现实中如果已经依赖了 Redis 这是个很简单有效的解决方案。相同方案也可以使用 MySQL ,或者其他任何支持 cap/事务的共享存储上。

    说 raft 的,为了这么个破功能部署一套 etcd ?呵呵。
    djoiwhud
        8
    djoiwhud  
       2023-01-12 11:07:29 +08:00 via Android
    @detached
    不想为了一个 leader 选举需求搞出一堆全家桶。这个理由足够充分了。
    hopingtop
        9
    hopingtop  
       2023-01-12 13:50:33 +08:00
    首先要考虑你场景的一致性容忍度,如果一点就不能容忍,那么你就不应该用 redis 来做。应该选强一致性方案,也就是说的 etcd 或者 zk 。

    redis 是做不了强一致性的,包括 多 client 端连接多 master (n/2)+1 这种方案,还有就是 redis wait 命令,都只能是减少锁失效的概率。

    如果有容忍性,又是选举场景这种并发不大的情况,只需要找一块共享存储原子操作就行。member 去 loop 尝试加锁,leader 去续约就好。

    如果 Leader 后续操作有数据库的话,这样 redis 这个依赖就能不要,减少一个自己不太熟悉的东西,提升稳定性。

    不建议用 Pub 消息去通知。订阅可能存在失效等问题,而且这样实现就深度绑定了一些特性,以后不好做迁移。
    MoYi123
        10
    MoYi123  
       2023-01-12 15:43:19 +08:00
    没必要 pub, leader 加速时间设短点, 其他的设长点就好了.
    wencan
        11
    wencan  
    OP
       2023-01-13 06:58:23 +08:00
    @hopingtop
    @MoYi123
    pub/sub 算是增强,避免 slave 频繁尝试,也避免 leader 下线后没有立即开始新选举。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4392 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:55 · PVG 17:55 · LAX 01:55 · JFK 04:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.