|
|
ceph tell mds.monxx client ls 检查ceph 文件系统挂载节点
5 n; _* [& @: z. ^- i7 e( K0 R自动驱逐客户端¶; K) @% m+ W3 I0 _* n5 M }
在三种情况下,客户端会被自动驱逐:; C! j/ w/ Q* d- l0 m( Q
! o$ ]+ ?) [* c2 m在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 session_autoclose (一个文件系统变量)秒数(默认 300 秒)内没有与 MDS 通讯,它就会被自动驱逐。- a; ^3 N3 v3 |. l
# ^4 d) a: O& r3 o% ^
在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 mds_cap_revoke_eviction_timeout (配置变量)秒数(默认 300 秒)内没有回应 cap 撤销消息。默认已禁用。. Y( f$ B. p. {# W- F
/ y8 k. ?5 [6 [7 r
在 MDS 启动(包括故障恢复)期间,它要途径一个名为 reconnect 的状态,在这个状态下,它会等待所有客户端连接到这个新 MDS 守护进程。如果有客户端在限期( mds_reconnect_timeout ,默认 45 秒 )内未能连上,它们就会被驱逐。! {1 A! T+ c: G+ @6 b5 n
' _/ I0 a. `+ M+ Z$ S+ \
以上任何一种情况产生,就会向集群日志发送一条警告消息。. K9 r( t) @( Y$ N6 i
" o G3 ~( u4 E2 M& e, o手动驱逐客户端¶7 v; N: `/ l2 \
有时候,管理员可能得手动驱逐某个客户端。比如说,一个客户端已死,管理员不想等它的会话超时;或者有个客户端行为异常,管理员又无法登录客户端节点卸载它。$ n: M6 s+ b1 T& m8 u0 V! C
' G3 c3 w# o$ ? S一般要先检查下客户端列表:
. n2 H9 C9 p" g2 Y: ^# _# Q
! Y" c9 U8 @3 l' T hceph tell mds.0 client ls, e2 X) X3 ]: H7 \, {* M
" m, [. r% m0 b4 w* b0 M' d1 b
[
2 V1 M) o# y6 T1 a6 h' e3 ~ {7 \5 {1 l3 k$ c+ m9 u, T0 o
"id": 4305,& d: i5 k: m7 l% ?4 L; O
"num_leases": 0,
$ |- w" g+ H% z. l. v "num_caps": 3,
/ g& x; i1 w3 C2 a% [3 l "state": "open",
, ~1 y9 p( {7 N8 [; N4 n' s+ n "replay_requests": 0,& y2 S# [& l, [ d
"completed_requests": 0,
8 G- C ^ E0 {, w" p5 s/ J "reconnecting": false,' z! d5 T3 c R% e6 Q% p& F
"inst": "client.4305 172.21.9.34:0/422650892",
+ q! N% v2 d/ @* r) Z "client_metadata": {6 x& r# R: ^/ V8 A+ s0 o# P, m: b) Y
"ceph_sha1": "ae81e49d369875ac8b569ff3e3c456a31b8f3af5",
$ |$ t0 \. [5 g; ~3 @ "ceph_version": "ceph version 12.0.0-1934-gae81e49 (ae81e49d369875ac8b569ff3e3c456a31b8f3af5)",
( H/ }- d6 a" ]/ T6 b6 @4 {' S* Y "entity_id": "0",
4 ^( ?" G1 S' A6 N* d4 [ "hostname": "senta04",$ c) Q0 x) X$ e" ?' s
"mount_point": "/tmp/tmpcMpF1b/mnt.0",0 i& g3 T& L9 x3 f
"pid": "29377",2 m5 f1 T+ J/ N; r
"root": "/"$ ?* r) |4 a6 d4 M. Q
}
, p/ t1 E, a% J% B' a }3 r# V" z4 i2 l7 W4 z9 F
]
+ u& y- C1 R$ i: r# _ P, P6 i2 w8 S找到想要驱逐的客户端后,就可以用它的唯一 ID 、或者其它属性来标识它:
' p: s9 M( @( _7 U, W6 T W1 M: g ?7 h O6 p- o! z/ @9 n
# 这些都可以+ z- ]7 O' r0 z; U
ceph tell mds.0 client evict id=4305
[) z4 `) S" A6 v) C0 lceph tell mds.0 client evict client_metadata.=4305( l7 a; M7 u$ Y* [7 Y; {+ v
高级话题:从黑名单踢出客户端¶3 o) |4 B) [: {) d
通常,进了黑名单的客户端就不能再重新连接服务器了:它必须被卸载、然后再重新挂载。
, o' f+ U) `1 o, w* j0 {
% }( v% ^% W- E2 G6 I然而,在某些情况下,还是得允许被驱逐后、又想重连的客户端。0 Z5 A" @- K0 h- z
0 m: k4 Y) }: [: B- z( tCephFS 是用 RADOS OSD 黑名单来控制客户端驱逐的,所以只要把它们从黑名单删除,就是允许这些 CephFS 客户端重连了:
7 P' J% W- _" l' r. ~" J7 u( T5 i3 v- L, O( D2 z
$ ceph osd blacklist ls1 E, f' k* y2 |; D3 I. l
listed 1 entries
6 A' ?' [4 X' v! {8 x& [1 s) P; y6 o127.0.0.1:0/3710147553 2018-03-19 11:32:24.716146. m. f1 f; ]: L/ L8 p5 b9 H
$ ceph osd blacklist rm 127.0.0.1:0/3710147553
: h1 Z2 Q- k( A7 b7 jun-blacklisting 127.0.0.1:0/3710147553
/ I; @# Y2 A% C- }9 F# Z假如被拉黑的客户端对缓冲 IO 做了操作,而其它客户端访问了这些文件,这样做就可能会破坏数据完整性。而且也不能确定客户端功能会完全恢复——要想挽回一个完全健康的被驱逐客户端,最好的方法是把它卸载掉,然后再干净地挂载。2 `; ~0 @" z: F5 f5 i) ]
6 E& [9 ~- P, `& u) Z
如果你想这样重连客户端,可以在 FUSE 客户端上设置 client_reconnect_stale 为 true ,以此为客户端重连提速。
1 T2 |" y% ?; j8 s
1 C1 i8 s3 p l4 x. l% ~0 F高级话题:配置黑名单功能¶& B5 I5 J) f" W2 m, C; g
如果由于客户端主机慢或者网络不可靠,频繁遇到客户端驱逐,这些底层问题还解决不了,你可以让 MDS 别那么严格。
# ~# U* b$ ^& `7 w4 K* j
0 J5 p* w7 {2 J8 S! R1 S对于响应缓慢的客户端,可以简单地丢弃它们的 MDS 会话,却允许它们重新开启会话并且允许它们继续与 OSD 通讯。要打开这种模式,可以在 MDS 节点上把 mds_session_blacklist_on_timeout 设置为 false 。, R5 D; k' W; y& x, ?( Z
( V( _4 J0 v* T; n" Z对于手动驱逐时的类似情形,可以把 mds_session_blacklist_on_evict 设置为 false 。9 f7 ? y q* _" f8 g- B
; G1 f0 K" h7 K. @注意,如果禁用了黑名单功能,那么驱逐客户端只会在收到了命令的 MDS 上生效。在一个多活 MDS 系统上,你得向所有活跃的 MDS 守护进程发送驱逐命令。黑名单功能启用时(默认如此),只要把驱逐命令发给一个 MDS 就足够了,因为黑名单会自动扩散到其余守护进程。! }' {/ i4 J4 L
3 f C8 g+ ?$ ?9 k1 P背景: 黑名单和 OSD 元图屏蔽¶
+ ^2 U; z2 r1 ~: Y一个客户端被加入黑名单后,有必要确保其它客户端和 MDS 守护进程能收到最新的 OSDMap (新增了这条黑名单的),以免有人再访问那些进了黑名单的客户端访问过的数据对象。1 _0 d9 {' h/ |% H! q
+ v& O, y9 l9 b& i; N! B+ ]* T这是通过名为 “osdmap epoch barrier” 的内部机制保证的。
4 ?9 s7 z+ d3 u) z2 I! x' V6 k* \6 A9 X' o- ^ ]. X; Q
此屏蔽的目的是为了确保当我们分配出这些能力后,别的客户端就有可能触碰同样的 RADOS 对象,接受分配能力的客户端们必须有足够新的 OSD 图,这样它们才不会与取消的操作(来自 ENOSPC )或进了黑名单的客户端(来自驱逐过程)竞争。
: {+ q3 X2 G3 s/ h7 j2 Y. ]
. y( T' E6 K" P# `更具体些,我们设置元图屏蔽的情形有:
0 h8 q+ F! \& ~- s8 a8 q6 @ N$ f( M/ [% j7 ~6 h* s
客户端驱逐(此客户端被加入黑名单了、且其它客户端必须等到有加黑之后的元图出现才能触碰同一批对象);) M$ d, y6 i3 i
9 H- U9 R6 l' v! j1 x- z Y( f
客户端正在处理 OSD 图的完整标识(此客户端可能会在快完整的元图中取消一些 OSD 操作,这样其它客户端都必须等着,直到元图完整或周期达到才能触碰同样的对象);
# V# Z8 `$ z9 m6 y s4 N
3 K: O2 k% O5 p7 B2 |: RMDS 启动,因为我们不会永久存储屏蔽图元,所以必须假设重启后总是需要最新的 OSD 图。
* G- C# p' O+ L* R7 d* o+ L$ f) I
9 b9 G/ D1 D5 b4 C注意,为保持简洁性这是个全局值,其实我们可以做到按每索引节点维护此值,但我们没有这么做,因为:+ g1 H' p6 p( A# P- A$ g
1 g4 {- g/ S! q3 r8 H: h3 ]* C$ T
它会复杂得多;/ k+ I2 l0 I' q# O% c
' h# |( \- W7 C. @
每索引节点需额外多占 4 字节的内存;
E5 u+ x( ^2 K+ O% T! n {0 z9 M. W+ `7 {
无论如何它都不会比大家一直都拥有最新的 OSD 图更有效。而且,大多数情况下,大家都能轻松地越过这个屏障而不是等着它。
7 y& J. V( ~/ l b8 u3 ~
9 b& p) ]3 T) _# I& [我们仅在极少数情形下使用这种屏蔽,所以每索引节点这样细粒度的实现带来的好处也很少见。$ a' F( c& o& l9 s
5 ~7 e8 \& h+ b3 _
元图屏蔽随其它能力消息一起传递,并且可指示消息接收器在看到这个 OSD 元图前、别再向那些 OSD 发送 RADOS 操作。主要是面向客户端(它们直接向文件写入数据)的,也适用于 MDS ,因为像文件尺寸探测和文件删除这样的操作都是直接在 MDS 上进行的。1 A1 P/ _6 x0 G* s
|
|