|
|
探索 kernel RBD map 失败的问题。
# A" f+ U5 }1 {场景
4 R# |8 J, m7 ]9 `, v c搭完 rbd mirror后,想通过client往image里写一些数据,所以在client端map rbd设备,结果失败了。
( J! o7 u7 x$ s. k d3 V3 |3 Crbd mirror的image 需要两个属性:exclusive-lock, journaling
t( s! C0 M: q7 k9 \ z原因
, w. g2 e& V2 m: E' i2 _. p' l4 H* \+ U查看rbd image info
6 E9 o4 C+ h }6 x
) T% G$ M5 g! V* E# O3 F# rbd info rbd/image-1
7 M" R" x. a A1 c; U" A7 erbd image 'image-1':+ E( @; g" z, W0 w
size 1024 MB in 256 objects
! P/ F; Q& `& Q L2 [ order 22 (4096 kB objects)
3 g' q3 C/ h' V; y! S* }; w6 }% x block_name_prefix: rbd_data.108b238e1f29' z S, d/ j9 `
format: 2
# o" a* { B9 E* I% e! U! S4 W# D; e features: exclusive-lock, journaling
* P$ q% r# B0 Y- z" O0 b0 b8 A flags:. S- |+ \ k+ q) C
journal: 108b238e1f292 f; z3 V- }; w- u8 Q6 N6 b% ]
mirroring state: enabled1 g* j2 h+ {/ U. P/ g5 X5 }" B: t
mirroring global id: c603d9dc-6f8d-49e0-ab68-5944d348e527
- h7 j6 C7 f* d( g mirroring primary: true
$ @8 w4 {* p: h0 I输出$ M5 w! `. O4 l9 W7 e* u
6 m6 r# O1 N0 F9 ~; {9 P
# rbd map rbd/image-1) H' `8 D$ \7 ?% q
rbd: sysfs write failed% N$ j& P3 ~: s {; ?" n
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
; z+ E, r9 y. I q( F6 t5 JIn some cases useful info is found in syslog - try "dmesg | tail" or so.9 K4 f* k% |" f! P3 j5 d
rbd: map failed: (6) No such device or address5 l2 q C: h. G( K( K3 `1 k3 E1 R$ z
然后dmesg看一下3 C7 u9 V+ j& h+ b; d
- {2 }2 K' i* t7 F5 y" s) V
# dmesg | tail
8 W. r0 O9 f* I; _9 K8 Q* Y1 u[ 64.808315] rbd: loaded (major 251)) Z L: O+ C2 ^0 H- j2 F
[ 64.818369] libceph: mon2 172.20.2.160:6789 session established( O G" H/ f: ~ N/ @. T
[ 64.819187] libceph: client14167 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
0 }3 h8 F1 ^0 d1 `[ 64.836328] rbd: image image-1: image uses unsupported features: 0x405 b/ P' ]: P7 k1 H) S ]. B
[ 443.658569] libceph: mon1 172.20.2.161:6789 session established* t, l# H& O! i
[ 443.659143] libceph: client4313 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4, c& W: N: d+ O+ K' E3 E% V: ~
[ 443.683178] rbd: rbd0: capacity 10737418240 features 0x1
; U6 c7 {& h# l. Y6 M' D# t) o9 l[ 978.502132] rbd: image image-1: image uses unsupported features: 0x40
( C1 a; E. x8 N3 t( _. @2 F错误原因, X3 i+ [9 H( d
image uses unsupported features: 0x40
# R" _9 F/ W. V8 c! b不支持特性 0x40 = 64,也就是不支持特性 journaling
, x7 N9 V* g6 y$ F0 U1 }$ W关于内核支持的特性分析
1 P& @, s, I! s0 T1 L' |查看内核版本9 L1 {- O8 B6 e/ L$ T- q
8 a/ o+ l- U+ ^# uname -r
0 r/ o( @$ w7 c3.10.0-327.el7.x86_64' G9 F! O4 Y9 e
根据查阅资料和实践,发现:
# _. @7 f7 w$ A# `CentOS的3.10内核仅支持其中的layering 和 exclusive-lock,其他feature概不支持
. J% N( w/ r! {( B+ q6 v# A内核4.6仍然只支持:layering、exclusive-lock和 striping 属性& ^1 d. |7 W# }* A. p
( |6 R: ^' a6 L" I8 l( k4 \
# rbd info rbd/test-map
7 m" p$ J5 N; L6 [rbd image 'test-map':
! o' G& ]- p, t/ v6 O size 512 MB in 128 objects" @: O, W. x6 C
order 22 (4096 kB objects)9 f! v% R( u, _, V# I
block_name_prefix: rbd_data.10ca238e1f29
% M$ g) e$ F, U# G1 { format: 2& f" L ?2 _1 Z4 {
features: layering, exclusive-lock5 c$ C" a, X/ c, o/ s- _7 k
flags:8 b- t- X" P/ L+ G% |# o
map, H. [8 I2 d8 _/ T9 a
0 K4 v$ E5 ^6 k$ c# rbd map rbd/test-map, T$ u+ ?& p# \% J* Z
/dev/rbd1
/ X- R5 P) J9 I4 n# E2 E* i此时可以map成功。4 D0 o9 u, R( d# }
RBD特性解析
1 q& w! z" E' O1 V" K特性一览表$ f7 X; k! z! x! @7 w }
RBD支持的特性,及具体BIT值的计算如下
6 T% j! G' v, o) C属性 功能 BIT码5 R/ R1 [3 _% I% a9 B3 T
layering 支持分层 1/ E5 s4 ]4 l2 h9 ~8 M8 X
striping 支持条带化 v2 2' h' n6 ^* B* N
exclusive-lock 支持独占锁 4
4 M' B4 Y' g' Kobject-map 支持对象映射(依赖 exclusive-lock ) 8
; i$ L2 A- v. d0 X# K* I+ S3 ufast-diff 快速计算差异(依赖 object-map ) 16
( Q2 G; I) E, C; g* u$ Ddeep-flatten 支持快照扁平化操作 32
6 Y: W' T; Z- _6 Ijournaling 支持记录 IO 操作(依赖独占锁) 64
7 U! ^/ m3 _) y& F! q6 o" `ceph kraken版本默认属性值
% p8 t- f7 m) [$ t" s4 K- \1 g$ I, c8 E2 }
# ceph --show-config|grep rbd|grep features* S6 D" e: k% p* `0 Q( Y/ B
rbd_default_features = 61* V; e! Q+ J7 N; o0 K2 v8 ]' `
为啥是61?我们创建一个默认配置的rbd看看
$ o, c& s- C) y3 O( o3 N& d' C+ g5 t$ J5 t/ W
# rbd create test-feature --size 64* N( y( `; ?9 T0 v7 k
# rbd info rbd/test-feature
5 @" \8 D( x7 d% P4 ]' R+ urbd image 'test-feature':4 S% b: X5 f5 b/ I5 ?
size 65536 kB in 16 objects4 Z( U2 I4 n: ^6 Q3 s
order 22 (4096 kB objects)( d R' z3 O/ [8 a. Z. [, O4 V
block_name_prefix: rbd_data.107d238e1f29& @- l7 R/ m' [) y) Q' z% O
format: 2
+ V* S; t4 |1 L! H4 u9 D features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
6 I' `; D' t9 v( J& a flags:
2 S5 v' q( U- L3 l" K, ^1+4+8+16+32 = 613 \" k# U: f) A
就是说除了特性:striping 和 journaling 外都开启了。' \' a& t; c# o3 f! c
控制属性9 b; h# w- I6 F4 E
有三种方法来开启需要的特性
9 A+ \# F$ K2 U# l4 Z1、在创建image时,通过 --image-feature 来指定需要开启的特性
$ n* A: y8 g! w: O" E8 ~" L2、对已存在的image可以通过如下命令开启和关闭6 N9 Q% U) Y4 J$ P
1
$ N9 _" R) v9 }0 F. Y4 [2 c% q3 i$ p2 k2
4 f8 J/ a2 t" j" s; Qrbd feature enable <pool-name>/<image-name> <feature-name>
q0 ^0 J t& O: I( Zrbd feature disable <pool-name>/<image-name> <feature-name>
" F* r( v, \' t& u5 R; y6 j+ Z, O3、当然,每次通过enable和disable来不是很便捷,可以通过修改配置文件来解决8 b- v6 y* r' [) \7 Z
12 o1 H+ t& }9 R: e: ^
2
6 k# S* K1 { e- U6 e5 D3 u3
" C: \2 h F0 b' C1 B* s4+ w! m- E% O' g0 u
vim /etc/ceph/ceph.conf: q `7 y$ n1 G
...
9 g" R* B! e/ g. Y# @rbd_default_features = 15 D9 N" g% B& [! [
..." M7 @+ d8 w( N7 r# T0 {! O" h: h
具体该设为多少可以通过上面BIT值查表计算得出。
0 D* Z& Y- f; J) j, {" C |
|