3

在阅读谷歌关于 chubby 的文章时,我并没有真正理解测序仪的目的

假设我们有 4 个实体:

  1. 胖乎乎的细胞
  2. 客户 1
  3. 客户 2
  4. 我们想要使用的服务以及我们将发送请求的位置(我们需要锁定)

据我了解,步骤是:

在此处输入图像描述

  1. 客户端 1发送lock_request()Chubby 单元,Chubby 响应Sequencer(假设SequenceNumber = 1

  2. 客户端 1modify_data()使用 Sequencer (SequenceNumber = 1) 向服务发送请求

  3. 如果 SequenceNumber 有效(=1),服务会询问Chubby 单元
  4. Chubby承认,设置LeasePeriod(锁定到期时间为(假设)60 秒)!在此期间没有人能够获得锁
  5. 确认后,Service将有关Client 1 (SequenceNumber = 1)的数据缓存(假设)40 秒

现在:如果客户端 2在我们设置的这 60 秒内尝试获取锁,它将被Chubby 单元拒绝

这意味着客户端 2不可能获取下一个 SequenceNumber = 2 的锁并将任何内容发送到服务

据我了解,SequenceNumber 的所有目的仅适用于当 2 个请求到达Service并且Service可以比较 2 个 SequenceNumber 并拒绝较低的情况,而无需询问Chubby 单元

但是,如果我们有缓存并且不可能在客户端 1持有这个锁的情况下获得客户端 2的锁,这种情况将如何发生?

4

1 回答 1

0

用实际时间(如秒)来考虑分布式系统中的时间是错误的,但我会尝试使用相同的语义来回答。

如您所说,假设 client1 获取名为 foo1 的写锁,这里的 foo 是锁名称,1 是代号。

现在说,租用期是 60 秒。现在第 58 秒 Client1 发送一个写操作,比如 R1。

很快,Client1 就死了。

现在,这就是问题所在。您在分析中假设 R1 将在 2 秒内到达服务器,然后另一个客户端(例如 Client2 成为主服务器)。

那只是不确定。

在分布式系统中,一方面有几分之一毫秒的网络延迟,另一方面网络分区,您只是无法确定什么首先到达主控,R1 或客户端 2 的请求成为主控。

这是序列号会有所帮助的地方。

Master,现在已经知道有 foo2,可以拒绝元数据中带有 foo1 的 R1。

在此处阅读有关世代时钟/逻辑时钟的更多信息。

逻辑时钟是一种在分布式系统中捕获时间顺序和因果关系的机制。通常,分布式系统可能没有物理上同步的全局时钟。幸运的是,在许多应用程序中(例如分布式 GNU make),如果两个进程从不交互,则无法观察到缺乏同步。此外,在这些应用程序中,进程就事件顺序(即逻辑时钟)而不是挂钟时间达成一致就足够了。 [1]

于 2021-08-28T14:11:19.550 回答