分布式之Lease机制

220 阅读2分钟
原文链接: mp.weixin.qq.com
问题背景:
  • 含有中心服务器的节点,管理着元数据,其他节点需要读取和修改这些数据。每次操作都需要访问中心服务器节点,那么节点很容易成为瓶颈。为此设计一种元数据cache,要求cache数据始终与中心服务器上面的数据一致。

    原理:
  • 中心服务器在向各个节点发送数据时同时向节点颁发一个lease。每个lease具有一个有效期,lease上面的有效期通常是一个明确的时间点。(这边先假设中心服务器和各节点时钟是同步的),在lease的有效期内,中心服务器保证不修改对应数据的值。节点收到数据和lease后,将数据加入本地Cache,一旦对应的lease超时节点删除本地Cache。中心服务器修改数据是,先阻塞所有新的读请求,并等待之前为该数据发送的所有的lease超时过期,然后修改数据的值。

  • 优化:上面中心服务器进入修改数据流程后,会阻塞读请求,优化方式是处理读请求但是不发布新的lease。

  • Lease机制依赖于有效期,这就要求颁布者和接收者的时钟是同步的。对于时钟不同步的问题,实践中的方法是将颁发者的有效期设置得比接收者的略大,只需要过时钟误差就可以避免对lease的有效性影响。

    基于Lease机制确定节点状态
  • 情景: 存在A,B,C,Q四个节点,ABC为副本,Q需要判断ABC状态。

  • 基于Lease机制的过程如下:

    • ABC周期性的向Q发送心跳,Q收到心跳之后发送一个lease,表示Q确定了节点A、B、C的状态,允许在lease时期内正常工作。节点Q可以给primary节点一个特殊的lease,表示节点可以作为primary工作,一旦节点Q希望切换新的primary,则只需要等前一个primary的lease过期,则就可以安全的颁发新的lease给新的primary,而不会出现“双主”问题。

    • 实际系统中,若用一个中心节点发送lease风险很大,一旦该中心节点崩溃或者网络异常则所有节点都没有lease,从而造成系统的高度不可用。实际系统使用多个中心节点互为副本成为一个小的集群,如chubby和zookeeper。

    • 工程中,常选择的lease时长是10秒级别,这是一个经过验证的经验值,实践可以中可以作为参考并综合选择合适的时长。