面试题答案
一键面试Zookeeper分布式锁在节点故障时保证可用性和一致性的方式
- 可用性:
- Zookeeper采用的是Paxos算法的变种ZAB协议(Zookeeper Atomic Broadcast)来保证集群的一致性和可用性。即使部分节点故障,只要集群中超过半数的节点(即Quorum机制)存活,Zookeeper集群就能正常工作。在分布式锁场景下,客户端可以继续与存活的节点进行交互获取或释放锁,不会因为部分节点故障而完全无法获取锁。
- 例如,一个5节点的Zookeeper集群,允许2个节点故障,剩下3个节点仍能构成超过半数的Quorum,继续提供服务。
- 一致性:
- Zookeeper通过ZAB协议保证数据的一致性。写操作(如创建锁节点)会被广播到所有节点,只有当超过半数节点确认写入成功,该操作才被认为成功。对于分布式锁,这意味着所有节点对于锁的状态(锁是否被持有)有一致的认知。
- 当一个节点发生故障恢复后,它会从其他节点同步数据,保证自身的数据状态与集群一致,从而确保锁的一致性。
Redis分布式锁在节点故障时保证可用性和一致性的方式
- 可用性:
- Redis单实例模式下,如果节点故障,整个锁服务不可用。但在Redis Cluster模式下,部分节点故障时,只要剩余节点能继续提供服务,客户端仍可尝试获取锁。不过,由于Redis Cluster的数据分布在不同节点,可能会出现部分锁数据不可用的情况。
- 例如,在一个Redis Cluster集群中,某个负责存储锁数据的节点故障,那么依赖该节点的锁可能暂时无法获取,但其他节点上的锁仍可正常操作。
- 一致性:
- Redis在默认异步复制模式下,主节点将数据写入后就返回成功,此时从节点可能还未同步到数据。如果主节点在数据同步到从节点前发生故障,可能会导致锁的一致性问题,即新的主节点可能没有之前锁的状态信息。为解决这个问题,可以使用Redis的Redlock算法(基于多个独立Redis实例)。Redlock算法要求在大多数Redis实例(N个实例中至少N/2 + 1个)上成功获取锁,才认为获取锁成功,这样在部分节点故障时能保证锁的一致性。
基于容错特性在不同业务场景下选择分布式锁方案
- 对一致性要求极高,对性能要求相对不苛刻的场景:
- 例如银行转账等涉及资金的业务场景,数据一致性至关重要。此时应选择Zookeeper分布式锁。因为Zookeeper通过ZAB协议和Quorum机制能很好地保证锁的一致性,即使部分节点故障也能确保所有节点对锁状态的认知一致,避免出现重复操作或数据不一致的情况。
- 对性能要求较高,对一致性要求相对宽松的场景:
- 如电商抢购等业务场景,瞬间高并发,更注重系统的响应速度。可以选择Redis分布式锁。在单实例Redis的情况下,操作简单性能高,但要注意节点故障风险。在Redis Cluster模式或使用Redlock算法时,在一定程度上能兼顾性能和部分容错,即使部分节点故障仍能继续提供锁服务,虽然可能存在短暂的一致性问题,但对于抢购这类场景影响相对较小。