|
|
探索 kernel RBD map 失败的问题。% j" z5 W% n" a5 r1 }
场景
+ ^, U, B0 P, T; {7 o: r( _搭完 rbd mirror后,想通过client往image里写一些数据,所以在client端map rbd设备,结果失败了。1 G; M" z3 J; n8 v% c) h
rbd mirror的image 需要两个属性:exclusive-lock, journaling
) v j0 C7 L: B+ i" P( X6 _6 V原因
1 M$ j( s3 y8 k+ z5 S查看rbd image info
2 H0 `6 g. a" a& i' a r0 s: R
, \) K6 J3 w8 h2 ] g& X' O, @. \# rbd info rbd/image-1
3 h% T {5 c5 z: B, X3 x& irbd image 'image-1': d# B# w4 k1 C8 H8 x0 X Q3 e; n
size 1024 MB in 256 objects
& m8 K) p# _7 N/ V' ] order 22 (4096 kB objects)0 Z" D9 c9 ?& x9 E& S7 u+ ~
block_name_prefix: rbd_data.108b238e1f29& g6 _$ r. c# {
format: 23 d; Y; F: k$ x5 U% Z2 e
features: exclusive-lock, journaling; p- I" h7 z0 J# [' t3 g6 B$ O1 f
flags:' e- P1 G X, c% c# Z, ^
journal: 108b238e1f29
' ~8 U1 c) c* v, m& ~+ L. J# d mirroring state: enabled
$ I" ^' n. ~, W1 { E" h. w* }* I mirroring global id: c603d9dc-6f8d-49e0-ab68-5944d348e527
$ N2 ]+ H5 ~$ t. p: I* O mirroring primary: true" \4 K ]2 E9 @$ U% K
输出8 v$ u* y; \! f' `) X. } O
& d1 X+ ?) q" ?
# rbd map rbd/image-1
n6 E9 H2 m f& ?5 irbd: sysfs write failed& C2 e% X& S! v' q1 @
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".& s3 ], o) L! ^. l) w7 v
In some cases useful info is found in syslog - try "dmesg | tail" or so.
3 {- ?% d5 @: E' m6 zrbd: map failed: (6) No such device or address, r5 A: P: B- C1 P. K
然后dmesg看一下/ v' v3 t, S* R! e& m
6 o8 S* u5 W- y1 V3 ]# dmesg | tail2 B0 w2 k+ p+ x6 c, p6 v A; w
[ 64.808315] rbd: loaded (major 251)' u; n. d0 L2 q" x
[ 64.818369] libceph: mon2 172.20.2.160:6789 session established
" I# o0 p. s/ k, C* R7 D$ M[ 64.819187] libceph: client14167 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4) g; x K# f" M) A
[ 64.836328] rbd: image image-1: image uses unsupported features: 0x401 Z! V) E& w2 c+ q0 ]! l9 a/ _; B
[ 443.658569] libceph: mon1 172.20.2.161:6789 session established4 i' B1 u' }5 Y
[ 443.659143] libceph: client4313 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
/ k8 t7 t% Q# S2 w[ 443.683178] rbd: rbd0: capacity 10737418240 features 0x1' i. n) A0 L3 ]4 {
[ 978.502132] rbd: image image-1: image uses unsupported features: 0x40
9 A$ C: G0 W6 y: \6 V+ q3 j* y2 h错误原因; {" [) h% e4 ^. T% g, y
image uses unsupported features: 0x40$ U1 G" Z& z6 ?- {+ g) p& V
不支持特性 0x40 = 64,也就是不支持特性 journaling
, \! ~/ q1 f6 l2 J2 U) r/ B关于内核支持的特性分析
. f' x9 H1 {6 O' x# `0 j查看内核版本
: C9 `( B9 z8 E/ [% Q2 A# t
2 l6 f! w6 `3 X |. z$ r# uname -r
2 {/ k8 f+ n' t6 d7 g" b8 Y- S( G3.10.0-327.el7.x86_64* b1 U- O/ ^' m( N' q* P. _" f
根据查阅资料和实践,发现:( c% C& f( `) P$ C3 J, v
CentOS的3.10内核仅支持其中的layering 和 exclusive-lock,其他feature概不支持
) f. h8 S3 T! G( g内核4.6仍然只支持:layering、exclusive-lock和 striping 属性! B' |& C% s6 C t, q# C8 w
# K% G. W( D" t" q' g# rbd info rbd/test-map
% c1 k9 {/ e" E# ~3 Frbd image 'test-map':
! S0 n, P4 Z1 x( A4 f' U size 512 MB in 128 objects' B1 D6 n1 s5 e" C# Z3 J
order 22 (4096 kB objects)
4 @0 K* D0 l" ?. E block_name_prefix: rbd_data.10ca238e1f29
" P" `, \" y/ \7 r* _ B* k o, V' n format: 2
9 o c$ K$ m* H- N* B features: layering, exclusive-lock
7 w7 E& s/ i3 j& w flags:
+ l% i* ^1 }+ y+ U, ~map
+ ^$ |* R6 }% Q* R* w$ ^
+ R6 E: w; b; B/ D7 e0 W# rbd map rbd/test-map
$ W( `' i. m2 s/ j0 x9 Z, Q/dev/rbd1& A" g, `- o8 ]( b7 Q. p4 l+ Z- k/ r
此时可以map成功。
. F( k, e" T, NRBD特性解析3 q- E$ o8 a. q7 v
特性一览表3 ~7 L5 k0 s$ {/ O& ` p5 j- d, j1 }
RBD支持的特性,及具体BIT值的计算如下* @0 ^" R, k2 S3 O
属性 功能 BIT码5 d b& }6 u8 w, s1 L
layering 支持分层 1
5 ~ Q5 U# Z7 }# p g# e' p7 Estriping 支持条带化 v2 2
# _; ?2 i7 ?6 _exclusive-lock 支持独占锁 4
) T! e$ _% I# Nobject-map 支持对象映射(依赖 exclusive-lock ) 8; ]1 T) q. L8 J7 O g. Z
fast-diff 快速计算差异(依赖 object-map ) 16
" j' D8 i7 g% @3 N R4 _1 Mdeep-flatten 支持快照扁平化操作 320 A) X0 V9 ?: y! K" ]$ e/ {
journaling 支持记录 IO 操作(依赖独占锁) 64
9 x2 k \! G5 h; }' g' kceph kraken版本默认属性值
* p- `6 G" m1 T0 }: [1 c3 d
7 g% a9 [( l* c8 h2 R4 {# ceph --show-config|grep rbd|grep features2 C4 _* e' e3 y7 }
rbd_default_features = 612 ?: J5 R! f' ~6 s8 C/ d
为啥是61?我们创建一个默认配置的rbd看看
$ F- [& J9 x( l5 Z: r4 h! d) T1 a+ F' L
# rbd create test-feature --size 64) I3 P- b' D; z/ I1 M. E+ x
# rbd info rbd/test-feature
3 t- q! K7 I' [4 J8 b: C3 l; Irbd image 'test-feature':
/ E) P# j& c6 g% A* a5 ^( b size 65536 kB in 16 objects2 j3 C1 b. F. @- Y8 R0 O3 n
order 22 (4096 kB objects)( r2 X5 N! e. g6 L6 x3 q
block_name_prefix: rbd_data.107d238e1f293 n6 [8 l" ^4 B( |
format: 2
, j# v: B' N9 b y6 z features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
) S/ P1 r: M. E* [/ n4 v flags:& n7 m9 O. L0 q4 R1 X
1+4+8+16+32 = 61
2 _% _% c$ t! J2 j9 u9 T' A5 p$ ^& s. y就是说除了特性:striping 和 journaling 外都开启了。
) {' O+ b8 \3 x) y4 l5 ~9 @控制属性8 p( }0 s! V. i! @+ E- l* r* T1 n/ d. _
有三种方法来开启需要的特性% ~; ~! y7 S+ C+ K; U0 \6 q7 _
1、在创建image时,通过 --image-feature 来指定需要开启的特性. n! Z# k; b7 B- t
2、对已存在的image可以通过如下命令开启和关闭
( P8 Q. y+ w k' T1" p- ], x) _& D3 x" u# g
2
v- ~9 N ]/ m( S/ |: srbd feature enable <pool-name>/<image-name> <feature-name>$ U0 g" q. \- b6 ~5 M7 ?# z
rbd feature disable <pool-name>/<image-name> <feature-name>
9 l ^# a. u% ^' y3、当然,每次通过enable和disable来不是很便捷,可以通过修改配置文件来解决$ @% H9 L) i" W! C
16 i* U& b6 \ ~# k5 Q+ o+ m$ i
28 I( P& p* z; u9 b+ `) f( q
3) c( Y1 T7 s0 v5 y" |( _2 O
4
$ K% L% Y+ b4 w% L7 x* Mvim /etc/ceph/ceph.conf
o, ^( z6 U/ L. S" @5 A...
7 m! s B- S6 d! v5 l% S/ t. xrbd_default_features = 1
: k# |( s' Q ]( Q" {$ J...' b* z5 O; F! J' O2 c( z
具体该设为多少可以通过上面BIT值查表计算得出。
: p N m' O* O; X5 w" G |
|