系统模型
什么是分布式系统
分布式系统特性
进程需要与另一个进程沟通,并且通信时间是变化的
进程之间的关系
1.客户-服务器
一台服务器也可以是其他服务器的客户
2.对等体系结构(peer to peer)
所有参与的进程运行相同的程序并且相互之间提供相同的接口集合
通信范型(分布式中实体如何通信)
1.进程间通信
使用套接字编程
2.远程调用
分布式系统中最常见
3.请求-应答协议
确认了发送方和接收方
通信通道
延迟(latency):m从p段开始发送到q段接受m的时间
带宽(bandwidth):单位时间内通道内能传输的最多的信息量
传送信息的总时间由延迟和带宽决定。
这两个都是随时间变化会变化的。
不同的进程有不同的时钟
在每个电脑内部有内部时钟。
时钟都与标准时间有偏差。
两种方式建模
1.同步分布式系统
(1)知道进程每一步中的时间段(upper bound and lower bound)
(2)知道信息发送延迟的界限
(3)知道时钟偏移的界限(bound)
同步系统不会出现drop packet的问题
2.异步分布式系统
同步与异步(Synchronous and Asynchronous)
1.实际世界中都是异步系统
2.可以建立一个同步系统
进程与通信通道都可能会发生故障
遗漏故障(Omission)
1.定义
进程或通信通道不能完成它应该做的动作
(1)进程遗漏故障主要为崩溃(crash),就说明进程停止了。
(2)如果其他进程能够检测到进程崩溃,称为 故障-停止 Fail-stop
(3)通信遗漏(Communication Omission)
2.两种检测崩溃的方式
(1)
每Ts,p ping q一次,如果在一个Timeout的时间内还没收到ack,就说明q崩溃了。
(2)
q 每T s发送一次心跳给p。如果p在T+timeout时间之内,没有收到第二次心跳,那么q崩溃。
为什么是最大延迟减去最小的,因为考虑到两次心跳的时间差 time gap。上一次最短时间收到了,这一次为最大时间。
故障检测的正确性
1.完整性(completeness)
每个故障最后都能检测出来
2.准确性(accuracy)
每个检测到的故障都对应一次崩溃
同步系统:
ping-ack 和heartbeat 这两种故障检测方式都是完整且准确的
异步系统:
ping-ack 和heartbeat 这两种故障检测方式是完整的。
因为既然停止了,timeout设置多大,最后都能检测到。
但是不能保证是准确的,因为timeout这个值说不准,也许这一次延迟特别长,导致以为发生了崩溃。
如何得到一个准确但不完整的系统呢?
Never report a failure(不报错,就永远不会检测错)
最坏情况下检测到故障的时间
发生崩溃后,最长时间其他进程可以检测到。
1.ping-ack
最坏情况是刚刚回复上一个ping的ack,就发生故障了。
同步系统的最坏情况 上一个ping到达时间为 min 网络延迟(减去的最少)
2.heartbeat
最坏情况是q刚发送一个heartbeat就崩溃了。
同步系统的最坏情况 上一个heartbeat到达p时间为 max网络延迟
多个进程的故障检测
Heartbeats检验方式
都发给服务器pi
环状,但是如果多个失败,就检验不到是哪个了。
每个节点都可以发给其他节点。但是带宽会大大地增加
总结:
带宽使用情况
如果将周期T减小会怎么样?
错误检测时间能够缩短
但是用的带宽会增加
如果将Timeout时间增加会怎么样?
Accuracy也会增加
但是错误检测时间增加
通信遗漏(Communication Omission)
(1)Channel Omission
被通道遗漏了
(2)Send Omission
进程完成了send这个动作,但是msg没有到达outgoing msg buffer
(3)Receive Omission
msg到达incoming buffer 但是进程没有收到
通过网络协议能够减轻信息的遗漏
总结:遗漏错误指进程或通道失败,而导致不能完成特定的任务
拜占庭将军问题Arbitrary (Byzantine) Failures
进程执行错误,发送错误的信息
Timing failure
没达到计时要求
只针对同步系统
故障总结
三种类型故障:Omission,Arbitrary,Timing
故障检测(检测崩溃的进程)
一般用ping-ack或者 heartbeat
在timeout时间内没有收到回复,就是进程崩溃
timeout时间的估计
同步系统可以准确算timeout
异步系统只能靠估计