首页 > 其他分享 >分布式系统 Lab 2: Primary-Backup Service -Part1

分布式系统 Lab 2: Primary-Backup Service -Part1

时间:2023-01-20 21:22:33浏览次数:42  
标签:Service S2 备份 Primary 视图 分布式系统 服务器 S1 客户端

Lab 2: Primary-Backup Service -Part1

概述

此次lab会通过主备份的方式创建容错服务,通过视图服务器(ViewServer)的方式来确定主从服务器,视图服务器监听主从服务器(Primary,Backup)的状态,当主服务器或备用服务器不可用时,由视图服务器来选择新的主从服务器。
当主服务器发生故障,将备份做为主服务器。当备份服务器宕机,若有可用的空闲服务器(IdleServer),则其成为备份。主服务器会将其完整的应用程序状态发送给backup,并将每一次客户端请求发送给backup,以确保备份服务器与主服务器保持一致。
主服务器必须备份服务器回复才能响应客户端。(这有助于防止两台服务器充当主服务器(“裂脑”)。例如:S1 为主,S2 为备份。ViewServer决定(错误地)S1已死,并将 S2提升为主要服务器。如果客户端认为 S1 仍然是主服务器并向其发送操作,S1 会将操作转发给 S2,S2 将回复一个错误,表明它不再是备份(假设 S2 从 ViewServer 获得了新视图)。 然后 S1 可以向客户端返回一个错误,表明 S1 可能不再是主要的(因为 S2 拒绝了该操作,所以必须形成一个新的视图);然后客户端可以向 ViewServer 请求正确的主服务器 (S2) 并向其发送操作。)

Part 1:视图服务器

重要属性:
1.主服务器必须为前一个视图中的主服务器或备份服务器,备份服务器可以为除了主服务器外的任意一个可用服务器,或为空。(当主服务器在没有备份服务器宕机时,视图服务器会卡住,将在后续实验中修复)
2.视图服务器在两个连续的 PingCheckTimer 之间没有收到的服务器的Ping消息时,认为该服务器宕机。
3.粗体只有在收到当前视图中主服务器对当前视图确认时,才允许更新视图。

难点

视图在何时进行更新以及如何更新,这个问题折磨了我好长一会,通过一下午debug逐步调试并详细阅读测试用例,最后结合文档,终于明白可以列为一下几种情况

何时更新以及如何更新?

1 初始化时viewNum为0,当有服务器ping时,直接将服务器作为主服务器,更新viewnum为1,并置ack为false(未收到主服务器对当前视图的ping)
2 当有除主服务器以外服务器ping时,若当前视图备份服务器为空且ack为true时,则置为当前视图备份服务器,若当前视图备份服务器为空且ack为false时,由于未收到主服务器确认,将新的视图存入下一个视图中
4 当收到主服务器确认时,置flag = true,若此时下一个视图(nextView)不为空,则将当前视图置为下一视图,并将下一视图置空。
3 在两个连续的PingCheckTimer没有收到的主从服务器的Ping消息时,若已确认,修改当前视图,否则修改下一视图。

部分代码截图:
截屏20230120 20.40.34.png
截屏20230120 20.42.38.png

不足及改进

1 总体实现较为繁琐,文档中写只需100行代码,但实际实现在150行以上
2 一开始想的较为复杂,以为视图服务器负责的不止一组主从服务器,外加备份服务器应该遵循先来先到的原则,但实际上这两者都不需要。

结果

截屏20230120 20.09.06.png
截屏20230120 17.44.06.png截屏20230120 17.44.16.png

标签:Service,S2,备份,Primary,视图,分布式系统,服务器,S1,客户端
From: https://www.cnblogs.com/aiko123/p/17063251.html

相关文章