注意
本文档适用于 Ceph 开发版本。
RBD排他锁
排他锁是机制,旨在防止多个进程以非协调的方式访问相同的Rados块设备(RBD)。RBD mirroring(其中它们是基于日志的镜像的先决条件,以及快照镜像中增量差异的快速生成)中被广泛使用。
The exclusive-lock
功能在新建的镜像上启用。此默认值可以通过rbd_default_features
配置选项或--image-feature
和--image-shared
选项覆盖。rbd create
command.
Note
许多镜像功能,包括object-map
和fast-diff
,都依赖于排他锁。禁用exclusive-lock
功能将负面影响某些操作的性能。
为了保持多客户端访问,该exclusive-lock
功能在客户端之间实现自动协作锁转换。它确保在任何给定时间内只有一个客户端可以写入RBD镜像,从而保护内部镜像结构,如对象映射、日志或PWL 缓存免受并发修改。
排他锁对用户来说基本是透明的:
每当客户端(一个
librbd
进程,或者在krbd
客户端的情况下,客户端节点的内核)需要处理对已启用排他锁的RBD镜像的写入时,它首先在镜像上获取一个排他锁。如果锁已被其他客户端持有,则请求该客户端释放锁。每当持有RBD镜像排他锁的客户端收到释放锁的请求时,它停止处理写入,刷新其缓存并释放锁。
每当持有RBD镜像排他锁的客户端优雅地终止时,锁也会优雅地释放。
RBD镜像上的排他锁的优雅释放(无论是请求还是由于客户端终止)使另一个后续客户端能够获取锁并开始处理写入。
警告
默认情况下,exclusive-lock
该功能不会阻止两个或多个并发运行的客户端打开相同的RBD镜像并轮流写入(无论是否在同一个节点上)。实际上,它们的写入会被线性化,因为锁会自动以协作的方式来回转换。
Note
要禁用客户端之间的自动锁转换,可以在获取排他锁时指定RBD_LOCK_MODE_EXCLUSIVE
标志。这是通过--exclusive
option for rbd
device map
command.
Note
The exclusive-lock
功能暴露的,该功能与RBD建议锁rbd lock add
和rbd lock rm
命令)不兼容。
拒绝服务
有时,先前持有RBD镜像排他锁的客户端不会优雅地终止,而是突然死亡。这可能是因为客户端进程收到了KILL
或ABRT
信号,或者因为客户端节点经历了硬重启或断电。在这种情况下,锁永远不会优雅地释放。这意味着任何新启动并尝试写入镜像的客户端都必须打破先前持有的排他锁。
然而,一个进程(或内核线程)可能会挂起或仅仅是失去与Ceph集群的网络连接一段时间。在这种情况下,打破锁可能是灾难性的:挂起的进程或连接问题可能会自行解决,然后原始进程可能与中途启动的进程竞争,从而以非协调和破坏性的方式访问RBD数据。
如果无法以标准优雅的方式获取锁,抢占进程不仅会打破锁,还会将先前持有锁的进程列入黑名单。这是新客户端进程与Ceph Monitor协商的结果。
接收到黑名单请求后,监控器指示相关OSD不再为旧客户端进程提供服务;
在相关的OSD映射更新完成后,新客户端可以打破先前持有的锁;
新客户端获取锁后,它可以开始写入镜像。
因此,黑名单是一种存储级别的资源封锁.
Note
为了使黑名单生效,客户端必须具有osd
blocklist
功能。此功能包含在profile
rbd
功能配置文件中,该配置文件通常应设置在所有使用RBD的Ceph客户端身份上。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.