找回密码
 注册
查看: 622|回复: 2

cephfs文件系统中客户端的驱逐自动,手动等

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-7-27 13:37:00 | 显示全部楼层 |阅读模式
Ceph 文件系统客户端的驱逐
当某个文件系统客户端不响应或者有其它异常行为时,有必要强制切断它到文件系统的访问,这个过程就叫做驱逐
驱逐 CephFS 客户端,就是防止它再与 MDS 和 OSD 守护进程通讯。如果客户端已经对文件系统的缓冲 IO 做了些操作,这些未刷回的数据会丢失。
客户端也有可能被自动(如果它们没及时与 MDS 通讯)、或手动驱逐(被系统管理员)。
客户端驱逐机制适用于所有类型的客户端,包括 FUSE 挂载客户端、内核挂载客户端、 nfs-ganesha 网关、以及其它使用 libcephfs 的进程。
自动驱逐客户端在三种情况下,客户端会被自动驱逐:6 c0 i9 z2 I  [$ n
  • 在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 session_autoclose (一个文件系统变量)秒数(默认 300 秒)内没有与 MDS 通讯,它就会被自动驱逐。# o4 n* H$ {) Y, h6 P3 S  ~2 U
  • 在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 mds_cap_revoke_eviction_timeout (配置变量)秒数(默认 300 秒)内没有回应 cap 撤销消息。默认已禁用。
    0 p7 x5 _3 a) h$ J/ B
  • 在 MDS 启动(包括故障恢复)期间,它要途径一个名为 reconnect 的状态,在这个状态下,它会等待所有客户端连接到这个新 MDS 守护进程。如果有客户端在限期( mds_reconnect_timeout ,默认 45 秒 )内未能连上,它们就会被驱逐。
    " @. n7 k6 L  b- z3 a
    4 X) O/ Y; `2 B: K
以上任何一种情况产生,就会向集群日志发送一条警告消息。
/ t; x% Q2 g4 J1 K

$ K; ]4 J! H1 [3 U. S$ S手动驱逐客户端有时候,管理员可能得手动驱逐某个客户端。比如说,一个客户端已死,管理员不想等它的会话超时;或者有个客户端行为异常,管理员又无法登录客户端节点卸载它。
! j0 c& b3 v4 U! D7 `. D一般要先检查下客户端列表:$ I; B& S" ?# U4 ~
ceph tell mds.0 client ls[    {        "id": 4305,        "num_leases": 0,        "num_caps": 3,        "state": "open",        "replay_requests": 0,        "completed_requests": 0,        "reconnecting": false,        "inst": "client.4305 172.21.9.34:0/422650892",        "client_metadata": {            "ceph_sha1": "ae81e49d369875ac8b569ff3e3c456a31b8f3af5",            "ceph_version": "ceph version 12.0.0-1934-gae81e49 (ae81e49d369875ac8b569ff3e3c456a31b8f3af5)",            "entity_id": "0",            "hostname": "senta04",            "mount_point": "/tmp/tmpcMpF1b/mnt.0",            "pid": "29377",            "root": "/"        }    }]" M, j' K& Z* u3 B6 A. W
) i1 T: {3 _! w7 a
找到想要驱逐的客户端后,就可以用它的唯一 ID 、或者其它属性来标识它:6 Z- u/ x3 g" ]3 _5 ~( j/ U% u2 a
# 这些都可以ceph tell mds.0 client evict id=4305ceph tell mds.0 client evict client_metadata.=4305
( v7 t# U1 P1 w7 C1 n- H: s1 {* _: g

' A7 o% d3 L: w# y: V: ~6 [高级话题:从黑名单踢出客户端通常,进了黑名单的客户端就不能再重新连接服务器了:它必须被卸载、然后再重新挂载。8 t$ Y, ]% T! o* \6 p2 |! P% r( A' D
然而,在某些情况下,还是得允许被驱逐后、又想重连的客户端。+ e" J8 y0 k. @% g8 i
CephFS 是用 RADOS OSD 黑名单来控制客户端驱逐的,所以只要把它们从黑名单删除,就是允许这些 CephFS 客户端重连了:( Q2 |7 O" C! {7 @- T. Q" v1 S
$ ceph osd blacklist lslisted 1 entries127.0.0.1:0/3710147553 2018-03-19 11:32:24.716146$ ceph osd blacklist rm 127.0.0.1:0/3710147553un-blacklisting 127.0.0.1:0/37101475538 M) y. A9 I* G- h. U: Y
. C( `8 X! \0 W: F
假如被拉黑的客户端对缓冲 IO 做了操作,而其它客户端访问了这些文件,这样做就可能会破坏数据完整性。而且也不能确定客户端功能会完全恢复——要想挽回一个完全健康的被驱逐客户端,最好的方法是把它卸载掉,然后再干净地挂载。
9 T. z! K% b- k* @如果你想这样重连客户端,可以在 FUSE 客户端上设置 client_reconnect_stale 为 true ,以此为客户端重连提速。, g" x- A7 c" H
# ~* y: H+ Y# s2 Y1 F* P! L
高级话题:配置黑名单功能如果由于客户端主机慢或者网络不可靠,频繁遇到客户端驱逐,这些底层问题还解决不了,你可以让 MDS 别那么严格。/ _* C) T7 C9 ?" N* @' P
对于响应缓慢的客户端,可以简单地丢弃它们的 MDS 会话,却允许它们重新开启会话并且允许它们继续与 OSD 通讯。要打开这种模式,可以在 MDS 节点上把 mds_session_blacklist_on_timeout 设置为 false 。
* t; e& x- }$ }: z1 L对于手动驱逐时的类似情形,可以把 mds_session_blacklist_on_evict 设置为 false 。
& `, S: b) }+ d) q注意,如果禁用了黑名单功能,那么驱逐客户端只会在收到了命令的 MDS 上生效。在一个多活 MDS 系统上,你得向所有活跃的 MDS 守护进程发送驱逐命令。黑名单功能启用时(默认如此),只要把驱逐命令发给一个 MDS 就足够了,因为黑名单会自动扩散到其余守护进程。- H8 E3 O9 P$ K5 f

