【分布式系统工程实现】如何检测一台机器是否宕机?

检测一台机器是否宕机的应用场景如下:

1, 工作机器宕机,总控节点需要能够检测到并且将原有服务迁移到集群中的其它节点。

2, 总控节点宕机,总控节点的备份节点(一般称为Slave)需要能够检测到并替换成主节点继续对外服务。

检测一台机器是否宕机必须是可靠的。在大规模集群中,机器可能出现各种异常,比如停电,磁盘故障,过于繁忙导致假死等。对于机器假死,如果总控节点认为机器宕机并将服务迁移到其它节点,假死的机器又认为自己还可以提供服务,则会出现多个节点服务同一份数据而导致数据不一致的情况。

首先必须明确,理论上检测另外一台机器是否宕机是无法做到的,有兴趣的同学可以参考Fischer的论文。可以简单理解如下:A机器往B机器发送心跳包,如果B机器不发送响应,A无法确定B机器是宕机了还是过于繁忙,由于A和B两台机器的时钟可能不同步,B机器也无法确定多久没有收到A机器的心跳包可以认为必须停止服务。因此,A机器没有办法确定B机器已经宕机或者采取措施强制B机器停止服务。

当然,工程实践中,由于机器之间会进行时钟同步,我们总是假设A和B两台机器的本地时钟相差不大,比如相差不超过0.5秒。这样,我们可以通过Lease机制进行宕机检测。Lease机制就是带有超时时间的一种授权。假设总控节点需要检测工作节点是否宕机,总控节点可以给工作节点发放Lease授权,工作节点持有有效期内的Lease才允许提供服务,否则主动下线停止服务。工作节点的Lease快要到期的时候向总控节点重新申请Lease(一般称为renewLease),总控节点定时检测所有工作机的Lease授权是否合法,如果发现某台工作机Lease失效,可以将工作机上的服务迁移到集群中的其它机器,这时因为工作机发现自己Lease失效会主动停止服务。当然,这里需要注意,由于总控节点和工作机的时钟可能不一致且有网络延迟,总控节点上的Lease超时时间要长,也就是说,如果工作节点的Lease超时时间是12秒,总控节点可能需要13秒后才能确认工作节点已经停止了服务,从而避免数据不一致问题。

同构节点之间的选主也有一个宕机检测问题。比如总控节点宕机,备份节点需要能够检测并升级为主节点继续对外服务。Mysql数据库经常采用Heartbeat + DRBD (Distributed Replicated Block Device) + Mysql的高可用性方案,据说能够达到3个9的高可用性,主节点和备节点维持Heartbeat心跳,当提供服务的主节点出现故障时,备节点的Heartbeat检测到主节点没有心跳(例如,Ping不通主节点),备节点自动接管虚拟IP,升级为主节点提供Mysql读写服务。由于Heartbeat检测机器主节点宕机不可靠,这个方案存在众所周知的脑裂问题,即集群中可能同时存在多个主节点同时提供服务。解决这个问题本质上还是需要引入仲裁节点,比如Heartbeat + DRBD方案中引入Fence节点使出现问题的节点从集群中脱离,或者引入分布式锁服务,比如Chubby的开源实现Zookeeper服务。分布式锁服务实现主节点选举大致如下:主节点和备节点到Chubby中抢锁,抢到锁的节点在锁的有效期(Lease期)内提供服务,当主节点锁的Lease快要到期时,主节点申请延长锁的超时时间,正常情况下分布式锁服务总是优先满足主节点的请求,当主节点出现故障时,备节点能够抢到锁切换为主节点提供服务。

最后还有一个问题,假设总控节点通过Lease机制检测工作节点是否宕机,这种方案是可靠的,不过当总控节点宕机时,如果不采取任何措施,集群中的所有工作节点都将因为无法重新申请Lease而停止服务,这就是带有总控节点的设计固有的脆弱性,某个设计或者编码的错误都有可能造成严重的影响。解决这个问题一般会有一个叫做Grace Period的机制,工作节点Lease超时时将停止服务,但是工作节点并不一开始就重启或者下线,而是处于一种危险状态(称为Jeopardy),这种状态持续一个Grace Period,比如45秒。如果在Grace Period 内总控节点重启,工作节点和总控节点重新联系上从而可以切换为正常状态继续提供服务。

如果需要较好地理解宕机及选举相关的问题,可以阅读并思考Paxos相关的论文,比如Paxos made simple, The Part-time Parliament, Paxos made live, Paxos made practical, Chubby等。有任何问题,欢迎讨论。

时间: 2024-09-21 21:21:53

【分布式系统工程实现】如何检测一台机器是否宕机?的相关文章

Peter Thiel的创意机器已经宕机

