Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

45|Master高可用:怎样借助etcd实现服务选主?

你好,我是郑建勋。
上一节课,我们搭建起了 Master 的基本框架。这一节课,让我们接着实现分布式 Master 的核心功能:选主。

etcd 选主 API

我们在讲解架构设计时提到过,可以开启多个 Master 来实现分布式服务的故障容错。其中,只有一个 Master 能够成为 Leader,只有 Leader 能够完成任务的分配,只有 Leader 能够处理外部访问。当 Leader 崩溃时,其他的 Master 将竞争上岗成为 Leader。
实现分布式的选主并没有想象中那样复杂,在我们的项目中,只需要借助分布式协调服务 etcd 就能实现。etcd clientv3 已经为我们封装了对分布式选主的实现,核心的 API 如下。
// client/v3/concurrency
func NewSession(client *v3.Client, opts ...SessionOption) (*Session, error)
func NewElection(s *Session, pfx string) *Election
func (e *Election) Campaign(ctx context.Context, val string) error
func (e *Election) Leader(ctx context.Context) (*v3.GetResponse, error)
func (e *Election) Observe(ctx context.Context) <-chan v3.GetResponse
func (e *Election) Resign(ctx context.Context) (err error)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

etcd实现分布式选主的方法在分布式系统设计中扮演着重要角色。本文深入介绍了利用etcd的分布式协调服务实现分布式选主的原理和实现细节。通过etcd选主API的核心功能,包括创建带租约的会话、创建选举对象Election以及开启选举等方法,读者可以快速了解分布式选主算法的核心逻辑和实现细节。文章详细解析了Master的选主逻辑和代码实现过程,以及在实际运行中的效果展示。利用etcd实现分布式Master的选主,确保了在同一时刻只能存在一个Leader,并实现了Master的故障容错能力。通过监听最近的Key的DELETE事件,实现了所有节点对同一个Key的抢占,同时避免了集群可能出现的惊群效应。总之,本文为读者提供了深入了解分布式选主算法及其实现细节的有益参考,为实际项目中的分布式系统设计提供了指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 無所畏
    这段话是不是有问题? "waitDeletes 函数会调用 client.Get 获取到当前争抢的 /resources/election/ 路径下具有最大版本号的 Key" 看waitDeletes 源码的注释是: "waitDeletes efficiently waits until all keys matching the prefix and no greater than the create revision."

    作者回复: waitDeletes分为了2步,第一步是获取之前具有最大版本号的 Key,第二步是监听这个最大key的删除事件。 你截取我的文字部分,漏掉了监听这一步。 我想表达的是和注释一样的

    2023-01-30归属地:广东
  • Realm
    请问老师: “当前 Master 需要监听这个最大版本号 Key 的删除事件。当这个特定的 Key 被删除,就意味着已经没有比当前 Master 创建的 Key 更早的 Key 了,因此当前的 Master 理所当然就排队成为了 Leader。” 1 是所有master监听的内容都相同吗? 2 这里如何避免惊群?

    作者回复: 其实每一个Master都是监听的前一个Mater创建的key,所以master监听的内容是不同的,也就没有了惊群了

    2023-01-26归属地:浙江
    3
  • Geek_2c2c44
    选主那里, for loop里面的time.After建议改一下, 每次调用time.After会返回一个channel, 可能有内存泄漏的风险;改成Ticker或者context.WithTimeout来实现
    2024-01-30归属地:浙江
  • Geek_7e6c5e
    太酷了,etcd让普通程序员也有了开发分布式系统的能力
    2023-01-23归属地:陕西
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部