技术文章:分布式系统模式-High-Water Mark

java达人
关注

作者: Unmesh Joshi

译者: java达人

预写日志中的索引,显示最近一次成功的复制。

问题

服务器崩溃并重新启动后,可使用“Write-Ahead Log”模式恢复状态。但是,如果服务器发生故障,Write-Ahead Log不足以提供可用性。如果单个服务器发生故障,则客户端将无法运行,直到服务器重新启动。为了获得更多可用的系统,我们可以在多个服务器上复制日志。使用领导者和追随者模式,领导者会将其所有日志条目复制到追随者法定数。现在,如果领导者失败,则可以选举新的领导者,并且客户可以像以前一样继续使用集群。但是仍然有几处可能出问题:

?   leader在将其日志发送给任何追随者之前可能会失败。?   领导者可能会在向一些追随者发送日志条目时失败,无法将其发送给大多数的追随者。

在这些错误场景中,一些追随者可能在其日志中丢失条目,而一些追随者可能拥有比其他追随者更多的条目。因此,对于每个follower来说,了解日志的哪一部分对客户端是安全可用的就变得很重要了。

解决方案

high-water mark是日志文件的一个索引,它记录已知已成功复制到追随者Quorum的最后一个日志条目。在复制过程中,领导者还会将high-water mark传递给追随者。集群中的所有服务器应该只向请求低于high-water mark更新的客户端传输数据。

这是操作顺序:

Figure 1: High-Water Mark

对于每个日志条目,leader将其附加到其本地预写日志中,然后将其发送给所有追随者。

leader (class ReplicationModule...)
 private Long appendAndReplicate(byte[] data) {      Long lastLogEntryIndex = appendToLocalLog(data);      logger.info("Replicating log entries from index " + lastLogEntryIndex);      replicateOnFollowers(lastLogEntryIndex);      return lastLogEntryIndex;  }
 private void replicateOnFollowers(Long entryAtIndex) {      for (final FollowerHandler follower : followers) {          replicateOn(follower, entryAtIndex); //send replication requests to followers      }  }

追随者处理复制请求并将日志条目附加到它们的本地日志中。在成功附加日志条目之后,它们将拥有的最新日志条目索引响应到leader。该响应还包括服务器的当前Generation Clock。

follower (class ReplicationModule...)
 private ReplicationResponse handleReplicationRequest(ReplicationRequest replicationRequest) {      List

Leader在收到响应时跟踪在每个服务器上复制的日志索引。

class ReplicationModule…
 recordReplicationConfirmedFor(response.getServerId(), response.getReplicatedLogIndex());  long logIndexAtQuorum = computeHighwaterMark(logIndexesAtAllServers(), config.numberOfServers());  if (logIndexAtQuorum > replicationState.getHighWaterMark()) {      var previousHighWaterMark = replicationState.getHighWaterMark();      applyLogAt(previousHighWaterMark, logIndexAtQuorum);      replicationState.setHighWaterMark(logIndexAtQuorum);  }

通过查看所有追随者的日志索引和领导者本身的日志,并获取大多数服务器上可用的索引,可以计算出High-Water Mark。

class ReplicationModule…
 Long computeHighwaterMark(List

领导者将high-water mark作为常规心跳的一部分或作为单独的请求向追随者传播。追随者随后相应地设定了他们的high-water mark。

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存