Peter Thiel前阵子吐槽说,我们的创意机器已经宕机了: "介乎困境和死之间...我们原本想要在天上飞的汽车,结果换来了140个字(指Twitter)." 然后我想说,他说的还真不是一点道理都没有.我们现在依然在依靠过时的知识产权体系来驱动.激励那些创新的构想和创业公司.可问题是,很多聪明而有天赋的创业者往往会不抵"收购"的诱惑,将自己的时间和精力投资于解决一些"低影响力的问题":另一方面,传统的风险投资则在规避那些乍看异常.但往往能带来革

创意机器已经宕机了

Peter Thiel前阵子吐槽说,我们的创意机器已经宕机了: "介乎困境和死之间...我们原本想要在天上飞的汽车,结果换来了140个字(指Twitter)." 然后我想说,他说的还真不是一点道理都没有.我们现在依然在依靠过时的知识产权体系来驱动.激励那些创新的构想和创业公司.可问题是,很多聪明而有天赋的创业者往往会不抵"收购"的诱惑,将自己的时间和精力投资于解决一些"低影响力的问题":另一方面,传统的风险投资则在规避那些乍看异常.但往往能带来革

tomcat服务器-服务器宕机后怎么使另外一台服务器马上接上

问题描述 服务器宕机后怎么使另外一台服务器马上接上 RT tomcat服务器 假如一台服务器物理宕机后,怎么使得另外一台服务器马上接上,并保证数据完整 解决方案 参考: http://network.51cto.com/art/201005/198401_all.htm 解决方案二: 这种情况就需要主备部署,两个服务器同时启动,其中一个宕机之后立即切换到另外一个,至于如何检测状态的改变需要借助第三方软件实现. 解决方案三: 使用load blance的方式.有专门软件.LVS等

activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如单台机器的性能,为什么会下降呢

问题描述 activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如单台机器的性能,为什么会下降呢 最近在linux下测试ActiveMQ5.11 ,使用两台电脑进行分布式布控,测试处理消息性能时,发现对消息的处理速度远不如一台机器工作处理速度,搭建分布式集群后哪里会影响其速度吗? 解决方案 先做性能瓶颈分析,比如网络I/O. CPU, 内存等都有可能是瓶颈.需要先找到瓶颈的地方

activemq 集群-activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如一台机器的性能

问题描述 activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如一台机器的性能 最近在linux下测试ActiveMQ5.11 ,使用两台电脑进行分布式布控,测试处理消息性能时,发现对消息的处理速度远不如一台机器工作处理速度,搭建分布式集群后哪里会影响其速度吗? 解决方案 有谁使用过的?教教怎么配置会提高些消息处理速度 解决方案二: MySQL Master Slave 数据同步,集群mysql master slave projectActiveMq master/sl

一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop                     NameNode.DFSZKFailoverController(zkfc)slaver1    192.168.199.131    jdk.hadoop                       NameNode.DFSZKFailoverController(

【分布式系统工程实现】系统可扩展性演化

一般来说,只要多台机器通过互相协调共同执行某项任务,我们都会将这套系统称为"分布式系统",这样显得更有技术含量.从这个意义上讲,Memcache集群,Mysql sharding集群,Yahoo PNUTS,Google GFS&Bigtable,Amazon Dynamo以及国内众多专用的NOSQL系统都是分布式系统.分布式系统的难点主要在于可扩展性,随着机器数量的增多,集群能力是否能够接近线性扩展,因集群规模扩大而产生的容错需求,负载的动态迁移,对系统的设计和实现是一个巨大

一台机器同时部署运行多个Tomcat

#######################一台机器同时部署运行多个Tomcat ############################### 注:下文介绍为两个tpmcat,前提jdk已经安装完成! 环境:apache-tomcat-8.0.24.tar.gz             CentOS release 6.5 (Final) 1:使用免安装的tomcat安装包(解压即可使用),官方下载:http://tomcat.apache.org/ 2:直接解压tomcat安装包就可以使用

怎么让安装程序在一台机器上装过就不能装

问题描述 怎么让安装程序在一台机器上装过就不能装 解决方案 解决方案二:1.安装后.在注册表,或者其他地方保存一个值2.开始安装之前检测判断.解决方案三:如果你的程序对这个要求比较高的话,注册表不是一个很优秀的方式,是否可以试试根据mac地址?其实这个也不是绝对安全,如果他换了网卡或者是双网卡就比较悲剧了,是不是可以自己搞一个文件放在他机器上,不允许删除的,里面内容加密的,然后每次安装之前读取这个文件.但是注册表实现起来比较简单.解决方案四:1.安装后,在本地机器放一个可以判断的值2.然后,可以