|
原理比较简单,利用ceph的rbd导出nfs,然后配置keepalived,在不同主机映射的rbd块间进行vip漂移。 1. 创建并映射rbd块设备试验机器为ceph中的osd1和osd2主机,ip分别为192.168.32.3、192.168.32.4,vip为192.168.32.5。 先创建一个rbd块设备,然后在两台机器上导出此相同的块:
' ^ _$ _. K) a
) w4 l) R. S# Y$ g, d[root@osd1 keepalived]# rbd ls test
( `5 Y6 T0 b5 A) @5 R7 C1 {' ^
$ b( l: f. \5 I/ Y
% b% E. `+ h" P' f
* [! |, f8 Y$ J0 S* qtest.img
8 U2 w; q% t# n
5 d: S5 Y' ]7 [% w
7 ?1 M$ h# U j G$ h7 f8 A
+ ^4 i. ?4 T' z7 e* j2 X[root@osd1 keepalived]# rbd showmapped1 Y( U3 H- A, n* W. L' K
$ P; f! }7 w, I' a6 @8 E- ' ]% `& d& c# S J5 j5 y
$ H, N7 s8 t" M
id pool image snap device
6 i$ K9 g8 H9 ?6 I( m8 r; h% W/ h3 I0 |& [8 I
- - B% }5 J, G7 `& B, }
6 H! W( b% A, B0 test test.img - /dev/rbd0
H) I' D+ \) c I
: Y8 i% t/ w: ~, v( e* }
' H$ h+ X; Z, I# f: r
1 @0 w3 p* q: y! f[root@osd2 keepalived]# rbd showmapped
! ^& b9 A Y1 Z9 }3 s" ?, z7 w; |! `1 y% T0 R( s
- 4 O9 r% W9 g! W4 U1 H+ h
, [ Y" k9 w; c" |& S$ R! \. t: n5 did pool image snap device
# R: {2 b& s6 Q+ Q1 S4 v! O2 r: |3 n
. ]; u1 z" z8 ]. `7 x
8 ]# u2 X* G+ j/ l+ Z0 test test.img - /dev/rbd0
# I# @3 j$ a8 F) h8 b2 ]; b% |! N/ S7 {# x0 R% r; N
: w- v2 N$ ~6 K! Q7 g
然后将/dev/rbd0格式化后进行挂载,如/mnt目录。 2. 配置keepalived
# j4 [7 S0 m- p. s' Y' ?! m% ]# \从http://www.keepalived.org/download.html下载最新的keepalived 1.2.15版本,安装比较简单,直接按照INSTALL的说明进行默认安装即可。为了方便管理keepalived服务,需进行以下操作: cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/mkdir /etc/keepalivedcp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/cp /usr/local/sbin/keepalived /usr/sbin/chkconfig --add keepalivedchkconfig keepalived onchkconfig --list keepalived配置/etc/keepalived.conf。osd1的配置如下:
9 z- G2 e, z% D( D# o, Y1 F. u& ?
- ]. ?" J; _/ i' \% y1 ][root@osd1 keepalived]# cat keepalived.conf& ~! F; w2 R( \1 L! e# U
! z+ A. w3 z& Q( j* `+ N' W- l! v
$ h3 u: p$ R7 Z6 g, D8 D# i) P. q% T( ~9 J4 ^; U
global_defs% c% L# u% B9 Z! w; ~& N# [. _
3 {/ m/ p- L7 {. J- ! k; p7 }7 ~, V0 E. w
% ]# s- d& H0 Y/ H% O/ E6 }7 q; g
{
, p* G/ ~& a/ w+ U7 c. Z2 v4 _7 w' w p- ^
; S" U+ g3 x. @6 Z: N9 \
2 u2 T- ?* K0 E5 y# n notification_email8 V4 G X1 v% X& L4 l: {
( o# U' e- ^. I+ g2 \, m- & G- }4 }' \7 L+ U6 C
3 Q% r- n5 {9 O* k2 {. Q3 D {; e- {5 ~& N `9 v' a
$ s: _: a% F c" _/ g/ ^. n& a& P - & P/ J* ?) v' s+ ]
9 A( k; S# D" a+ X" Y" N/ ? }
8 J, Y# O( ]+ [6 Z% v! K2 g3 _4 s, C; o% q) T6 b
, J1 M( q. d( Z. q! ` p4 k
% `" ^' F2 X; j; _2 v% T5 C/ C router_id osd1
2 j5 q! k& F) H5 z
) J8 a. u6 P# k% p/ ~, P
) v7 @4 O* a/ V* R) I# v4 @7 k8 b
, H6 I2 C) \4 d" _) Q9 L}
1 W8 l3 ]$ W% U; G3 d6 {% Q
0 j; Z) p# G3 V* `8 y
- M- E- C' H, T/ e
' N7 k8 A; l( X/ O1 X& h" b, X- z: I4 G
4 f0 e! Z" E$ C" C& \
0 q5 X( S) l/ n: M& u" ^
- Z( ?4 U9 Q* T0 W8 J* wvrrp_instance VI_1 {
0 @$ ^) t. W1 F |) M [2 w F( m m i3 }' u
- ; `/ m) r! B' Y% u* j% b
& q' }2 F1 }7 H q4 x0 N; `5 i+ |
state MASTER: ^4 Q2 w. k+ {3 b
% I9 H& ?1 m) a5 X
: X+ ~; {8 Y+ {% E2 O2 K4 ~/ t
7 J; ^; N9 `' M ? interface em1
5 L' q) k, Q( H0 X7 h. E% o' D8 g/ ~1 y/ r1 H0 ?
0 s; h- }3 p# G$ W; a" x3 P4 {0 L4 W
virtual_router_id 1005 h5 h: G/ ~( H. D" _# ?9 R
8 G/ P6 _1 w1 B& G2 w2 q# L* f
- 2 c( Y( y( m7 W1 [
4 ~% M/ T% R R priority 100' \1 f* W' N8 w; z' H. h
6 S I7 |7 }. N: c4 q# c& H
! D$ Q8 _: w6 E( E5 f: n0 f0 \- A' s* w9 ?- j2 w: M
advert_int 1
( v; R* W# J1 G& j' K
) w- h0 R* }( F. d% o& J. `
0 I3 {+ w9 H# c9 @
4 [4 i3 c; ~ f! M authentication {
8 X4 R. F% ]" D; V2 X" }4 z6 G
& E# b+ D' Z. A& m) C
' G" h N1 B! [ auth_type PASS5 q. G$ p/ r/ z. d
5 O6 Y. |6 d6 o5 H8 B. W- H" _* u
- & H( A( W1 s/ o# P/ n) \" l3 r
8 t) S/ K# y6 R' f5 e5 N) f
auth_pass 11117 y" T8 v- v9 k7 l) @% t k
! ?% J) D& F+ q7 @& \6 b- r+ h* l
- & I6 d* E7 D8 f- z) e! d. n% y& @! M
( o5 m. c b% n9 M5 \4 h$ t
}1 ?/ d! A' W/ D" U8 w0 Z
' w) c2 |( o" Q9 n6 [
- ' H/ e$ v5 Q& S0 I% f
! F' Z5 q$ b* f9 _9 \) l
virtual_ipaddress {
" G7 q( M: O- J, C( [
7 B% u( B& U( I - 6 x" q5 O& ]: @; b! ^ T5 h
$ k F, E9 N5 a2 z% e) W
192.168.32.5/24) f- W$ X }0 y3 Q3 T" J1 s2 C
5 s# ]% A& |0 P ~ - 9 [& f4 d/ J9 s6 }9 e* ~
& j5 q' n# p& Q- y. D% I) M } c3 ]/ b/ t. O1 D8 d
5 z( z* \3 s/ ~) _& \+ c6 { - ! G e. h4 N- V0 o$ n ]8 b
* Y1 M6 |7 a K% J}
7 H- G0 ]2 e2 C7 P* t
0 X8 x3 `: u2 `3 p6 y# [* h9 Q0 y
osd2的配置如下:
! g c# S( A) d7 ?; ?7 U2 b/ t) A
6 Q$ C$ A1 H, A" F g( q& U0 z[root@osd2 keepalived]# cat keepalived.conf- b( [' r) @% I- G
3 `" t, u- Q' t7 s4 q
- 5 F; |; R9 a6 ?' P) u
7 a: ]0 o2 |, Z! s7 e
global_defs: V }2 ]: h& l% ]6 N9 U* S( Q
( g( j7 Z" m5 \- Q% v$ J% R, y, c
1 C' s( m8 [5 f/ S( ?9 o c+ U
# I4 Q& n E9 f0 X7 B{
7 a, W" ]) A6 g) ~- g5 ]! F& H v. j' U9 J. ~8 C1 D
- - F, k0 t0 V1 L' G- | L& u
& U) X' a3 \# C. Y/ N notification_email
- z& K; W) Y. k( B0 W
, I0 \) t* V: q - ' b" G7 ?* d& {# Q+ B! p
- `; S3 f0 J9 u: J/ P: ?# [* F
{, O, \2 |0 z1 e6 w8 Q* Y$ p
/ C0 j! f/ [1 |+ p, t, E. a$ E
* F& i( f6 X$ N. s J+ H( Y# W
7 d0 G, w4 s! [- ~* V. ~ # admin@example.com% {; `: Q2 |. N
) X3 I9 e7 @4 v
& U: S) @3 {0 [1 k0 m) i2 P% m! L' z# q! x
}2 P1 A) W+ ~1 r2 e3 s
! E' Y* ` N0 ]7 E' w
: l; N- _/ o6 F& V: E- w
! \( a% j" J' ?5 M1 B1 f #notification_email_from admin@example.com
% y$ W2 c) Q9 R8 y
s% `/ y& h% l. O- $ _9 Q) G$ C6 G" e, S4 I
) ]. c8 p" h2 O6 E' ~ #smtp_server 127.0.0.13 z1 B4 B- h6 s, k9 c! ]: K+ n
. p6 R! L: {) G7 R& i
' U! W" m4 q: w& i8 v# y4 C" @( d' D; \* E9 j, L0 O3 {- }" _
#stmp_connect_timeout 302 M5 E/ H" I" X, M! ]
3 r6 j/ I9 m: Z z5 z5 y; J% {1 \
$ `& V4 X5 }% T" j; }
: H. _' d1 F# B/ j router_id osd2( ~( m% ]4 D" U$ E
1 r: v) g! k1 l8 }2 ~9 G
9 g0 D- x4 Z9 ^* ~1 I* @: {' y$ i
8 k3 X0 q5 _ `% ~3 c) h6 x0 ^}5 v. `. z& g- A0 [8 _# R
5 s; x5 L) q% y! P6 {4 a6 o; Y
- ! i" ^5 p- O7 n C% y& |+ `! h
! Q( o" w% y3 q: h9 ]1 i
1 [4 o! \4 H% O
$ F4 x8 y( Z- v! y
& p8 W4 s) g, v% B" P9 n8 h' m; q5 Q0 `
vrrp_instance VI_1 {# V8 ` h- y8 U; {8 L9 | k& M x
) i( c6 ]2 t0 _- x
' ?6 g8 R& h" K/ [7 `
% Z7 I" u- A* j state BACKUP
) A4 `2 w% a- S( x( e; V9 C3 C$ u
* V- q. S, S" @! n5 ]+ d* P2 N
?/ P$ `( n) A `5 Q8 ]1 g1 M5 l
interface em1; D- G l) w) S s/ x7 w
3 p$ N; `$ E8 W- $ t8 ~4 _) [- R6 j; g( W3 P
, Q: d: C- k; ]
virtual_router_id 100
- T* B& }" H2 V. r! T6 Y$ D( y" |, P( ~9 L3 ^: e
* V# O C9 s0 Y9 Y2 V
$ }) s B" \5 C; j priority 99
" v' Y# ]! k: Q+ E2 u" P, N `# S! t( T
- , X+ {0 D4 k, y" M, l* o
, w( I+ O& Y. l4 I3 g
advert_int 1" Q( ]7 R. ~5 W9 z1 [+ t
* ]: G4 z' a: U" f3 k1 h" E5 V
4 S3 Q1 s( Q& Y0 }3 M7 P T0 Z
" y4 H! @- m4 ]4 S7 d& V authentication {
* J: |/ I _; f7 }, T1 b3 |3 x$ j) a) W# b
- d! t( N7 N8 F+ T5 q1 Q3 [/ _
8 k U! A& Q, B' E# t) p$ z auth_type PASS; E3 v! D# a' t9 {' x6 I1 A D
/ v% T3 T! L( e- / o" [" y( z" I4 c# b
3 Q" B* A, Q: z3 x* n auth_pass 1111
1 @( D _+ C3 w( U7 W, r y; f8 _
- 8 K! B1 J7 s8 [! I+ R" r2 q
+ S- c& g# c6 w' D( X% @. V$ c }
4 m* Z* b$ \7 M8 g& K4 x. [! `- B3 O' D! m6 f$ P' C0 E
- 3 a b& a0 [5 m7 _6 h: n& f; x' Z
; [& G P$ Z5 S8 B# `1 h5 {; `: H
notify_master "/etc/keepalived/ChangeToMaster.sh"
" [7 _+ \- W2 F& U6 f" G6 j# S, g
# H/ ]0 E( G2 M
/ z# V( V3 b. M( `, _/ J% K5 n notify_backup "/etc/keepalived/ChangeToBackup.sh"
( S$ m. ~5 Y$ ]$ q& L! b
. e2 }8 p# I8 `. W# Q% O- / C% K3 W' W# i/ p3 b' O8 o) g
( t4 N( c: C) J2 ~# m0 N virtual_ipaddress {4 {7 i, b y' ^! t
! v: B- O5 ~3 S# M8 v- S! s. K
- : D; c, {# x! N8 X, a
' L" K% M j+ M3 ^, ~' r 192.168.32.5/249 ^/ k( h3 B4 K6 u2 ^
, x4 e! M( D/ U9 h - 8 Y j; Z- c% n9 P! ~3 x
. {5 P6 J& s: N. t/ K
}
; c/ f0 L. T6 b& S& H
5 }6 N; H. `& q$ f6 G/ P! U
; T6 D2 s5 j0 r: C
8 i. c) |3 N% V}: r, f+ M* @4 \; k( c
) c! c6 d# D# p6 v0 X3 b, e2 J& c" `* Q1 a
在osd2写了两个控制脚本,用于osd2的keepalived状态改变时执行。ChangeToMaster.sh: [root@osd2 keepalived]# cat ChangeToMaster.sh#!/bin/bashservice nfs startssh lm "umount -f /mnt"ssh lm "mount -t nfs 192.168.32.5:/mnt /mnt"ChangeToBackup.sh: [root@osd2 keepalived]# cat ChangeToBackup.sh#!/bin/bashssh lm "umount -f /mnt"ssh osd1 "service nfs stop"ssh osd1 "umount /mnt"ssh osd1 "rbd unmap /dev/rbd0"ssh osd1 "rbd map test/test.img"ssh osd1 "mount /dev/rbd0 /mnt"ssh osd1 "service nfs start"ssh lm "mount -t nfs 192.168.32.5:/mnt /mnt"service nfs stopumount /mntrbd unmap /dev/rbd0rbd map test/test.imgmount /dev/rbd03. 配置nfs
, q% b9 c ?- t0 k在ceph的一个节点利用rbd map一个块设备,然后格式化并挂载在一个目录,如/mnt。在此节点上安装nfs的rpm包: yum -y install nfs-utils设置挂载目录: cat /etc/exports/mnt 192.168.101.157(rw,async,no_subtree_check,no_root_squash)/mnt 192.168.108.4(rw,async,no_subtree_check,no_root_squash)启动并导出: service nfs startchkconfig nfs onexportfs -r客户端查看一下: showmount -e mon0Export list for mon0:/mnt 192.168.108.4,192.168.101.157然后挂载: mount -t nfs mon0:/mnt /mnt需要注意的是,NFS默认是用UDP协议,如果网络不稳定,换成TCP协议即可: mount -t nfs mon0:/mnt /mnt -o proto=tcp -o nolock 4. 测试# ]& F. c) M y
关闭osd1的网卡em1查看结果: [root@osd1 keepalived]# ifdown em1[root@osd1 keepalived]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: em1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether c8:1f:66:de:5e:65 brd ff:ff:ff:ff:ff:ff查看osd2的网卡: [root@osd2 keepalived]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether c8:1f:66:f7:61:5d brd ff:ff:ff:ff:ff:ff inet 192.168.32.4/24 brd 192.168.32.255 scope global em1 valid_lft forever preferred_lft forever inet 192.168.32.5/24 scope global secondary em1 valid_lft forever preferred_lft forever inet6 fe80::ca1f:66ff:fef7:615d/64 scope link valid_lft forever preferred_lft forevervip已经漂移到osd2,查看客户端挂载情况: [root@lm /]# df -hTFilesystem Type Size Used Avail Use% Mounted on/dev/sda1 ext4 454G 79G 353G 19% /tmpfs tmpfs 1.7G 4.6M 1.7G 1% /dev/shm192.168.32.5:/mnt nfs 100G 21G 80G 21% /mnt打开osd1的网卡em1: [root@osd1 keepalived]# ifup em1Determining if ip address 192.168.32.3 is already in use for device em1...[root@osd1 keepalived]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether c8:1f:66:de:5e:65 brd ff:ff:ff:ff:ff:ff inet 192.168.32.3/24 brd 192.168.32.255 scope global em1 valid_lft forever preferred_lft forever inet 192.168.32.5/24 scope global secondary em1 valid_lft forever preferred_lft forever inet6 fe80::ca1f:66ff:fede:5e65/64 scope link valid_lft forever preferred_lft foreverosd2的em1: [root@osd2 keepalived]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether c8:1f:66:f7:61:5d brd ff:ff:ff:ff:ff:ff inet 192.168.32.4/24 brd 192.168.32.255 scope global em1 valid_lft forever preferred_lft forever inet6 fe80::ca1f:66ff:fef7:615d/64 scope link valid_lft forever preferred_lft forever现在的客户端: [root@lm /]# df -hTFilesystem Type Size Used Avail Use% Mounted on/dev/sda1 ext4 454G 79G 353G 19% /tmpfs tmpfs 1.7G 4.6M 1.7G 1% /dev/shm192.168.32.5:/mnt nfs 100G 21G 80G 21% /mnt[root@lm /]# ls /mnt31.txt a.txt b.txt c.txt etc linux-3.17.4 linux-3.17.4.tar m2.txt test.img test.img2也可以为ceph rbd的iscsi配置vip,后面会进行记录。 |