面试题答案
一键面试分布式锁确保读写操作一致性原理
在分布式文件系统中,多个节点可能同时尝试对文件数据进行读写操作。分布式锁通过以下方式确保一致性:
- 互斥访问:在同一时刻,只有获得锁的节点能够对文件进行写操作或读操作(在读写锁场景下,可允许多个节点同时读),其他节点需等待锁释放,避免并发写入导致数据不一致,以及读写并发可能造成的脏读等问题。
- 顺序执行:获得锁的节点按照顺序依次执行操作,使得文件数据的状态按照期望的顺序进行变更,确保所有节点看到的文件数据状态是一致的。
常用分布式锁实现方式及应用原理
基于 Redis 的分布式锁
- 实现方式:利用 Redis 的
SETNX
(SET if Not eXists)命令。当一个节点尝试获取锁时,使用SETNX
命令在 Redis 中设置一个特定的键值对,如果设置成功(即键不存在),则表示该节点获得了锁;若设置失败(键已存在),则表示锁已被其他节点持有。 - 应用原理:在分布式文件系统写操作前,节点先尝试获取 Redis 锁。获取成功后进行写操作,操作完成后通过
DEL
命令删除 Redis 中的锁键,释放锁。对于读操作,若需要保证一致性,也可先获取锁,确保读操作期间数据不会被其他节点修改。例如,在一个多节点的分布式文件存储系统中,节点 A 要对文件file1
进行写入更新,它先尝试获取 Redis 锁,若获取成功,进行写入操作,完成后释放锁。此时若节点 B 也想操作该文件,在节点 A 释放锁前,节点 B 获取锁失败,只能等待。
基于 Zookeeper 的分布式锁
- 实现方式:在 Zookeeper 中创建一个临时顺序节点。每个节点尝试获取锁时,在指定的锁目录下创建一个临时顺序节点。Zookeeper 会为每个节点分配一个唯一的序号,序号最小的节点获得锁。
- 应用原理:在分布式文件系统的读写操作场景下,节点在 Zookeeper 中创建锁节点。例如,节点 C 要对文件
file2
进行读操作,它在 Zookeeper 锁目录下创建临时顺序节点。若它创建的节点序号最小,它就获得锁进行读操作,操作完成后删除该节点释放锁。若序号不是最小,它需要监听比它序号小的前一个节点,当前一个节点删除(释放锁)时,它收到通知后重新判断自己是否为最小序号节点,若是则获得锁进行操作。
基于数据库的分布式锁
- 实现方式:利用数据库的排他锁机制。例如在 MySQL 中,可以使用
SELECT... FOR UPDATE
语句。当一个节点尝试获取锁时,执行一条SELECT... FOR UPDATE
语句锁定特定的记录(可以是专门用于锁的表中的一条记录),只有获取到锁的节点才能继续执行后续操作。 - 应用原理:在分布式文件系统对文件操作前,节点执行数据库的锁获取语句。如节点 D 要对文件
file3
进行写操作,它先执行SELECT id FROM lock_table WHERE file_name = 'file3' FOR UPDATE
,若成功锁定记录,则进行写操作,操作完成后通过提交事务释放锁(MySQL 中事务提交或回滚时会释放锁)。若其他节点同时尝试获取锁,由于记录已被锁定,只能等待锁释放。