5 H* {8 a3 z: R' ]( c0 Q! o4 H背景: 黑名单和 OSD 元图屏蔽一个客户端被加入黑名单后,有必要确保其它客户端和 MDS 守护进程能收到最新的 OSDMap (新增了这条黑名单的),以免有人再访问那些进了黑名单的客户端访问过的数据对象。/ K- y1 v# x. A1 Q0 ]
这是通过名为 “osdmap epoch barrier” 的内部机制保证的。
0 P/ v7 `1 v( h此屏蔽的目的是为了确保当我们分配出这些能力后,别的客户端就有可能触碰同样的 RADOS 对象,接受分配能力的客户端们必须有足够新的 OSD 图,这样它们才不会与取消的操作(来自 ENOSPC )或进了黑名单的客户端(来自驱逐过程)竞争。
# u6 [- r5 M3 ?3 O& D1 a+ Y更具体些,我们设置元图屏蔽的情形有:
( J9 [+ i: _1 r8 o
  • 客户端驱逐(此客户端被加入黑名单了、且其它客户端必须等到有加黑之后的元图出现才能触碰同一批对象);$ {  i8 V0 N! w. A: |  ?
  • 客户端正在处理 OSD 图的完整标识(此客户端可能会在快完整的元图中取消一些 OSD 操作,这样其它客户端都必须等着,直到元图完整或周期达到才能触碰同样的对象);* H( O* Y& _# `$ c, p7 C
  • MDS 启动,因为我们不会永久存储屏蔽图元,所以必须假设重启后总是需要最新的 OSD 图。
    2 L* e. Z) |( _+ }6 r5 b6 D
    2 R' U4 L* b* L# g) n* k7 m
