|
|
RBD Mirror
9 X& j! U4 Y2 Q% T& b
; n6 B4 |4 u; k2 [/ U7 q7 M红帽 Ceph 存储支持两个存储集群之间的RBD mirror功能。这样,您可以将 RBD 从一个红帽 Ceph 存储集群自动复制到另一个远程集群。这种机制会利用异步方式,通过网络来镜像来源(主要)RBD 镜像和目标(次要)RBD 镜像。如果包含主要 RBD 镜像的集群变得不可用,您可以故障转移到远程集群的次要 RBD 镜像,并且重新启动使用它的应用。
% Q$ m# ~& [8 @. I. E5 ?- r( `/ ?2 q" P: B
从来源 RBD 镜像故障转移到镜像的 RBD 镜像时,您必须降级来源 RBD 镜像并升级目标 RBD 镜像。当镜像被降级后,它变为锁定且不可用的状态。当镜像被升级后,它变为可用状态,可以在读写模式中访问。
. S' [3 F# S- E% v' u4 I2 i+ l9 O/ z! w# g
RBD 镜像功能要求 rbd-mirror 软件包。该软件包需要安装到能够通过网络访问从属于镜像关系的两个集群的服务器上,而且每个红帽 Ceph 存储集群必须至少配置一个镜像代理。
- H0 u7 R; M$ G, \% R$ h* H
* u' H1 S! S0 P$ h+ W# } d您可以使用 ceph-ansible 软件包中的 Ansible Playbook 部署 RBD 镜像功能。您需要将应该运行 RBD 镜像代理的主机的名称添加到清单文件中的 rbd-mirrors 主机组,并且配置 group_vars/rbd-mirrors.yml 组变量文件。
' o2 }# M5 g5 T% C0 N# g: b$ R" ]3 t8 T4 r6 n$ f
RBD 镜像功能需要参与复制流程的所有 RBD 镜像启用 journalling 功能。这需要 RBD 镜像格式 2,红帽 Ceph 存储 2.0 及更高版本支持这种格式。
: ]7 Z9 e6 q6 I( G9 B
* T( S# N2 E1 x6 l0 P! I! F" @ P4 E8 ?
" U, e" a/ W2 w" J访问被镜像的 RBD 镜像的客户端也需要支持这一功能。因此,使用 krbd 客户端访问的 RBD 镜像不能使用 RBD mirror功能。
& V- Z. x; h! ^+ o% \. x T$ T. `# A+ E
% s' g' y! O1 V0 s! p+ `7 [; e* }$ `9 k0 { D! @) a( y, L
6 e) e$ }$ p8 a- M+ b受支持的镜像配置
: _ @' B) g1 b0 P) Q
C' ~7 I6 V6 HRBD 镜像功能支持两种配置:' s( [1 f$ V7 {$ }
. L5 e$ f0 E7 O. N单向镜像或主动-被动
, \8 D+ R! b) ]7 P1 I( C$ n- K
双向镜像或主动-主动* h f7 F& z( k& i, z* c( s: i. v: v% Z% [
! K' B' C; j* z7 E: n# f" S- I
在单向模式中,一个集群的 RBD 镜像可以读写模式访问,远程集群中仅包含镜像。镜像代理仅在远程集群上运行。这种模式可以支持配置多个次要集群。/ [; J6 t# \- g3 Z
}8 k% V+ m& T! V# |; J' r
在双向模式中,来源与目标对(主要与次要)进行了同步。每种类型都可以在镜像关系的任一集群中运行。此模式仅允许在两个集群之间进行复制,而且必须在每个集群上配置镜像代理。
/ t$ M- @7 \$ W' n" i0 G
+ z9 `! E( ^) g受支持的镜像模式1 p8 i; l7 A! ^( ]/ S# o
/ P& m! }( u6 y7 |9 `9 i, F+ n
RBD 镜像功能可以配置为:. d# ?8 M1 l) i( U- s
) B7 w* w; Z. W4 d f5 Z8 l
池模式7 i6 Z( G. S7 e- [6 [
$ i) c) N" e1 `9 |" f+ \' ?
镜像模式
# `! ^4 R" \& u' T* J; e* Y5 y. L+ D r5 k% V* `8 J4 o
在池模式中,自动为被镜像池中创建的每一个 RBD 镜像启用镜像功能。当来源集群上的池中创建了镜像时,远程集群中会自动创建次要镜像。/ A' s5 o5 N5 I% ?% O* }; E4 Z, n+ Q
: ]+ R6 B7 f3 y
在镜像模式中,必须逐一为各个 RBD 镜像启用镜像功能。在这种模式中,您必须显式选择要在两个集群之间复制的 RBD 镜像。
x n3 d1 R5 G. M5 W" ~1 v( f) C. P! J+ Y& U% p( U7 W
; H* p3 v/ l& ?$ q" q0 F* k9 D: s4 _# |
- K w3 v) U& F& O4 P- Z
# r8 W# A T s) U! H* Z2 B3 O5 Y5 H1 a, F0 w; ^) w3 Y$ k
' v% r7 f" U. H* l8 n# i* Z
配置 RBD 镜像功能! R1 ?9 q3 p; |0 e3 U
' J# j8 o) P+ E, I/ D+ j在配置 RBD 镜像功能时,您需要在各个集群上配置节点,使其含有两个集群的配置文件。通常,集群节点仅配置关于其自己集群的信息,默认称为 ceph,而这个集群的配置文件则称为 /etc/ceph/ceph.conf。 r5 y9 t [" Y2 T) x, I- o* E
6 D. J1 r; C) a# R; A5 B2 Q8 L( F
例如,您可以将生产集群命名为 prod,远程备用集群命名为 backup。您需要将 prod 集群的 /etc/ceph/ceph.conf 文件重命名为 /etc/ceph/prod.conf,并将它复制到两个集群的所有节点。类似地,您需要将 backup 集群的 /etc/ceph/ceph.conf 文件重命名为 /etc/ceph/backup.conf,并将它复制到两个集群的所有节点。如果您的集群配置了非默认名称,请记得其配置文件将不再是 /etc/ceph/ceph.conf。! H3 P- `: Y3 G3 @. b/ s" s. Q
! y% \5 J" E$ e4 d$ Q r/ u# a
% t' s& d, H; s$ d; f2 c4 ^! X" W. D' K1 I8 i
# S1 p4 n: U& C; q' K9 j+ B9 b4 J7 P1 Z5 o7 t% g: q
逐步配置 RBD mirror7 N t2 |" Q, d8 N5 f, d [. o
" A6 n, k' O/ X
下表概述了在 prod 和 backup 这两个集群之间配置镜像功能所需的步骤:
# V+ ?" s( e# I) q/ S! n9 Q# f7 Y( x1 L( M1 [8 `, f/ q
1.在 prod 集群上的 /etc/sysconfig/ceph 文件中修改 CLUSTER 参数,使其匹配 CLUSTER=prod。
5 ?6 ~! ]) K7 |% N7 D! ^" v
# y; k) V$ @# ^! l3 ?" }4 g在 backup 集群上的 /etc/sysconfig/ceph 文件中修改 CLUSTER 参数,使其匹配 CLUSTER=backup。 Y; p8 i% J h" D% m) D
6 v6 _' z" r# g* V2.将 /etc/ceph/ceph.conf 文件从 prod 集群复制到 backup 集群,存为 /etc/ceph/prod.conf。6 ]! O1 z8 }# Q! K. w
) w8 w' b! r4 l% H5 D) _ n& p
将 /etc/ceph/ceph.conf 文件从 backup 集群复制到 prod 集群,存为 /etc/ceph/backup.conf。
8 b% s- @7 ~. J& U: A
# a" M O Q7 i3 Y$ j' |3.在 prod 集群上,创建专用于 RBD 镜像功能的 cephx 用户,并为其配置对需要镜像的池的访问权限。 a0 f+ P/ Z: S
, F3 b8 r( f- s, ?. [仅双向模式:在 backup 集群上,创建专用于 RBD 镜像功能的 cephx 用户,并为其配置对需要镜像的池的访问权限。
5 M6 w& I6 z! g4 i: C/ A# n' l$ ^0 H( ^* Y( @" L6 j* @
4.复制 prod 集群的用户的 keyring(/etc/ceph/ceph.client.mirror.keyring 复制到 backup 集群,存为 /etc/ceph/prod.client.mirror.keyring)。
$ v; W! K1 F0 `' k* O& t5 f E& d/ W( p" D, O. h% D
仅双向模式:复制 backup 集群的用户的 keyring(/etc/ceph/ceph.client.mirror.keyring 复制到 prod 集群,存为 /etc/ceph/backup.client.mirror.keyring)。& d' y( |( a6 n& \. K: ?7 z
* P9 v h* n* }* ]; g: d! E
5.在 backup 集群上安装 rbd-mirror 软件包。9 I U" H' X: t) M L
7 `/ V8 |% L5 q) ?* D, b$ G4 B仅双向模式:在 prod 集群上安装 rbd-mirror 软件包。
7 u) r, S, |8 l/ I5 x
! `4 V$ ?' j/ c6 [& \! r6.在 backup 集群上,配置、启用并启动 rbd-mirror 服务。
" C% H" }1 R$ p+ F6 |) ~7 i. u1 [2 u t. _7 x, l7 R
仅双向模式:在 prod 集群上,配置、启用并启动 rbd-mirror 服务。$ Q" z$ r& u9 [% F
" h, q( C: [$ }3 S0 C
7.在两个集群上,为所需的池启用 pool 或 image 模式的 RBD 镜像功能。
6 I' _ Y; q% h! R% e; m9 p# Y! l( ^
8.在 backup 集群上,将 prod 集群添加为对等集群。3 T' f; ^% k- H) e- s/ C/ h6 U
9 g7 e( J3 @7 M( [仅双向模式:在 prod 集群上,将 backup 集群添加为对等集群。0 a* Y7 J, [! E1 j' o. e$ |& C- f
) Z4 L0 d1 u/ ^ a$ ]) @& S- F
% o* q# p* ]0 C& k: j! u I( N0 ?& y0 j, e- [! E5 l; Z4 Q% i* w& N
如果配置单向 RBD 镜像功能,您不需要将配置和 keyring 文件从生产集群复制到远程集群。不过,它可以更轻松地管理被镜像的配置,因为在这之后,您可以从两个集群运行以任一集群为目标的命令。3 ^# R" _! i$ `' h
7 Z4 T. c0 w' O, p6 g( J. a
. _# C2 n) ?2 d4 @: e2 R& H& u$ T% p$ p
单向池模式示例分步说明
: |) e3 Y6 ~% e. K. E9 E! T2 _- R1 k$ x: k4 V
本例中有两个集群 prod 和 bup,已更新了其中的 /etc/sysconfig/ceph 文件,也交叉复制了 Ceph 配置和 keyring 文件。由于这是测试,本例中将 client.admin 用于各个集群,而要镜像的是默认池 rbd。在开始这个过程之前,每个集群中必须存在用于存储 RBD 镜像的池的名称并且名称完全相同。5 j3 \ L4 V* {8 Q1 Y
. U0 [; o& V ^4 r% y* P B+ Y
[ceph@server ~]$ yum -y install rbd-mirror \" D; o4 v6 m2 a
[ceph@server ~]$ systemctl enable ceph-rbd-mirror.target
. W+ y- S; `" K$ D! A[ceph@server ~]$ systemctl enable ceph-rbd-mirror@admin.service- {: `6 n; G( t3 |: c2 T
[ceph@server ~]$ systemctl start ceph-rbd-mirror@admin.service
# k# V( G7 G& S" B( ^' b1 c# Z[ceph@server ~]$ rbd mirror pool enable rbd pool --cluster bup# c$ w( a U+ F0 R6 x
[ceph@server ~]$ rbd mirror pool enable rbd pool --cluster prod* z0 K/ W. z- s4 N3 ^* |, Z" {) |
[ceph@server ~]$ rbd mirror pool status rbd --cluster bup
5 r7 x* F/ W2 O5 i4 T5 F. R: chealth: OK
9 }) [$ V! X+ s4 g+ oimages: 0 total1 q- q- C( W' i) q
[ceph@server ~]$ rbd mirror pool status rbd --cluster prod
* c4 l! A- u4 U% Vhealth: OK
) t7 u( h& v$ z. r ?5 d' Vimages: 0 total: u$ X0 m! i' {+ E
[ceph@server ~]$ rbd mirror pool info rbd --cluster bup3 y6 X+ R { ?7 i0 c% k- Z8 ], l
Mode: pool
# c% Q$ B% a! q& s2 LPeers: none
; {+ l" }# a$ l1 b[ceph@server ~]$ rbd mirror pool info rbd --cluster prod2 ~2 W- a- q% I" M2 o0 T, u4 O# x4 _
Mode: pool
4 C, F% d/ @4 y, a* \1 Q1 J/ @Peers: none
/ e, K l! J; |[ceph@server ~]$ rbd mirror pool peer add rbd client.admin@prod --cluster bup
6 i1 Q0 v5 r# w; P, s9 g8 u0 }; L" B2ece79b9-34b7-42fe-add1-ea9d6a10deb7
( S8 H& \- c9 @[ceph@server ~]$ rbd mirror pool status rbd --cluster bup, S( |" |# } m( q4 O- n/ _( Y
Mode: pool# Z% l" d2 K+ s- F( U; B/ w
Peers:
0 \- }) y, ~6 }: X! g UUID: NAME CLIENT/ q6 b% O( a# U% ?3 T
2ece79b9-34b7-42fe-add1-ea9d6a10deb7 prod client.admin" ^2 ?0 r! Q6 D( T$ l0 a
[ceph@server ~]$ rbd mirror pool status rbd --cluster prod
/ s+ o5 k# g2 SMode: pool7 `% j% V' \+ v! }
Peers: none. b1 I9 D# R5 M) y2 M3 w& v( D b
[ceph@server ~]$ rbd create rbd/prod1 --size=128M \
2 g, A+ d! ^0 b7 o# c$ k> --image-feature=exclusive-lock,journaling --cluster prod. G/ ]8 }! t! F. E3 M
[ceph@server ~]$ rbd -p rbd ls --cluster prod
6 Y( ?- k+ D* z/ S$ r7 yprod15 R' I3 h+ J* E: |; T& O0 j6 O
[ceph@server ~]$ rbd -p rbd ls --cluster bup
+ p' V6 }; {6 d' L# \ I* w* {prod1
6 c) L# x0 d: ]0 y, U; ~( X$ b7 G0 t; n; q# ~
: [) Y, S( R1 f p; u: G6 l
[ceph@server ~]$ rbd image status rbd/prod1 --cluster prod
9 f" e, p, K8 Zprod1:
5 k% O" u' N' n$ O( B4 u" j3 C global_id: b15a1331-d935-4fc1-b6b3-c5e8e4518a5e
6 z# L, O; v' Z+ a state: down+unknown$ M2 j0 [0 G& Y# z6 O8 {$ c
description: status not found
$ d, j3 G8 T8 a$ b; d8 W% U8 u. O last_update: 1969-12-31 16:00:00
( ~7 ^$ R) }0 U9 ^3 Y7 X* q& ~4 R[ceph@server ~]$ rbd image status rbd/prod1 --cluster bup8 x: o0 `5 N. r0 P! q! i7 p( T
prod1:
; m# e) S. Z/ T! _2 T global_id: b15a1331-d935-4fc1-b6b3-c5e8e4518a5e8 X3 p& l1 O! O# m: [) \
state: up+replaying$ K& E. {/ O+ Z; V4 k, {6 P( V2 }
description: replaying, master_position=[object_number=3, tag_tid=1, entry_tid=3], mirror_position=[object_number=3, tag_tid=1, entry_tid=3], entries_behind_master=0
; C* A) O5 D8 H5 z* a! Z" I. [. j: a last_update: 2017-06-22 15:08:21! _! w& T. j* R0 C
) n$ \5 v1 {4 F8 ^: K4 V
在单向模式中,来源集群不知道复制的状态。只有 RBD 镜像代理(在目标集群中)才会更新状态信息。
1 E7 K* x5 R3 q9 }3 w' M( ^5 X% }- g' W
如果使用单向镜像功能,那么在故障转移到次要镜像后,没有办法自动故障恢复到原始的主要 RBD 镜像。这是因为,生产集群上没有运行 RBD 镜像代理。简化这一过程的唯一办法是使用双向镜像模式。
( z! j% }9 A5 f% g3 L! f1 }' V) G% D2 ^5 G7 X* ]! i
故障转移过程
3 n6 N2 Q6 M9 r7 z; B* b& c9 J
% i/ U/ r7 a3 k. [- o如果主要 RBD 镜像变得不可用,您可以使用下列步骤来启用对次要 RBD 镜像的访问:/ Q* }" e F2 ^5 m9 V, b
% O) j# J# f/ c* d停止访问主要 RBD 镜像。也就是说,停止使用该镜像的所有应用和虚拟机。
( U9 ]; o0 }- n) N6 m) b3 Z' X" g- S6 l/ W: c2 ~. M( o
使用 rbd mirror image demote pool-name/image-name 命令来降级主要 RBD 镜像。
: l2 K, E0 B! d; v" a i# Y& ?6 i; Z5 }3 o0 d( c0 c/ |( y) I
使用 rbd mirror image promote pool-name/image-name 命令来升级次要 RBD 镜像。. l2 e( m2 K3 J4 |& \
% G7 |$ {+ D/ N5 P' V恢复访问 RBD 镜像。重新启动应用和虚拟机。& V6 M. t, |% v: r) ^, q
- }. i0 b3 ~& M' j: A, V1 E- r8 w. \6 KRBD 镜像功能命令参考
8 n9 `: k/ L, n& k8 S红帽 Ceph 存储支持使用 rbd 命令进行 RBD 镜像:
5 {. U! j/ i$ B) P/ j" |$ v1 C2 O
RBD 镜像功能命令1 P& |! T2 h) c! \8 M
3 M2 k9 _% i. r( @7 A& k启用 RBD 镜像功能
6 O Z1 }! f) ~; c9 ^$ b1 a1 o3 k" H5 N+ e
rbd mirror pool enable pool-name mirror-mode
7 o# p4 p5 E# k( U- a) }, @! p. Z, [ Y7 U( s
禁用 RBD 镜像功能
/ i0 u& k8 d( `1 \3 m X6 q D1 j1 O& O3 D' c0 J* V( x* e
rbd mirror pool disable pool-name
) ?! j# m; ~' L* ?4 j. o9 u! j3 V& Y+ n. m7 `. D, J
添加对等集群7 w; h( ]7 e. N; m/ W
; `; i+ t0 q+ K# ~% x) M% D4 g
rbd mirror pool peer add pool-name client-name@cluster-name, e! o: \5 c0 c) K) Q
/ p* S2 y* H0 R: ^+ ^& G$ m
显示镜像信息3 o4 E' D% G! |. R v
5 E! R: K2 A/ `; H& }4 Rrbd mirror pool info pool-name
/ O# J d c& s1 ~
9 e; K6 c. K+ K/ [& { m* P: Z6 m删除对等集群* a! t0 h* W! O: ~" u
) y! ^! k, ~. n* n
rbd mirror pool peer remove pool-name peer-uuid* \" \9 }9 t% `2 R) r7 t% a6 b
+ |- W% g* g) ?# K; e! _
启用某项功能
4 D7 r/ q% E1 d# o5 {1 h9 z, s% q+ H
rbd feature enable pool-name/image-name feature-name# e m: o/ d; F5 W& ^& J, P, C
6 D! V- K3 ~# A
禁用某项功能5 Y2 h% o& F2 Q$ P
9 t2 R( ?3 W! O# mrbd feature disable pool-name/image-name feature-name
# H& i) W, i1 v2 c$ i, p' G
5 b! V7 W1 X/ C/ F0 P2 l2 q启用 RBD 镜像的镜像功能(镜像模式)
0 p- x+ c W v" u" z6 X9 _, O2 n1 B. Y7 _
rbd mirror image enable pool-name/image-name
8 G. `; K" T# }' T5 r0 g( [4 i) Z6 k# j. T, d
禁用 RBD 镜像的镜像功能(镜像模式)
( t& G) j, y8 q: h/ a# d( j! @! U5 i& S) z
rbd mirror image disable pool-name/image-name
7 f3 b+ j; M2 n8 g
1 m) D6 X: \6 R, Z& \7 A" i降级主要副本
1 ^. s" v6 q- x; Z- R& o F$ w. ^2 a5 C7 q
rbd mirror image demote pool-name/image-name
2 y, b2 t# c5 o% ]+ M: L8 B: p6 n1 Z4 `7 p1 U$ F
降级池中的所有主要副本
4 P `. f ^9 D$ J
! w7 t+ K& n! n$ I [8 y+ H: S: J3 Xrbd mirror pool demote pool-name
' x! H+ W) N# a' u' M7 Y5 p3 t1 w' _: X. `2 ]# K
升级次要副本: O3 T _8 o( s- ^
( ^8 s- E9 p* C' B0 `5 X) h
rbd mirror image promote pool-name/image-name% `) g' Z6 k/ H0 Z* a
( U8 f! G1 n, {& W; l: R* O! N
升级池中的所有次要副本( E3 g' a* f" I* n* z, N1 z, ^
k+ k+ X* b3 q. A: E+ H
rbd mirror pool promote pool-name& f, u6 c" _8 W& Y
7 x! V8 J, L, y. v2 {- b5 r9 m强制重新同步
/ s# U8 k9 }# g# c5 w' U" g: W6 i. ]+ g/ r( \, H. }
rbd mirror image resync pool-name/image-name
+ R! c6 K" T/ \, v7 q! V
7 `2 V/ ]9 K$ |$ E) \. VRBD 镜像的镜像状态
& ~2 z5 \; n" l" Y$ M8 w1 `! Y0 z( p$ {0 w( c5 r# H) B" m k" o
rbd mirror image status pool-name/image-name# e& y0 D6 s; }9 h: v; v
# R# ~0 z6 b: U& b6 F8 Z% n0 g
池的镜像状态
, }% R8 K9 \( A5 R: A, x# k# n) z: r8 Y+ U ]
rbd mirror pool status pool-name9 [- j0 D+ _ [; b5 E) E/ e
; V6 K3 u( H! e0 a# c7 N5 z
RBD 镜像日志命令5 t- G% Z& _, }, K8 ?
2 Y' J; n- _# E W% U, prbd journal info pool-name/image-name9 o# p( E: k; x+ l
5 S/ L4 ^. j) n1 b3 r" `rbd journal status pool-name/image-name
( r( } l9 r% p. o) k6 a, O0 i z( \( M% v8 x
RBD 镜像日志检查0 B1 D' J/ K9 N& L
+ x2 F" g5 p- ]7 Z; d( A! I
rbd journal inspect pool-name/image-name# d# G- l2 N1 Z$ w: x4 P
, j) ?& Y5 {" ^在损坏时重置和清理日志. h. ?; s& E! T' a( U, C. I0 w3 d
8 R& k$ f, B7 Y/ Prbd journal reset pool-name/image-name
$ R) S& p3 m! |5 }+ @/ v9 F) J! z1 s# E% J& i1 g a
% w$ t( q7 ]. i+ q5 P2 p |
|