|
|
ceph tell mds.monxx client ls 检查ceph 文件系统挂载节点
5 J% v6 M6 |7 l' j& T自动驱逐客户端¶
& }' \' N8 Z. m) c在三种情况下,客户端会被自动驱逐:5 K. d5 w/ i+ m7 n
2 B; l% y) I! J; ?# ~( Y6 M在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 session_autoclose (一个文件系统变量)秒数(默认 300 秒)内没有与 MDS 通讯,它就会被自动驱逐。
5 F. A7 f, N+ A8 m" O6 G% s% t
2 D$ T( z' k: [/ k; `在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 mds_cap_revoke_eviction_timeout (配置变量)秒数(默认 300 秒)内没有回应 cap 撤销消息。默认已禁用。
, R# Z0 K1 p. ]- M8 G
. k) J7 y& R0 Y! q$ E# E在 MDS 启动(包括故障恢复)期间,它要途径一个名为 reconnect 的状态,在这个状态下,它会等待所有客户端连接到这个新 MDS 守护进程。如果有客户端在限期( mds_reconnect_timeout ,默认 45 秒 )内未能连上,它们就会被驱逐。
' d" J1 O, F9 [& C. k( J9 r' I
2 Y. H$ z" A8 Y0 t( J7 ]3 }以上任何一种情况产生,就会向集群日志发送一条警告消息。0 ?% g4 \5 y' L) b& M6 d$ I( t. i( ]
5 K2 C5 v; z- F5 S% v5 X9 A
手动驱逐客户端¶
7 e7 |5 |- d0 m$ \3 x3 I! g" T有时候,管理员可能得手动驱逐某个客户端。比如说,一个客户端已死,管理员不想等它的会话超时;或者有个客户端行为异常,管理员又无法登录客户端节点卸载它。( m) g0 e4 M) X/ T
" q/ Z4 C* n/ ~! n5 D1 M3 d一般要先检查下客户端列表:6 |' x) C9 _6 H$ v+ u
K; l. z5 @" t- r
ceph tell mds.0 client ls* | s) L ^* D/ \! |; c* ]
( z" X' m" @" `0 ~) \
[
& M9 m# q1 V# {2 h& d {; O, y, u# r! K
"id": 4305,1 T( n3 o* X. N( \1 ~. K. B
"num_leases": 0,
+ S; k$ R$ i) i7 w1 d" R* } "num_caps": 3,8 z% z' g6 `& @4 z& l0 t, T
"state": "open",* z$ j& F5 U h! B
"replay_requests": 0,& `& Y$ R' K! j. j" l! T6 j6 `
"completed_requests": 0," |6 ^: d( y ^5 X; C( @9 d
"reconnecting": false,6 m! s3 |* [* R: B- _
"inst": "client.4305 172.21.9.34:0/422650892",' ^- M5 [# P& H3 M/ B
"client_metadata": {. d, R) x E' M; [
"ceph_sha1": "ae81e49d369875ac8b569ff3e3c456a31b8f3af5",# _* p; o/ R/ R2 T
"ceph_version": "ceph version 12.0.0-1934-gae81e49 (ae81e49d369875ac8b569ff3e3c456a31b8f3af5)",/ A% |/ M6 t1 W$ o4 F
"entity_id": "0",
. g/ h* [8 n- o, {8 ]1 m "hostname": "senta04",
) {0 [. s4 |5 [; L "mount_point": "/tmp/tmpcMpF1b/mnt.0",
. D2 Y7 s: b- @6 T, o9 G "pid": "29377",& M- n0 h% }2 B/ M/ y* @
"root": "/"
3 y* K7 I" c/ j }) h# Q2 t. B/ R( J, j% D' h$ F
}
( k ]! L5 A' I]7 E$ Y( k2 |, E& P
找到想要驱逐的客户端后,就可以用它的唯一 ID 、或者其它属性来标识它:$ T9 F* ~; ~& `" o
- V! y3 _( q' M% c0 u
# 这些都可以
8 ^8 {% O& P/ r" d! J1 Q; {3 Uceph tell mds.0 client evict id=4305
1 J- {% F' g& i4 Z- ]: Fceph tell mds.0 client evict client_metadata.=4305
0 G3 o% w7 t3 ~, _0 @' ]. \ D$ b- _高级话题:从黑名单踢出客户端¶
# I$ F8 u T+ Z9 ?0 x通常,进了黑名单的客户端就不能再重新连接服务器了:它必须被卸载、然后再重新挂载。
2 w1 w9 ?2 S8 V ^3 b! N8 V J- {! o; l' d! K
然而,在某些情况下,还是得允许被驱逐后、又想重连的客户端。
0 y6 ? I+ ]5 l& h# I. ^! {# {) a$ X. w( I) {
CephFS 是用 RADOS OSD 黑名单来控制客户端驱逐的,所以只要把它们从黑名单删除,就是允许这些 CephFS 客户端重连了:
! S1 e7 Z; ^: S$ h
9 Z% @* o$ I8 `% y4 P! |' r$ ceph osd blacklist ls
' M& D: ~, g- m7 m* i3 xlisted 1 entries
0 r, j& c: | g8 _) {: b, W127.0.0.1:0/3710147553 2018-03-19 11:32:24.716146 i6 m+ Q6 l( k# Q" T% Z4 j# D
$ ceph osd blacklist rm 127.0.0.1:0/3710147553' m1 c9 \: n7 D4 g5 Q
un-blacklisting 127.0.0.1:0/3710147553' T& f( Q& Y5 t9 `2 P' x
假如被拉黑的客户端对缓冲 IO 做了操作,而其它客户端访问了这些文件,这样做就可能会破坏数据完整性。而且也不能确定客户端功能会完全恢复——要想挽回一个完全健康的被驱逐客户端,最好的方法是把它卸载掉,然后再干净地挂载。9 J8 B7 c* _" J
) Q9 F' c' v3 L# n+ h/ B& Y
如果你想这样重连客户端,可以在 FUSE 客户端上设置 client_reconnect_stale 为 true ,以此为客户端重连提速。
3 N4 x, ?- j( E1 w" r4 B* Z2 ]4 `' H% r
! H. A; V, u, R, R9 z0 |3 L高级话题:配置黑名单功能¶
7 F% b( ?+ U4 `2 w U* B" F如果由于客户端主机慢或者网络不可靠,频繁遇到客户端驱逐,这些底层问题还解决不了,你可以让 MDS 别那么严格。
$ ~* @7 I. h6 Q; ]# K9 p4 i; u; { w' x5 H. c7 ~# t3 V0 w
对于响应缓慢的客户端,可以简单地丢弃它们的 MDS 会话,却允许它们重新开启会话并且允许它们继续与 OSD 通讯。要打开这种模式,可以在 MDS 节点上把 mds_session_blacklist_on_timeout 设置为 false 。
U0 {& A3 w2 {* G# E) ?% S, [
9 f% F |1 a7 s+ I& ~9 t8 u8 O对于手动驱逐时的类似情形,可以把 mds_session_blacklist_on_evict 设置为 false 。
' ^0 x2 w1 A- A, H' p4 {8 G3 H6 c4 s. u
注意,如果禁用了黑名单功能,那么驱逐客户端只会在收到了命令的 MDS 上生效。在一个多活 MDS 系统上,你得向所有活跃的 MDS 守护进程发送驱逐命令。黑名单功能启用时(默认如此),只要把驱逐命令发给一个 MDS 就足够了,因为黑名单会自动扩散到其余守护进程。
" d! h8 k+ g4 {+ E% ?# ^
% A- W; c8 x3 A% N. h, S背景: 黑名单和 OSD 元图屏蔽¶0 @# x; ?/ w7 m
一个客户端被加入黑名单后,有必要确保其它客户端和 MDS 守护进程能收到最新的 OSDMap (新增了这条黑名单的),以免有人再访问那些进了黑名单的客户端访问过的数据对象。7 \/ s2 c. X8 r1 D7 m \& n
2 c1 L* d. G9 j; _" A( J这是通过名为 “osdmap epoch barrier” 的内部机制保证的。, Q2 Z1 v, l: X9 b D) n, a
2 k7 E9 x' W S1 Y" T- E
此屏蔽的目的是为了确保当我们分配出这些能力后,别的客户端就有可能触碰同样的 RADOS 对象,接受分配能力的客户端们必须有足够新的 OSD 图,这样它们才不会与取消的操作(来自 ENOSPC )或进了黑名单的客户端(来自驱逐过程)竞争。
, ?+ U1 S9 x# L% X) j1 s" U! b. T @$ u, u% W1 n! N) i% N
更具体些,我们设置元图屏蔽的情形有:
) q8 u9 T' ^ k2 ?% s/ Y$ V) B' U- {
: U1 {/ u2 j8 O" ?; [0 E3 F0 M客户端驱逐(此客户端被加入黑名单了、且其它客户端必须等到有加黑之后的元图出现才能触碰同一批对象);
% e3 q! h6 B' C" p6 W% F, b" W* p7 S5 M% i9 F* h+ G- S/ Z. L$ D j. j
客户端正在处理 OSD 图的完整标识(此客户端可能会在快完整的元图中取消一些 OSD 操作,这样其它客户端都必须等着,直到元图完整或周期达到才能触碰同样的对象);
# h( l7 ~ x9 j( I
G2 T' q. h* }8 uMDS 启动,因为我们不会永久存储屏蔽图元,所以必须假设重启后总是需要最新的 OSD 图。9 P8 K$ _( v1 k
; F9 F7 Z* G9 b3 D' V0 ]$ B6 h: [; Q注意,为保持简洁性这是个全局值,其实我们可以做到按每索引节点维护此值,但我们没有这么做,因为:& G/ `" ~/ L) w! u- k* H7 F
6 t% R0 [: I0 c( H* V5 c7 B
它会复杂得多;3 h1 H! p t* c' L* h; t0 }2 P
' J! _4 U: c* H$ w/ P每索引节点需额外多占 4 字节的内存;% w I2 w8 q6 [' X y% {' }% e/ R
# n$ W+ F8 P) }' y& T6 p无论如何它都不会比大家一直都拥有最新的 OSD 图更有效。而且,大多数情况下,大家都能轻松地越过这个屏障而不是等着它。
* ~2 |4 ?0 m$ L- c r
# W% N% m4 A& n8 u* n我们仅在极少数情形下使用这种屏蔽,所以每索引节点这样细粒度的实现带来的好处也很少见。# Z3 b: v- n9 k2 m- H+ d# V
2 S: A0 ^2 F5 [( @
元图屏蔽随其它能力消息一起传递,并且可指示消息接收器在看到这个 OSD 元图前、别再向那些 OSD 发送 RADOS 操作。主要是面向客户端(它们直接向文件写入数据)的,也适用于 MDS ,因为像文件尺寸探测和文件删除这样的操作都是直接在 MDS 上进行的。
' l* [8 [6 y& q |
|