注意,为保持简洁性这是个全局值,其实我们可以做到按每索引节点维护此值,但我们没有这么做,因为:
7 w( _5 d) A& E9 {
  • 它会复杂得多;
    . i0 m5 f& R, A  u
  • 每索引节点需额外多占 4 字节的内存;
    2 \8 h8 `2 ^  j2 j3 M
  • 无论如何它都不会比大家一直都拥有最新的 OSD 图更有效。而且,大多数情况下,大家都能轻松地越过这个屏障而不是等着它。
    . F5 ^: X9 @8 _8 m1 `1 e: j
  • 我们仅在极少数情形下使用这种屏蔽,所以每索引节点这样细粒度的实现带来的好处也很少见。! d! E5 v: O* k: u( X4 R" l8 V
    * k) l' `7 v* r  W' P- W6 m0 E
元图屏蔽随其它能力消息一起传递,并且可指示消息接收器在看到这个 OSD 元图前、别再向那些 OSD 发送 RADOS 操作。主要是面向客户端(它们直接向文件写入数据)的,也适用于 MDS ,因为像文件尺寸探测和文件删除这样的操作都是直接在 MDS 上进行的。
6 c7 W8 X- L, t9 H8 c

& c/ r! y' ?& v* O# e! G  u0 ~# F8 K% G1 z: a* i% g( d

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-7-27 13:37:48 | 显示全部楼层
处理占满的 Ceph 文件系统¶0 b: g+ [5 ]! ~
当 RADOS 集群使用率达到总容量的 mon_osd_full_ratio (默认 95% )时,它会被打上 OSD full 标记。在问题解决前(如扩容集群),此标记会使大多数常规 RADOS 客户端暂停所有操作。5 ~5 k' }9 ~9 q0 J
! O1 I4 t# C) x+ H- L" S% ~
文件系统对 full 标记还有些特殊处理,下文详述。4 ]0 U0 H, v6 l
0 D- }3 F+ g/ s8 }6 ~! g$ E
Hammer 及更高版¶
2 t& S. ^1 }: P) N- F% q; W4 B从 hammer 发布开始,以下行为会导致占满的文件系统返回 ENOSPC 错误:" j: T2 t: \  Y" P

+ l; N- H6 L  |& j客户端写入数据
6 L/ A7 {" X% Z& c. O& W4 g  Z5 I; v+ G8 _
删除和裁剪以外的其它元数据操作
$ a6 A' o8 L, f+ N6 {  W8 T" s9 f- \, D2 D) y5 j
因为只有在数据刷回到硬盘(有时是 write 返回 0 之后)才可能遇到占满的情况,所以应用程序调用 fsync 或 fclose (或等价操作)进行文件处理时才可能遇到 ENOSPC 错误。
& i8 K2 }  Z4 E3 a3 T6 E- k8 t* H# i8 x) y! K" H" e
调用 fsync 能可靠地反映数据是否写入了硬盘,并且在没写入时返回错误。 fclose 只有在缓冲的数据从上次写入以来被偶尔刷回过才会返回错误[译者:原文可能有误]—— fclose 成功并不能保证数据写入了硬盘,而且在空间占满时, fclose 之后如果没地方存储缓冲的数据,它们就可能被丢弃。
& l/ }* T2 a; L% Q" W0 d% n3 G  k: Z1 f* i2 J+ h# i; @3 d7 S
Warning
% D! X& J5 A# s9 b7 K3 r) x- O/ d% U0 Z& N& g
如果某一应用程序在占满的文件系统上行为异常,有必要检查下它调用了 fsync() 来确保数据已写入硬盘,然后再继续。5 t# B6 E- T: z* i* f' P% n

( B: o) ^) u6 v* g! X: o2 _; F! V如果客户端运行时已经看到了 OSD full 标记,写数据操作可能被取消。各个客户端取消操作并释放文件能力时会更新 osd_epoch_barrier ,以确保这些取消的操作不会妨碍 MDS 或其它客户端对这些数据对象的访问。要了解元图屏蔽机制,请参考 背景: 黑名单和 OSD 元图屏蔽 。
  u$ Y, s7 |3 [9 x0 h; }6 I. o& v- s$ Q
