1、租约意义
sharding需要同步,但是这里rgw是无状态的,因此有多个rgw,到底哪个rgw负责实施同步流程,需要一个机制来保证只有唯一一个rgw来实施,否则就会导致数据错乱或者重复操作
思路
- 通过抢锁,谁先抢到谁先实施, 并且每次抢到会有一个时间期限,在rgw里面默认是120s,参考RGWSimpleRadosLockCR里面的代码。
- 然后有一个租约流程,参考RGWContinuousLeaseCR, 如果抢锁成功则每隔60秒去续约, 如果失败则退出
- 外部可以加个驱动,驱使抢锁失败的再重新去调度,例如RGWMetaSyncShardControlCR:public RGWBackoffControlCR中每次抢锁失败会等待一会儿,最大不超过30s,就会再次去触发抢锁
- 抢锁的逻辑是放在单独的stack,可以理解为线程,因为不应被抢锁成功后所应做的事情阻塞, 这里需要及时的去续约
抢锁逻辑分析
- 每次抢锁成功,可以确保接下来的120s执行后续的同步逻辑是安全的
- 抢锁成功之后可以等到120s之后再去续约,但是这个时候很有可能就被其它人抢走了,所以需要在60s之后就要去续约, 另外就是60s之后去续约就始终保证了接下来同步耗时有60s的容错时间,也就是保证接下来你执行任何事情无论耗时多久在这60s内都不会被其它人打扰,因为顶多你续约失败,那么还有60s是不被打扰的。如果不中途续约,比如119秒的时候去续约,118秒的时候执行一个操作,这个操作需要10秒,那么很可能续约失败,被其它rgw抢占,那么就很可能两个rgw就在做同样的事情。
网友评论