|
|
1、 处理故障的pg
: e) G I$ R9 h9 d/ q7 F( {' }从ceph的状态中,可以看到,有一部分的pg处于stale/down/peering等状态,这部分异常的pg不能提供对外提供服务,影响了业务的可用性,通过ceph health detail找到这部分异常的pg,发现其中有一些pg的upset中都没有映射到osd,或者三副本只选出来2个osd,没有选出来第3个osd,下面是当时故障的pg的状态:# a- V& S- s, ~
H: |$ }5 Y" s5 e3 K
5 K0 {2 o; W: y+ r
% [# L. o% n: s4 A7 C* F
这个现象很有可能是权重不平衡导致的,关于权重在0.94.7版本的ceph中,有两个参数,一个是weight,一个是reweight,weight会参与crush算法,计算出要落位osd,然后reweight是在此基础上再去决定是否选择此osd,但是reweight不会参与crush算法,crush算法本质上是一个概率算法,因此当权重相差悬殊的时候,很有可能选不出来osd,客户环境中部分osd的reweight设置成了0.09,有将近一半的osd都将reweight设置成了小于1的值,这就有可能导致pg出现异常,从而选不出osd。因此尝试将故障pg对应的osd的reweight重置为1:
& `+ R+ p/ d# U, F7 e, K$ v# U7 _% q( t" S+ x% o
( p& p/ x3 G; S" A
ceph health detail | grep stale
! u( R" n, ~: @4 F5 e) B0 B* u" {ceph pg <pgid> query2 k8 }* |0 e" Z9 S/ c
ceph osd reweight <id> 1* Q/ t% c: f9 p5 s
置为1之后,观察到该pg重新映射出了osd,并且消除了stale状态,恢复了服务。因为reweight的不确定性,我们调整权重,一般不调整reweight,让它始终保持为1,在L版之前的ceph中,需要通过调整weight值进行数据平衡,L版之后新增了weight-set功能,可以更有效的去平衡数据。
6 o# G' h5 a0 g8 e5 E. p; }
' Q7 R) x5 \/ p0 H此时,可以将所有reweight不为1的osd重置为1:
: P2 \4 \8 H) T1 d
x/ z2 P- \2 q+ J; h$ b3 Z" Z% q. n F: O
for i in `cat reweight_osds.txt`; do setsid ceph osd reweight $i 1; done
4 q3 Z; [4 S5 F) s重置为1之后,stale的pg全部恢复了正常,业务也恢复了正常。
+ C# ~9 x. k n7 Z. v; A0 c2 r$ t5 a# M
2. 数据重平衡) v, X9 {4 j. b) w ]2 f+ E5 n
后续需要做的操作就是继续平衡数据,但是要保持各个osd-domain的权重值大小一致,然后可以微调osd的weight值,将一个osd-domain中高使用率的调低,同时也要将另一个osd-domain中低使用率的调高,平衡数据,直到各个osd的使用率趋于均衡。
0 d n n0 f1 r7 r
4 _$ j* E$ f' \2 v/ U/ M) s0 f5 }3. 恢复mon服务$ E! h/ n+ D/ T! ^8 `/ a/ @
等待数据平衡完成之后,压缩61 62的mon服务,然后启动,再将63加进集群。6 ]- x$ Y. w- |6 i9 V2 K, G
" [/ V6 y2 O/ @3 b
至此故障处理完成,所以最终总结一下,引起该故障的本质原因,在于调整数据均衡的方式不对,权重调整的幅度过于大,不同osd之间的权重相差悬殊,导致pg出现了问题,进而引发了后续的一系列问题。因此,关于权重值需要关注以下几点:
3 R0 P/ ~/ n; p- Y# Z, G7 o# O0 h/ v d& _2 {' [
保持各个bucket的故障域的权重是相等的,bucket里面的osd权重值可以不一致,但是osd上的权重值得保持相等,扩容/缩容,都需要考虑这个问题
& I8 _& ^- \0 Rweight不要设置过大与过小,需要跟它的实际容量保持一致* T! @4 i: U& `% [1 w: Q8 N7 k
尽量不调整reweight值,即使调整,也是微调; Y0 C% f8 d% Y7 r; H$ Y
) @" k- b. t: S/ x7 u7 }
|
|