老版本( hammer 之前)的行为¶: P1 d6 C9 N% r  |0 D
在 hammer 之前的 Ceph 版本中, MDS 会忽略 RADOS 集群的占满状态,而且客户端的任意数据写入都会卡死,直到集群脱离占满状态。
" c0 t( i  S: W7 b' \+ ^
, t4 ]7 W. ^) b* M# }1 b6 N出现这种行为时有两种危险情形要注意:
7 p/ l* o/ h9 f! b( W2 \
7 o. t  ]  O; ?, Q6 }$ @, m  n如果一客户端到一个文件的写入未完成,那么它不可能把文件释放给 MDS 让它删除,这样就很难清理占满的文件系统。
& o& V$ |6 D% P7 V) \* t7 F- J9 C
如果客户端持续地创建大量空文件,来自 MDS 的元数据写入操作终将会耗尽 OSD 空间,这样就再也不能执行删除动作了。

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-7-27 13:38:17 | 显示全部楼层
故障排除¶
" b# p6 |" W! p慢或卡住的操作¶# T# ~4 M1 ~4 @" C( D5 ~! {
如果遇到了明显的卡顿操作,首先要定位问题源头:是客户端、 MDS 、抑或是连接二者的网络。从存在卡顿操作的地方下手(参考下面的 慢请求( MDS 端) ),进而缩小范围。% D" W- G3 D( N# e9 b
9 t) v& C! ^  a3 ^5 f3 B
RADOS 健康状况¶1 I/ [' a9 T- q) X* F( W
如果 CephFS 的元数据或者数据存储池的某一部分不可用、且 CephFS 不响应,很有可能是 RADOS 本身有问题,应该先解决这样的问题( 故障排除 )。" y/ L  G- `) f/ T8 }# @5 U' e
1 ~) W7 q5 C3 @9 ?/ I
MDS 问题¶6 e- ^+ A7 R! y9 r  O
如果某个操作卡在了 MDS 内部,类似 “slow requests are blocked” 的消息最终会出现在 ceph health 里,也可能指出是客户端的问题,如 “failing to respond” 或其它形式的异常行为。如果 MDS 认定某些客户端的行为异常,你应该弄明白起因。常见起因有:
/ H5 D% m" z: Q' S( d! z
" ?7 k1 C" I! Q. M1 ^" v系统过载(如果你还有空闲内存,增大 mds cache size 配置试试,默认才 100000 。活跃文件比较多,超过 MDS 缓存容量是此问题的首要起因!)" i8 t6 B5 o! z8 \9 L

/ x0 E$ W) c0 N: O# ?0 R客户端比较老(行为异常),或者# ]: E. J  q5 \# d" ?
$ a: B" h0 a! _8 v7 j# m
底层的 RADOS 问题。
# J7 Z0 T" J' s
) Q" G4 _$ w* P( v除此之外,你也许遇到了新的软件缺陷,应该报告给开发者!  B/ ~9 K. Z- q

0 w- v; R0 w. M- ?6 \7 G慢请求( MDS 端)¶
8 a8 u4 x# @8 `5 G通过管理套接字,你可以罗列当前正在运行的操作:. e7 ^- I# Q$ i/ {2 `, n

