|
|
ceph tell mds.monxx client ls 检查ceph 文件系统挂载节点
' I- f# G- F2 a# a/ W- t' \5 P1 B自动驱逐客户端¶- i; @0 ?! I. `- P @4 P
在三种情况下,客户端会被自动驱逐:! ]) r9 U5 d2 u- `
5 F$ R' d8 w0 d% J- O/ c4 j7 t9 c7 ~在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 session_autoclose (一个文件系统变量)秒数(默认 300 秒)内没有与 MDS 通讯,它就会被自动驱逐。- `, `6 B6 K5 B$ L* u
, ]0 I5 ~3 e, a1 g: V8 X& k
在一个活跃的 MDS 守护进程上,如果一个客户端在限定的时间 mds_cap_revoke_eviction_timeout (配置变量)秒数(默认 300 秒)内没有回应 cap 撤销消息。默认已禁用。
4 f9 \& P( G# A6 o+ T! y2 v
% K7 V; E% t& f$ T2 V在 MDS 启动(包括故障恢复)期间,它要途径一个名为 reconnect 的状态,在这个状态下,它会等待所有客户端连接到这个新 MDS 守护进程。如果有客户端在限期( mds_reconnect_timeout ,默认 45 秒 )内未能连上,它们就会被驱逐。
6 n9 ?8 j' ^8 o7 x8 |! q3 E8 f1 V" n8 G& a/ g9 ^
以上任何一种情况产生,就会向集群日志发送一条警告消息。
. i* }7 B# I( ]+ ]0 C2 _8 T" _# Q: T% d B# X. n7 b/ s
手动驱逐客户端¶0 v& X: |$ |: L, c+ W7 T' N; K
有时候,管理员可能得手动驱逐某个客户端。比如说,一个客户端已死,管理员不想等它的会话超时;或者有个客户端行为异常,管理员又无法登录客户端节点卸载它。7 U: M, [1 i/ \6 i1 D1 l: Y: J
8 P. o, Z) a/ q0 G i9 q一般要先检查下客户端列表:
" W" B9 R* D. f1 y0 |3 A: g" F) L# U. g
ceph tell mds.0 client ls
; C2 g# y% L( u8 C$ I ^5 u) k. j* L* q) a
[
) c L. d; {5 w% p' `" h! O4 y {
0 d; L% @+ x3 o) v. ^; ^ "id": 4305,
\$ b1 c5 t5 S3 u "num_leases": 0,
# _9 U" m6 Y& F; C ^ "num_caps": 3,9 {9 ?2 L5 {- F/ t# Q
"state": "open",
; W; t$ F7 V0 E7 E5 d "replay_requests": 0,, ~$ M3 f2 T2 o& ^; V. h; O" X+ T
"completed_requests": 0,
# e& N7 ?) j( P. d0 }& _ "reconnecting": false,$ \5 s) \1 H; D1 |
"inst": "client.4305 172.21.9.34:0/422650892",+ q$ o: X1 g# e) {
"client_metadata": {: d1 ?! r/ x+ ~! u8 P2 O8 [& o
"ceph_sha1": "ae81e49d369875ac8b569ff3e3c456a31b8f3af5",# E' h5 B) |' @
"ceph_version": "ceph version 12.0.0-1934-gae81e49 (ae81e49d369875ac8b569ff3e3c456a31b8f3af5)",
7 l3 k, d9 C* N2 G# H! a6 q8 L "entity_id": "0",5 I+ \2 r6 }: n- j
"hostname": "senta04",( I" Q! T, h( Q; S; R
"mount_point": "/tmp/tmpcMpF1b/mnt.0",( L6 r+ C) X- z. A) w- T. @& W
"pid": "29377",4 }0 |! K+ ~% ^ z2 b
"root": "/"
/ [4 v2 u \' j; z9 q. Y0 C; U }
2 w" Y- e; \( X' F7 y0 B" [ }' }. x$ {6 b. {' n G3 a, ~
]
1 `9 F( E: F [/ D; e/ u5 r找到想要驱逐的客户端后,就可以用它的唯一 ID 、或者其它属性来标识它:- q. E' Y& |( ~* d
% \3 V* V; n. ^
# 这些都可以* |' u O% N8 L, V: _4 x9 H
ceph tell mds.0 client evict id=4305
" w8 V/ K! I( E3 F9 Qceph tell mds.0 client evict client_metadata.=4305
. L4 i# m7 x( g' ~% s高级话题:从黑名单踢出客户端¶4 h& |$ h; L* V
通常,进了黑名单的客户端就不能再重新连接服务器了:它必须被卸载、然后再重新挂载。
e! A* m3 Z" z! x& T' W- ? f) q) o' _0 E) u) X
然而,在某些情况下,还是得允许被驱逐后、又想重连的客户端。9 @) _, i8 v) A0 f
9 V- N& F' ]4 z" M. bCephFS 是用 RADOS OSD 黑名单来控制客户端驱逐的,所以只要把它们从黑名单删除,就是允许这些 CephFS 客户端重连了:" |" \% t+ L% \4 u# ~
* o* u' a$ l0 a$ ceph osd blacklist ls% V8 z( o3 }9 z% X; |- w
listed 1 entries
8 ^4 U2 x' a7 J" N- ~127.0.0.1:0/3710147553 2018-03-19 11:32:24.716146+ Q0 k8 _; g) y5 ^& B: i+ v# e- ]( _
$ ceph osd blacklist rm 127.0.0.1:0/37101475538 R/ k! g4 U! y) o, x6 V
un-blacklisting 127.0.0.1:0/3710147553% v4 d$ a7 R) z% l$ r
假如被拉黑的客户端对缓冲 IO 做了操作,而其它客户端访问了这些文件,这样做就可能会破坏数据完整性。而且也不能确定客户端功能会完全恢复——要想挽回一个完全健康的被驱逐客户端,最好的方法是把它卸载掉,然后再干净地挂载。
! @1 E* F0 {& n Y$ s( U) k* m/ k! F4 {' P
如果你想这样重连客户端,可以在 FUSE 客户端上设置 client_reconnect_stale 为 true ,以此为客户端重连提速。, h/ j, I9 P& e8 O$ g
/ P# r4 ?% ~% ]: H. s, m9 U/ G
高级话题:配置黑名单功能¶/ a$ X8 @7 D6 D& H+ L8 K( Q1 h0 l
如果由于客户端主机慢或者网络不可靠,频繁遇到客户端驱逐,这些底层问题还解决不了,你可以让 MDS 别那么严格。; e# t! u0 ]! g9 V% |* k/ c
4 j: r5 |- C0 ^* n- G6 {+ E& V
对于响应缓慢的客户端,可以简单地丢弃它们的 MDS 会话,却允许它们重新开启会话并且允许它们继续与 OSD 通讯。要打开这种模式,可以在 MDS 节点上把 mds_session_blacklist_on_timeout 设置为 false 。# f+ ]4 k* |' |& V3 x5 P( f
8 t! i, j" f+ F* o+ V4 w: \% N对于手动驱逐时的类似情形,可以把 mds_session_blacklist_on_evict 设置为 false 。
, \( I$ H2 Q% f( Q# Y
# Z7 {' l( z1 I% v# i7 k* |注意,如果禁用了黑名单功能,那么驱逐客户端只会在收到了命令的 MDS 上生效。在一个多活 MDS 系统上,你得向所有活跃的 MDS 守护进程发送驱逐命令。黑名单功能启用时(默认如此),只要把驱逐命令发给一个 MDS 就足够了,因为黑名单会自动扩散到其余守护进程。9 b, g# a' o7 |$ Y1 w: _
: Z+ W+ e' J$ n: V1 P: B/ K3 M2 R9 F
背景: 黑名单和 OSD 元图屏蔽¶
: F# t$ t9 x5 H; |4 S一个客户端被加入黑名单后,有必要确保其它客户端和 MDS 守护进程能收到最新的 OSDMap (新增了这条黑名单的),以免有人再访问那些进了黑名单的客户端访问过的数据对象。
4 u( W8 N, i. ?8 f8 `) r# @7 V1 ?3 {- B/ z% |; Z: {( |# J
这是通过名为 “osdmap epoch barrier” 的内部机制保证的。
$ J& I i H& |& U4 W) v) S5 ?/ g- H h( \9 ]: B6 {% ]) q& b. I( O
此屏蔽的目的是为了确保当我们分配出这些能力后,别的客户端就有可能触碰同样的 RADOS 对象,接受分配能力的客户端们必须有足够新的 OSD 图,这样它们才不会与取消的操作(来自 ENOSPC )或进了黑名单的客户端(来自驱逐过程)竞争。9 l3 j, A7 {3 j: v; {: f
4 V. [/ v. e/ p( U; s K2 X* w1 M更具体些,我们设置元图屏蔽的情形有:( C) b& e& k# F9 e' P2 F% I: _
, o( Q. K' i! l; X客户端驱逐(此客户端被加入黑名单了、且其它客户端必须等到有加黑之后的元图出现才能触碰同一批对象);2 n `# _' ]1 P
) T Y& V' h1 q$ d# g6 M! [客户端正在处理 OSD 图的完整标识(此客户端可能会在快完整的元图中取消一些 OSD 操作,这样其它客户端都必须等着,直到元图完整或周期达到才能触碰同样的对象);
: A; f" s" J* h7 B4 `: E$ E/ ~7 q" l7 [7 H2 j4 F+ V9 Z3 {
MDS 启动,因为我们不会永久存储屏蔽图元,所以必须假设重启后总是需要最新的 OSD 图。
4 Q" w g$ p) j0 s- w3 Q- y+ K# \
+ a9 [* [/ x$ r! H4 {注意,为保持简洁性这是个全局值,其实我们可以做到按每索引节点维护此值,但我们没有这么做,因为:
; G. k f+ T8 u$ H+ n* n; b! y$ A+ P% J, }) z( c6 L/ c
它会复杂得多;
o+ H# a. o/ e/ O: \, A' J4 z/ ?6 j, r4 Q9 v( B! h) t
每索引节点需额外多占 4 字节的内存;2 W, ?- p/ i3 Q4 ~/ n1 l$ o# d
0 J" q Y4 y$ k; x无论如何它都不会比大家一直都拥有最新的 OSD 图更有效。而且,大多数情况下,大家都能轻松地越过这个屏障而不是等着它。# V0 Z1 F/ K) B: d n$ I
" k. ~/ T) Y1 V" { N我们仅在极少数情形下使用这种屏蔽,所以每索引节点这样细粒度的实现带来的好处也很少见。1 B% }5 P8 N: h, h
5 p* L0 z# ^% f0 }8 |. g元图屏蔽随其它能力消息一起传递,并且可指示消息接收器在看到这个 OSD 元图前、别再向那些 OSD 发送 RADOS 操作。主要是面向客户端(它们直接向文件写入数据)的,也适用于 MDS ,因为像文件尺寸探测和文件删除这样的操作都是直接在 MDS 上进行的。! k& a& l7 q2 J, ~& @; T. Z1 X: K
|
|