13 | 实战:单机如何实现管理百万主机的心跳服务?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文以一个可管理百万主机集群的心跳服务为例,探讨了高性能服务的设计思路。首先解释了心跳服务的概念,即集群中的主机宕机时,管理服务需及时发现并做相应处理。针对这一问题,文章提出了解决方案,包括设计更快的宕机判断算法和高效的并发服务架构。在设计更快的宕机判断算法方面,文章介绍了引入先入先出队列存放心跳包的时序关系,并使用哈希表存放主机信息,从而将宕机和新主机发现的流程优化到常量级的时间复杂度。文章还详细介绍了如何设计高性能的心跳服务,包括多线程架构、心跳包网络协议的选择以及优化方案。总的来说,本文通过实例详细介绍了如何设计高性能的心跳服务,为读者提供了深入掌握底层基础知识、系统化全局思维解决问题的思路。
《系统性能调优必知必会》,新⼈⾸单¥59
全部留言(32)
- 最新
- 精选
- J.Smile看到现在。每篇文章都得看两遍以上,才有感觉,相比于这些底层知识,特别感慨和好奇老师是怎么把这些抽象的东西搞得这么具体清楚!敬佩啊!
作者回复: 这些知识都可以互相串起来,你可以从我的目录安排上找到串联方式^_^
2020-07-015 - 凉人。如果主机处理得速度不同,我想会不会心跳时间会有区别。这样用时间轮会不会好点。
作者回复: 你好凉人,如果是一个企业内部云上的主机,都会有NTP等服务来同步时间的,此时这套算法总体的计算成本最低。如果时间确实无法同步,需要应用代码来处理,那么时间轮也是一个不错的算法。
2020-05-284 - 有铭寻找宕机服务时,只要看队列首部最老的心跳包,距现在是否超过 5 秒,如果超过 5 秒就认定宕机 ========== 这里的逻辑无法理解:如果要用这种方式检测心跳,那么肯定要不停的把队列首部的心跳包移除,让新的心跳包从尾部加入,那么如果这个加入的过程卡一点。岂不是就会误判??
作者回复: 你好有铭,这种设计下,还必须限制每次移除心跳包的数量(分多次执行),以防止加入过程长时间得不到执行。 而且,在这种极限场景下,必须监控CPU的使用率,如果长期维持在高占用率(可能你的集群规模已经超大,要每秒处理数百万心跳包),那么应当通过扩容更多的CPU核、分布式系统等其他方案来解决,这已经不是单台机器能解决的了。
2020-05-2753 - 那时刻老师在文中提到的超过五秒没有收到心跳消息就会把这台主机从状态列表里删除了。可能有这种情况,比如主机A因为网络抖动超过五秒发来心跳消息,尽管它是alive状态,但是我们会误认为它下线了。为了应对这种情况,我们之前会采取一段时间内收到消息的百分数来计算,比如每秒一个心跳消息,在20秒内应该收到20个心跳消息,比如收到10个,比例是50%。以这个比例作为是否下线的阈值。请问老师,不知是否还有更好办法?
作者回复: 你好那时刻,生产环境中必须容忍网络的抖动,因此容忍一定比例的丢包,是正常的,你的这个方法是可以的,当然,如果有些主机频繁的出现网络不稳定的话,也可以考虑用更平滑的函数来判断宕机
2020-05-2723 - 李新龙每当收到心跳包时,如果对应主机的上一个心跳包还在队列中,那么可以直接把它从队列中删除。没讲清楚,怎么找到上一个?
作者回复: 通过IP等构成的Key,到哈希表中找到Value,其中包括指向队列中的引用,就可以操作队列了
2020-09-2742 - wwj感觉时间轮算法比这个更有效一些 比hash节省空间
作者回复: 时间轮也需要1个字典,字典即使不用hash实现,也是必不可少的,因为1个主机发出的多个心跳需要进行数据同步
2020-08-142 - 万历十五年请教老师,对于做负载均衡的多个分发线程,如何做到及时并且互斥的分发包?
作者回复: 1、1个包只分发到1个线程的队列中,分发完毕后就结束,这不就是互斥了吗? 2、只要消费者的速度是大于生产者的,就是及时的。监控线程队列,如果发现生产速度过快,需要进行线程扩容或者服务器扩容。
2020-08-301 - Ken烧脑,还在消化,容我二刷回来评论😂
作者回复: ^_^
2020-05-271 - 秋天心跳包哪一块的设计,用队列存储心跳的信息,hash表主要存储的是什么信息?以及他的作用是什么 没看太懂,请您指导
作者回复: hash表是用来在报文到达、判断是否过期这两个过程中,加速检索速度的。它的Key就是主机,Value指向队列中的报文。
2020-08-14 - 坤哥无锁编程,除非一个线程一个工作队列,否则单个队列实现不了
作者回复: 是的
2020-07-07