: s7 p3 N3 H( lceph daemon mds.<name> dump_ops_in_flight
0 R0 N2 J* }7 ?7 N& b2 s2 t在 MDS 主机上执行。找出卡住的命令、并调查卡住的原因。通常最后一个“事件”( event )尝试过收集锁、或者把这个操作发往 MDS 日志。如果它是在等待 OSD ,修正即可;如果操作都卡在了某个索引节点上,原因可能是一个客户端一直占着能力,别人就没法拿到,也可能是这个客户端想刷回脏数据,还可能是你遇到了 CephFS 分布式文件锁的代码(文件能力子系统、 capabilities 、 caps )缺陷。) A- ]1 N* O. Y$ F: V* [
# I0 `) M0 |% j& N% p
如果起因是能力代码的缺陷,重启 MDS 也许能解决此问题。
4 M; y4 ]4 |  b6 j& O0 l
/ s3 L8 M- F9 d  E% K( a3 c如果 MDS 上没发现慢请求,而且也没报告客户端行为异常,那问题就可能在客户端上、或者它的请求还没到 MDS 上。
0 a; U" |7 }/ Q1 t5 i% g" C
" Z2 ]& m. L4 j* `8 Lceph-fuse 的调试¶/ h+ c- t9 T& L  L
ceph-fuse 也支持 dump_ops_in_flight 命令,可以查看是否卡住、卡在哪里了。
: C: U) Q$ K4 T. w+ }: A
, c4 k$ T! e+ `3 y7 N. r- s调试输出¶$ o3 ^+ }7 e( _% c6 w
要想看到 ceph-fuse 的更多调试信息,试试在前台运行,让日志输出到控制台( -d )、打开客户端调试( --debug-client=20 )、打印发送过的所有消息( --debug-ms=1 )。- e8 H  S* y+ j  }

2 f; Z/ ?! ?2 S7 W如果你怀疑是监视器的问题,也可以打开监视器调试开关( --debug-monc=20 )。9 t  F& F, z0 _* X/ Q
% V+ t2 K* _! e  t
内核挂载的调试¶
6 v- ?% s% W9 o* u3 T+ P慢请求¶
' @0 k6 L! h4 P/ J7 G7 P遗憾的是内核客户端不支持管理套接字,可是如果你的内核启用了(如果限制过) debugfs ,那么它就有相似的接口了。 sys/kernel/debug/ceph/ 路径下有一个文件夹(其名字形如 28f7427e-5558-4ffd-ae1a-51ec3042759a.client25386880 ),而且其内包含很多文件,用 cat 命令查看它们的内容时会看到有趣的输出。这些文件描述如下,最有助于调试慢请求问题的文件可能是 mdsc 和 osdc 。
2 Z7 M$ }9 p8 v( h
, E) X% F1 g6 y4 T2 @bdi: 关于 Ceph 系统的 BDI 信息(脏块、已写入的等等)
* y$ a! x  S) a& z
: L$ ~5 X: s* P$ s; l7 jcaps: 文件的 caps 数据结构计数,包括内存中的和用过的
% _$ d0 s/ ^  I0 C% s7 {  w, D
  ]5 V  k7 _5 u3 g! ~7 _7 ~client_options: 倒出挂载 CephFS 时所用的选项
% J# ?$ A) U/ A* B; f. o
% S) g. }. \% M' fdentry_lru: 倒出当前内存中的 CephFS dentry# u) z1 F% V; ~! J0 O9 k

/ Q% a* Q0 f! f) {% s6 L: k- ?mdsc: 倒出当前发给 MDS 的请求6 S) X. d3 [# ~3 M% d% s
6 {# l# P! H. ]
mdsmap: 倒出当前的 MDSMap 时间结和所有 MDS
2 w; Q% y; t, l* l1 @& q  I1 J$ p: z
mds_sessions: 倒出当前与 MDS 建立的会话( H" i2 P8 H: E( A: u% {
- J" n9 v: j7 a5 H) j. X
monc: 倒出当前从监视器获取的各种映射图,以及其它“订阅”信息% l5 ^. C& m, l1 k

9 k8 y3 c- n) o' z8 K  X3 Dmonmap: 倒出当前的监视器图和所有监视器
- w0 f  Z& B0 Q' x  R) W; K* q
) M- O1 @4 M$ x, A3 O" h6 Losdc: 倒出当前发往 OSD 的操作(即文件数据的 IO )
; P, \/ k- C/ t& e
: ]) `2 Y, i5 ]' m& n3 C, r3 F3 cosdmap: 倒出当前的 OSDMap 时间结、存储池、所有 OSD
6 ]' |4 o7 ?# h8 F$ J7 C4 u
/ i* C: S- v3 F如果没有卡住的请求,却有毫无进展的文件 IO ,问题也许是……
5 g1 @+ X1 r, Z0 t* V
7 k& {: S: @  y1 Y% j' ?断线后又重新挂载的文件系统¶
( b' w% \+ X- k0 t- B因为 CephFS 有个“一致性缓存”,如果你的网络连接中断时间较长,客户端就会被系统强制断开,此时,内核客户端仍然傻站着( in a bind ):它不能安全地写回脏数据,另外很多应用程序在 close() 时不能正确处理 IO 错误。这个时候,内核客户端会重新挂载这个文件系统,但是先前的文件系统 IO 也许能完成、也许不能,这些情况下,你也许得重启客户端系统。
# ]# j, H; s7 q$ M' z$ X; q7 [5 j' V- J: Y
如果 dmesg 或者 kern.log 里出现了类似消息,说明你遇到的就是这种情况:
: v9 @4 g7 k" ], G% K* ^+ Z$ l% L% n
Jul 20 08:14:38 teuthology kernel: [3677601.123718] ceph: mds0 closed our session
" E: r$ [& F: ~) \8 k8 LJul 20 08:14:38 teuthology kernel: [3677601.128019] ceph: mds0 reconnect start: {! D% l  X! ^% M# Z* s
Jul 20 08:14:39 teuthology kernel: [3677602.093378] ceph: mds0 reconnect denied5 `$ S9 b% M6 D6 y
Jul 20 08:14:39 teuthology kernel: [3677602.098525] ceph:  dropping dirty+flushing Fw state for ffff8802dc150518 1099935956631# I/ B6 f& _; ]: G$ ^  O4 g
Jul 20 08:14:39 teuthology kernel: [3677602.107145] ceph:  dropping dirty+flushing Fw state for ffff8801008e8518 1099935946707
0 g0 P( \4 U5 ^Jul 20 08:14:39 teuthology kernel: [3677602.196747] libceph: mds0 172.21.5.114:6812 socket closed (con state OPEN)# P! b7 z! V2 q) B0 d
Jul 20 08:14:40 teuthology kernel: [3677603.126214] libceph: mds0 172.21.5.114:6812 connection reset
6 U5 N/ {1 W4 e0 GJul 20 08:14:40 teuthology kernel: [3677603.132176] libceph: reset on mds0
& \+ U# z; @. Y; ^9 E# K" T这是正在改善的领域,内核将很快能够可靠地向正在进行的 IO 发送错误代码,即便你的应用程序不能良好地应对这些情况。长远来看,在不违背 POSIX 语义的情况下,我们希望可以重连和回收数据(通常是其它客户端尚未访问、或修改的数据)。
  l. m+ A# g+ A5 J% p5 q6 X/ Q! F( n' l$ O2 _" I9 U* \) s1 P, L9 T
挂载问题¶
% L) J! P* W2 Y, ~1 [1 h; w- \; @& i, wMount 5 Error¶1 {4 e$ C2 z; h& Q7 G1 U
mount 5 错误通常是 MDS 服务器滞后或崩溃导致的。要确保至少有一个 MDS 是启动且运行的,集群也要处于 active+healthy 状态。
7 P7 j4 Y1 G! C% z$ T/ y; N9 o: k& o) j/ w, {# B: J
Mount 12 Error¶; V( \% n, W+ X" Y& \0 y+ T
mount 12 错误显示 cannot allocate memory ,常见于 Ceph 客户端和 Ceph 存储集群版本不匹配。用以下命令检查版本:1 F! d4 v$ W0 R  G

* C# O! ~$ y  F8 T. g, W) X6 ~3 I' @5 nceph -v
7 {7 e& W8 d" p如果 Ceph 客户端版本落后于集群,试着升级它:
5 o. u( p, d/ {
$ W3 i: ^' Q9 g4 psudo apt-get update && sudo apt-get install ceph-common
1 E$ T3 O4 S4 b9 y* M你也许得卸载、清理和删除 ceph-common ,然后再重新安装,以确保安装的是最新版。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 23:01 , Processed in 0.019323 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表