系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

13 | 实战:单机如何实现管理百万主机的心跳服务?

KeepAlive机制
TCP协议优化
UDP vs. TCP
内存使用效率
CPU亲和性问题
多线程同步
负载均衡
多线程开发模式
CPU计算能力
使用哈希表存放主机信息
引入先入先出队列
时间复杂度分析
性能问题解决
集群规模的影响
思考题
总结
心跳包网络协议选择
高并发架构设计
快速的宕机判断算法
核心问题
什么是心跳服务
实战:单机如何实现管理百万主机的心跳服务?

该思维导图由 AI 生成,仅供参考

你好,我是陶辉。
这一讲我们将结合前 12 讲,以一个可管理百万主机集群的心跳服务作为实战案例,看看所有高性能服务的设计思路。
首先解释下什么是心跳服务。集群中的主机如果宕机,那么管理服务必须及时发现,并做相应的容灾处理,比如将宕机主机的业务迁移到新的虚拟机上等等。怎么做到及时发现呢?可以要求每台主机定时上报心跳包,考虑到网络报文的延迟,如果管理服务在几个上报周期内未收到心跳,则认为主机宕机。当新主机加入集群后,心跳服务也可以及时识别并告知管理服务。
这就是心跳服务要解决的核心问题,虽然很简单,可是如果集群规模达到百万台虚拟机或者微服务进程,这就不再简单了。多核 CPU、内存使用效率、网络带宽时延积等都必须纳入你的考虑,因为此时心跳包占用的网络带宽已经接近网卡上限,仅调动一颗 CPU 的计算力去处理就会大量丢包,百万级的对象、网络连接也很容易造成内存 OOM。甚至判断宕机的算法都要重新设计,降低时间复杂度后才能够应对超大集群的心跳管理。
解决这种集群规模下的性能问题,需要深入掌握底层基础知识,用系统化的全局思维去解决问题,这也是程序员薪资差异的重要分水岭。接下来,我们先实现更高效的核心算法,再设计高并发服务的架构,最后再来看传输层协议的选择。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以一个可管理百万主机集群的心跳服务为例,探讨了高性能服务的设计思路。首先解释了心跳服务的概念,即集群中的主机宕机时,管理服务需及时发现并做相应处理。针对这一问题,文章提出了解决方案,包括设计更快的宕机判断算法和高效的并发服务架构。在设计更快的宕机判断算法方面,文章介绍了引入先入先出队列存放心跳包的时序关系,并使用哈希表存放主机信息,从而将宕机和新主机发现的流程优化到常量级的时间复杂度。文章还详细介绍了如何设计高性能的心跳服务,包括多线程架构、心跳包网络协议的选择以及优化方案。总的来说,本文通过实例详细介绍了如何设计高性能的心跳服务,为读者提供了深入掌握底层基础知识、系统化全局思维解决问题的思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • J.Smile
    看到现在。每篇文章都得看两遍以上,才有感觉,相比于这些底层知识,特别感慨和好奇老师是怎么把这些抽象的东西搞得这么具体清楚!敬佩啊!

    作者回复: 这些知识都可以互相串起来,你可以从我的目录安排上找到串联方式^_^

    2020-07-01
    5
  • 凉人。
    如果主机处理得速度不同,我想会不会心跳时间会有区别。这样用时间轮会不会好点。

    作者回复: 你好凉人,如果是一个企业内部云上的主机,都会有NTP等服务来同步时间的,此时这套算法总体的计算成本最低。如果时间确实无法同步,需要应用代码来处理,那么时间轮也是一个不错的算法。

    2020-05-28
    4
  • 有铭
    寻找宕机服务时,只要看队列首部最老的心跳包,距现在是否超过 5 秒,如果超过 5 秒就认定宕机 ========== 这里的逻辑无法理解:如果要用这种方式检测心跳,那么肯定要不停的把队列首部的心跳包移除,让新的心跳包从尾部加入,那么如果这个加入的过程卡一点。岂不是就会误判??

    作者回复: 你好有铭,这种设计下,还必须限制每次移除心跳包的数量(分多次执行),以防止加入过程长时间得不到执行。 而且,在这种极限场景下,必须监控CPU的使用率,如果长期维持在高占用率(可能你的集群规模已经超大,要每秒处理数百万心跳包),那么应当通过扩容更多的CPU核、分布式系统等其他方案来解决,这已经不是单台机器能解决的了。

    2020-05-27
    5
    3
  • 那时刻
    老师在文中提到的超过五秒没有收到心跳消息就会把这台主机从状态列表里删除了。可能有这种情况,比如主机A因为网络抖动超过五秒发来心跳消息,尽管它是alive状态,但是我们会误认为它下线了。为了应对这种情况,我们之前会采取一段时间内收到消息的百分数来计算,比如每秒一个心跳消息,在20秒内应该收到20个心跳消息,比如收到10个,比例是50%。以这个比例作为是否下线的阈值。请问老师,不知是否还有更好办法?

    作者回复: 你好那时刻,生产环境中必须容忍网络的抖动,因此容忍一定比例的丢包,是正常的,你的这个方法是可以的,当然,如果有些主机频繁的出现网络不稳定的话,也可以考虑用更平滑的函数来判断宕机

    2020-05-27
    2
    3
  • 李新龙
    每当收到心跳包时,如果对应主机的上一个心跳包还在队列中,那么可以直接把它从队列中删除。没讲清楚,怎么找到上一个?

    作者回复: 通过IP等构成的Key,到哈希表中找到Value,其中包括指向队列中的引用,就可以操作队列了

    2020-09-27
    4
    2
  • wwj
    感觉时间轮算法比这个更有效一些 比hash节省空间

    作者回复: 时间轮也需要1个字典,字典即使不用hash实现,也是必不可少的,因为1个主机发出的多个心跳需要进行数据同步

    2020-08-14
    2
  • 万历十五年
    请教老师,对于做负载均衡的多个分发线程,如何做到及时并且互斥的分发包?

    作者回复: 1、1个包只分发到1个线程的队列中,分发完毕后就结束,这不就是互斥了吗? 2、只要消费者的速度是大于生产者的,就是及时的。监控线程队列,如果发现生产速度过快,需要进行线程扩容或者服务器扩容。

    2020-08-30
    1
  • Ken
    烧脑,还在消化,容我二刷回来评论😂

    作者回复: ^_^

    2020-05-27
    1
  • 秋天
    心跳包哪一块的设计,用队列存储心跳的信息,hash表主要存储的是什么信息?以及他的作用是什么 没看太懂,请您指导

    作者回复: hash表是用来在报文到达、判断是否过期这两个过程中,加速检索速度的。它的Key就是主机,Value指向队列中的报文。

    2020-08-14
  • 坤哥
    无锁编程,除非一个线程一个工作队列,否则单个队列实现不了

    作者回复: 是的

    2020-07-07
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部