天天看点

分布式系统设计之租约

分布式系统的基本架构

在现在的分布式系统架构中,绝大多数是采用Master/Slave的架构,只有极少部分采用P2P架构。也就是有Master管理各个Slave,包括元数据,负载等,Master决定Client能访问哪些Slave节点。

访问一般流程如下:

1.Client向Master发送请求,需要读取数据。

2.Master根据元数据,负载等信息,选择可以访问的Slave。然后将Slave的地址信息返回给Client.

3.Client根据Master返回的信息,访问对应的Slave,读取数据

4.Slave响应Client的请求,将数据返回给Client。具体如下图。

从上面的架构来看,Client所有的请求都需要经过Master,然后才能访问到对应Slave。这样当Client请求量非常大时,就会造成Master的压力非常大,甚至可能引起宕机。如果Client能够使用缓存,那就可以大大减少Master请求,减轻服务器的压力。但是缓存怎么保证一致性呢?接下来分享一下google的Chubby使用的租约机制。

分布式系统设计之租约

租约的基本原理

Chubby实现租约的方式是这样的。

1.当Master向Client发起一个响应时,Client会将对应的Slave信息缓存在客户端,并设置失效时间,同时Client向Master发起一个请求,请求续租,同时带上时间戳。

2.Master为每一个客户端维护一个时钟。当Master检测Slave可以正常提供访问时,会在快过期时响应Client请求。这是Client收到请求后,更新失效时间,并重新向Master发送续租请求。

3.当Master判断Slave无法访问或者负载过高需要切换时,Master会将新的Slave地址响应给Client,这是Client会更新缓存以及失效时间,再重复上面的步骤1。

4.如果Client没有接收到Master续租成功的响应,缓存超时失效。同时客户端会等待一定时间,比如1s。如果在此期间收到Master响应,则认为续租成功,缓存生效。否则将重新请求。

通过上面的租约,客户端就可以保证缓存的一致性。从而可以让客户端最大限度的使用本地缓存,而不用去请求Master。

继续阅读