可⽤性质量属性设计之系统设计hash
您可参考右侧导航栏了解博⽂涉及内容。
⼀、故障,错误,BUG的区别
在了解⼀个系统的可⽤性可以从了解系统故障开始。但是什么是故障,错误,bug?
故障与错误是经常容易被混淆的两个概念,故障、错误、BUG之间是有区别的。
软件代码由于⼈为因素写错了或者考虑不周全,成为了错误。
有错误的软件存在⼀定缺陷,该缺陷在某种情况下可以转化为故障。
fulltest产⽣了故障,⼈们就认为系统出 BUG了。
错误是最原始的驱动⼒,⼀个错误不⼀定导致故障,因此错误不见得被⼈们察觉。但是,⼀旦错误变为故障,⼈们是可以通过软件的外在表现⽽察觉。故障是系统出错后导致系统不正常⼯作的结果,故障从某种意义上来说属于现象。即通过故障这种现象,⼈们可以知道软件存在BUG,最终找到相关错误点,并对错误代码进⾏修复。BUG 是被激发出来的错误,是故障的总称,因此⼀个系统实际存在的错误数⽐BUG 数要多,因为只有被激发出来的错误才能成为BUG。
那么如果要设计⼀个可靠性⾮常⾼的系统,或者系统中的⼀个可⽤性⾮常⾼的模块或者⼦系统该怎么设计呢?围绕以下以下⼏个问题
如何检测故障:系统出现故障时,可以通过系统故障的外在可见性了解到系统出现BUG,也就是检测系统的是否处于故障状态;
故障发⽣会有什么情况:系统故障发⽣后,会对系统产⽣什么样的影响。怎么让故障被系统管理员所知道;
如何应对故障:系统故障后,能够⾃动化地改变策略,故障处理,维持系统的可⽤性。
⼆、故障检测
要提升系统的可⽤性,就要先检验系统是否处于故障状态。
1、ping与echo战术
ping与echo战术是错误检测的常⽤⽅法。这⾥的ping可以对应着window或者linux的ping命令理解,检查⽹络是否连通,可以很好地帮助我们分析和判定⽹络故障。在错误检测中,使⽤ping和echo就是外部模块,向需要的模块发送请求即ping消息,然后被检测的模块返回相应的状态信息echo信息。通过
信息了解到被检测的模块状态。如果被监测⽅在预期的时间内⽆法返回相应的消息,则在进⾏⼏次ping消息发送(能尽量避免因⽹络问题误判的情况),如果仍⽆法返回信息,即可确认为出错。
ping和echo⽰意图
monitor向monitored组件发送ping命令,然后monitored返回echo信息(或⽆法返回,直接认定monitored端所在的系统错误),monitor根据echo信息判断monitored的系统是否正常运⾏。monitor与monitored不仅可以在不同系统,也可以属于同⼀系统的不同模块。
2、Heartbeat战术
在使⽤ping和echo作为错误检测战术的系统中,总是由需要两端即客户端发送ping,服务端发送echo发送消息保障系统错误检测的正常执⾏,那么能否⼀端发送信息呢?那就是⼼跳战术Heartbeats。
Heartbeat的发起者是被检测者⾃⾝,定期发送Heartbeat消息向外界表⽰其本⾝正在处于正常运⾏的状态。由于信息的发送是每隔⼀段时间发送⼀次,类似⼈的⼼跳,所以被称为⼼跳战术。
Heartbeat⽰意图
需要注意的是:Timer的作⽤是记录消息是否超时,所以在每⼀次接受Heartbeat消息之后,都需要⽴即停⽌⼀个定时器的⼯作,同时开启新的计时器。如果Timer超过规定时间,则进⾏诊断。
右侧Monitored向左侧Monitor发送⼼跳信息,如果左端Timer即使测发现消息超时,甚⾄⽆法收到消息则判定Monitored端故障。仅仅使⽤Heartbeat很可能会造成误判,也就是heartbeat因为某种传输原因,没能到达Monitor端,那么Monitor就直接认定被检测的系统是故障的吗?显然不合适,所以使⽤ping和heartbeat 组合。
补充:除了ping和heartbeat常⽤的故障检测还有在多数语⾔中都存在的异常捕获——异常处理机制,异常出错后,会上报信息,那么异常处理程序会根据具体的出错信息对其进⾏相应的处理,⼀般同属于⼀个进程或⼀个线程。
常见如Python:marry you 歌词
try:
语句
except:
出错处理
3、ping与heartbeat组合使⽤
Heartbeat与Ping经常配合使⽤能提升错误检测的效果。在正常情况下,通过Heartbeat 消息监测系统的状态,当 Heartbeat 消息消失后,可利⽤ Ping消息做⼆次确认,若Ping消息也没有得到反馈,此时可判定相关模块出现故障。
HeartBeat与ping的混合使⽤⽰意图
图中增加了相应的 Ping和Echo 的⽀持模块,这此模Heartbeat 消息超时时被调⽤,即当计时器超时,左侧模块将发送 Ping 消息,同时启动新的计时器等待 Echo 的到来。若在超时前接收到了 Echo消息,则说明右侧模块并没有失效,反之则判断右侧模块失效。
eiia
turn the corner流程图:
Heartbeat发送端流程图
Heartbeat接收端流程图(监控端)
由于系统可能是分布式的,或者监控和被监控的系统分属于不同的系统,所以在流程图中,可以看到在消息的发送端,还需要获取相应的IP地址和端⼝号。三、如何处理⽹络对消息的影响
⽆论是ping还是heartbeat战术都⽆法避免⼀个问题:如何确认echo或者heartbeat消息是因为真正的系统故障还是因为⽹络传输过程中失效。即如何避免误判系统故障或者降低误判的⼏率。
如果被检测的系统没有故障,⽽在向监测端发送消息的时候,由于⽹络故障问题,监测端没有接受到信息,那么监测端误认为系统故障,就会采取相应的故障处理策略,这种处理本来是没有必要的,是消耗资源的。
⽹络存在着⼀定的延时或其他问题,并不是所有的 Heartbeat消息都能准时、周期性的到达,实际系统不能简单地以⼀个Heartbeat 消息超时或未到达为依据做出系统失效的判断。因此可以采取两种 Heartbeat 消息的判定⽅法。
1、设置超时时间和最⼤超时次数
第⼀种判定⽅法。设定⼀个超时时间 TIME OUT 与最⼤超时次数 MAX TIME OUT,建议MAX_TIME OUT=3.
永不言弃英文
判定系失效⽅法:
在发送消息之后的3次超时计数过程中,只要接收到回应,就判定系统未失效。
robbie williams如果在发送消息之后的3次超时计数过程中监听组件都没有收到回应,判定系统失效。
没问题英文2、超时消息重传
第⼆种判定⽅法参考TCP 的超时重传机制,让监听组件具有发送ACK消息的功能,ACK 消息带有序号,监听组件发送ACK消息之后,响应组件接收到 ACK 消息后才发回 Heartbeat消息,Heartbeat 消息也带有序号,且应与对应的 ACK 消息的序号相同。另外设定⼀个超时时间TIME OUT和⼀个最⼤⽆响应次数 MAX NO RESPONSE,建议 MAX NO RESPONSE=3.
判定系统未失效⽅法:
连续3次发送ACK消息之后⾄少有1次得到相同序号的 Heartbeat消息响应,判定系统未失效。
判定系统失效⽅法:
连续3 次发送 ACK 消息之后在 TIME OUT 时间内⽆相同序号的 Heartbeat消息响应,判定系统失效。
** 注**:这⾥并不能完全解决系统故障误判的问题,只是利⽤现有⼿段最⼤程度解决这⼀问题。
四、系统设计
解决了⽹络对消息传输的作⽤对系统故障的影响,那么如何使⽤Heartbeat与ping结合设计⼀个主备份的系统呢?更进⼀步即确认故障之后如何处理呢?
下⾯给出主从备份系统的⽰意图
备份复件需要检测主复件的状态信息,所以主复件问备份复件定时发送 Heartbeat 消息⽤于告知备份复件相关状态信息。备份复件在收到每个Heartbeat 消息之后,启动新的计时器,若计时器超时仍未收到下⼀个 Heartbeat 消息,则备份附件进⼈确认阶段。备份复件发送 Ping 消息,并且启动新的计时器,若在新的计时器超时仍未收到明主复件故障,然后备份复件代替主复件接管所有⼯作,所有的客户主复件的 Echo 信息,则付与原来的备件复件进⾏通信,此时需要通知管理⼈员主备切换的消息,便于管理⼈员设置新的备件,以保障未来的正常切换。
因此以上分析知道,在确认被检测系统出错之后,为保证系统的持续可⽤性(这也是本博重点讨论的问题),接下来的处理是找到备份系统接管当前系统或模块的所有⼯作,并⾃动化通知相关管理⼈员做进⼀步操作。
具体实现可以使⽤主动冗余这⼀错误恢复战术。
五、主动冗余
1、原理
主动冗余中所有冗余组件在启动的时候同步,以并⾏的⽅式对时间作出响应,因⽽它们都处在相同的状态。通常,作出响应的第⼀个组件的结果被采⽤,其他响应被丢弃。组件间的同步是通过将传递给
被冗余组件的全部消息发送给所有冗余组件。发⽣错误时,使⽤该战术的系统停机时间通常是⼏毫秒。恢复时间就是组件间的切换时间,因为冗余组件间状态⼀致,各组件接收到的都是最新的消息,并且拥有之前的所有状态。此处的冗余组件⼀般是指模块,但实际还可能包括通信链路。在可⽤性要求⾮常⾼的分布式系统中,如通信核⼼⽹,冗余组件包括通信路径。这⼀极度契合了为⾼可⽤系统设计的要求。
2、代价
mask是什么意思主动冗余是⼀种⾼可靠性的设计,由原理可知,冗余中所有组件都处于并⾏运⾏状态下,所以⼀般应⽤对系统可靠性要求⾮常⾼的情况,且其⼯作代价也⽐较⾼。
从硬件成本上来看,需要双份系统的硬件要求,从软件上看,需要⼀套⾼效的⼼跳监测和倒换机制,以及状态同步的机制。
3、⽰意图
B与B'同时接收C的请求并且进⾏同样的操作,但是,只有B向A发送处理完的结果。相当于B'的处理结果在平常状态下将被丢弃。此时,若B出现故障,则B'将直接接替B的⼯作。由于B'的运⾏状况与B⼏乎⼀致,B'可快速接替B的⼯作。B和B'的这种⼯作模式就是⼀种主动冗余的⽅式。
因此可以看出:主动冗余的优点是切换时间⾮常短,数据和计算都是热备份的。所以⼀旦系统出现错误,就可以⽴刻切换,基本不会影响系统的正常运⾏。但缺点也⼗分明显,所有的冗余模块都处于激活状态,并指向相同的任务,即使在主系统没有故障的情况下仍需要对请求做同样的处理,从⽽保障所有模块的运⾏结果⼀致性。就造成了资源的成倍增加。
4、⽐较
主动冗余,和被动冗余和备份是不同的存在,被动冗余不像主动冗余⼀样⼀直进⾏计算,实现也更简单,因⽽也对系统的可⽤性保证更低。⽽备份则是更为低级别的错误恢复⽅式。
实现容易程度:备份>被动冗余>主动冗余
资源消耗程度:主动冗余>被动冗余>备份
可⽤性保证程度:主动冗余>被动冗余>备份101是什么意思
具体怎么选择策略还需要具体情况具体分析。