分布式存储中,我们常常需要处理这样的场景:
- 客户端A接入存储,并且开始读写。
- 客户端A网络断开。
- 客户端B接入存储,并且开始读写。
为了避免客户端A/B并发读写造成的数据不一致,通常我们需要一些同步机制,比如:
- 存储端采用raft等共识协议:性能可能比较差,客户端规模大时会有问题。
- 存储端对A/B进行锁授权。
方案2的问题在于,当客户端A离线后,如何在必要的时候,强制抢占A的锁,并且让A无法继续访问存储(通常是在访问的时候会报错)。
如何让A无法继续访问存储呢?可以在通信层面使用版本号的机制让客户端无法再访问服务端。也可以在业务上在客户端B访问的时候,先做一些『屏蔽』的动作,完成这些『屏蔽』的动作后,客户端B再开始读写。我们保证这些『屏蔽』的动作完成后,客户端A就无法再访问存储了即可。具体『屏蔽』的动作,由业务自己来设计。