|
原理比较简单,利用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块设备,然后在两台机器上导出此相同的块: - # i/ J; Q* d0 p7 ^
9 r2 s9 S; s- A. }/ d" Q. Q% s. k
[root@osd1 keepalived]# rbd ls test
" X' K. ?/ ?! o9 U# Q0 m* u& K( M/ s- e# I: ~7 l
- " n8 h1 _2 {1 ]- {+ Q
9 |4 Z4 \1 e9 t- ^7 {test.img' j1 w7 g* G8 i# M( g* I0 \* ~
- B- v' ?9 Y/ R& E2 J. Z
0 y+ ~/ C; _" [( w% c
: ~( ^* U. x% i# u) ~$ t[root@osd1 keepalived]# rbd showmapped
0 u( H5 B; d5 A9 `! \
' q/ Q% t; t- N; k% o- }! b4 b) q2 q/ T: k- , f% c/ e# A/ B: O( [% l& G. {
# ?5 `& o' M+ B% e/ vid pool image snap device
/ j* r& p p/ ^$ | o0 u) r1 W8 f7 R- H h3 H) \8 A
3 |1 b# P2 f! z. Z7 j
3 ~& Z2 ?, c9 O+ B% `0 test test.img - /dev/rbd0
" i y4 V6 ]. {8 n$ J& \
7 W5 S# S; i1 E! T f$ A+ i m- ' `8 \2 {9 A1 c* t: P: F. i5 Y) K b
0 N, N0 u1 |9 ][root@osd2 keepalived]# rbd showmapped z O: D/ _" ?& n) n' V9 x
, Q' Z1 k. B( t* l0 K9 b1 ?" T& j
2 K, ^* ^" E0 u4 \0 P+ C9 S4 e9 Q
" B, ]" N6 X4 y. l8 A+ |. R! ^( A# ?' y6 qid pool image snap device1 a$ K4 N5 f% W1 Z6 S5 Q# [
% _" V# n g4 V: F6 x0 K2 n( U c
8 c) q/ a0 L# @; v6 z' W# ?/ [1 v3 u, z0 v
0 test test.img - /dev/rbd0
6 z1 |3 q- S# M2 e! y+ c
7 \, B7 Z- a I3 A; {3 z% T" c: s' s+ \+ W
然后将/dev/rbd0格式化后进行挂载,如/mnt目录。 2. 配置keepalived7 M3 v1 u' z. ~1 z" M& a
从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的配置如下:
8 {& V! e, t1 c# [; ~3 t! s5 k: h% q9 I7 B3 K. d1 p
[root@osd1 keepalived]# cat keepalived.conf
' B* p# L) i0 V; x6 Q) f3 t" Z; o
- 9 ^- G5 p1 F* F* K$ Z( O6 d
) W# I; S* s% \global_defs
$ ^9 ]2 F0 G) k1 g% d2 y6 r
- H& j: n+ ~; c& \5 i
' b" g% P+ Z. {4 P/ o9 }- Z% V1 ^; k, u
+ ~( Z$ n, a# }" _: F{
], g% C% b) u5 `# U9 [; F' B8 z8 }8 b% w
% c, E' q0 Q/ H- r1 o- V: v- # m: @% J1 z+ D
8 ?/ g5 R1 M' Q S
notification_email
. Q* e* d9 b3 e! e; E
0 Z+ Y: q4 Q7 A8 h) y6 t& |* u' w - " b, ]6 m( V' g7 C0 s* E
1 W! K& \ J& [4 ~' W$ O: @
{
: \) o- A7 Z1 s* s3 P
8 k. e- K2 \. v; } - ; A, S& p( d" M: q7 ]4 j$ K
( m. k; c& e6 X0 i; n }5 L7 I1 A0 C- C; `/ i, V. }
# o6 D1 [) r. L$ |0 Y
- % ~3 N3 s+ W5 v# _0 N" O7 \1 ~4 b
5 \$ k' Y. r% H# C5 a5 ?
router_id osd1
* F' k( x* F v. X- R: N0 s. ]$ n, m
2 \3 `" I, N- x# m) v4 _9 @8 w( z' I: K. a$ {8 ]3 e
}' O9 \0 z( k: m- c
/ K1 Y" q4 q: o5 h3 C) G6 A* c- + x' _ h& W0 _8 M2 X
5 U; G v3 W6 \' Y5 e7 W3 c
G* E0 H. @5 ~5 w+ B8 k
5 f) \4 `+ j% @3 S* k - , f4 K7 Y2 l# p! Z9 T- ], c n! J
7 r+ _$ q/ v1 b3 m
vrrp_instance VI_1 {
& V+ U& e) ]6 \' `# `- u) B. @
- x6 k0 r' Z$ a* K" s+ y$ f+ l( _
' E2 V. d/ a" l; T" \( k2 s4 x$ p# A+ [5 J* t
state MASTER
- H, x+ V: R( f# v) } B1 h8 |0 m7 N% F6 s, V
7 Y3 W+ H! Z i3 e a* s5 r+ U% J, y0 T8 g5 {
interface em1- i) t; K% P; \9 G- |
9 m/ y* D! i$ U- E A8 M
- , c' I6 @# Z7 ]# L* S' ?4 z/ i
& g# P! L1 \9 ]. D" F% K# D% R0 T" g
virtual_router_id 100
6 Q# Y# o$ f3 R# z
% s+ B6 b6 ~1 S6 l - 9 r2 \% H# X1 l6 X9 e$ m2 J
! H, l" ^- B' F$ F
priority 100: I5 ~" ]2 J F. q+ g
6 \0 M/ A- q& R$ i, Q% X. l
; [# O( l/ N9 ?2 q1 R: k) I b2 ~. q k1 z1 i2 H8 @) N
advert_int 1$ W: \5 ]2 @5 a) I+ A
0 b( F# w5 J9 Q5 s
- . e: ?% U+ a {$ e8 g- m* _5 \
. [! B: @: X9 e" J6 ^
authentication {, ]" U) ~% H- r6 V1 p3 Q! ~; P
j# s' X' k5 w8 C4 q6 V
, O: d, S6 G" Y7 r" v9 H
3 {- X3 E/ S! L7 W9 { auth_type PASS" p; k; E9 e! \: h' J. V; L
! T' ?% w1 D# \- Z y. y3 g; l( a E
- : l$ m, }4 s& b1 q
2 d4 C+ @2 B' O" _; S* B auth_pass 11113 h- H' S5 K1 h
, g0 H, J: g& f0 F+ u* _( P, ?$ k - ! L, h6 c5 w; b, l4 f. W! D" |. u" Z3 E$ A
/ l( ^! {4 s; V+ Y( e2 W
}
" a1 c7 W) h7 W5 d8 e/ h; {
0 g, v2 A7 x- ?, S6 {
6 `# w3 J1 q% r) }& ^
3 }! p# d$ h2 N- J7 X2 j1 u% s1 J virtual_ipaddress {6 M4 d/ S6 k9 V* G* {
5 w) ?! X3 q8 [; X( w
# m1 G7 \5 U; Q: i+ ~0 G6 S. S' T: Z: c' w# \6 P; `, l; `
192.168.32.5/24
5 l* B i( Q$ [" }$ T* W6 E. h, |( I( u8 i
- S0 i) a. G- |. \
4 O' t6 J1 `) ^5 K+ u2 W6 a }
& `9 a& L2 _$ N }2 X# H$ X1 y" h6 q* |
$ c+ m& o7 z* L2 D7 \
) C X! ]; f Y& i# f} g& X4 y" b. A( g: K
. p" s9 X, L& F" E5 z- S
3 i& o; F% { o* N- Z5 U/ n0 L
osd2的配置如下: - % i3 X1 f- s3 J
6 ~( Y, u6 H( P, U: v5 ]6 p, y% S c/ z
[root@osd2 keepalived]# cat keepalived.conf( Y, u$ o- l: I
4 S: ]9 b; r6 G# Y5 e7 J# i
9 c5 w$ v$ i; a
S& D$ [5 x4 x- `global_defs
# U. I! l) Y: T+ O
- G/ v6 `6 Q7 T: a- z$ w% b9 u
" R/ M0 h5 |" u& Y3 U! J, Z) K9 ]% H( E9 P9 f* M# Y6 A; s$ K
{
: s' L( B9 Q: R4 b- F$ j, t) F* E! Q- d$ j8 L9 Z
: }$ a. p" A1 b+ {
0 u6 ~3 e; F# n notification_email
4 g$ M4 b9 Q) Q c. m1 @' S. r% n v5 n6 j7 L6 K: \
- ; b) C' H* r$ \" ^2 N
6 k! t1 A* C7 k
{ l. N+ S: c4 {! x( {2 Q
, W @/ c- `9 \+ E- H& I
4 r* B9 w% O9 c6 }) `6 ^7 o- _* D" j. ?
# admin@example.com6 W! _5 V s! C9 _0 D$ O
( A7 p, Y, {1 U5 c7 C9 D
( K7 ~2 X) N1 F% m+ t- K
' m' \& B6 D2 Y E5 X" Q& G }
0 w# T# A7 I& D$ e) a, W2 P# s. U E6 @* N4 A, M7 G H
4 c% T0 ]: E2 T0 p4 C' J; T0 `3 ^! A$ S" p2 r
#notification_email_from admin@example.com5 t: x2 v" \: S' y' v* P
7 N- r' X, P+ I! g' j1 Z; P
9 |, }* f% a: \: { J7 }: z5 q# m# Q" Q
#smtp_server 127.0.0.1
3 y' \0 b! i! m/ l
* ^: g P$ A- V. V" Z* L6 ^- 8 U6 ?& G# {/ H4 ?
" r' \; @4 |* y
#stmp_connect_timeout 308 `0 V% \1 y3 Z0 D
% d! N1 g7 t% F& A5 b
- ' q9 j/ I5 n& q2 I8 }' a
5 ^. F3 m! B4 t0 y4 ^/ g) f1 O" s% B A router_id osd2
' ~' o' T, p# l% z
( ^- R5 i4 T+ P. G - 1 u( G6 H6 C1 a! f8 Q& P+ M
' i$ m- a0 g& F0 _# b4 Y: ?}) _) l# B5 `# _. M
' t( F/ u* Q; I M4 I, T - . D8 Z9 [& k' @; C- b/ V
! i7 W# o% F+ K" r, j7 x c: T/ Y) O8 f" `) H
, M3 t/ J3 R6 @3 F, v" x0 J
- ( L: r" Z$ H7 Z7 `) ]9 ?: t
' i) p% c% i* Y
vrrp_instance VI_1 {5 v2 e" O7 w" o2 T5 b) P" B- U
7 Y8 D( v S; V. f - , H7 j; k# _, m2 ~, e( I
& V2 r7 Q1 N9 j g, O _* y" w state BACKUP
# G" ?5 C# V* N' l9 Z1 o/ e% @
$ U9 B8 r' j; V6 |' s7 `
4 Y9 Y R( T/ Q/ i0 V7 ]: m
; V7 T! J" Q+ B: \ interface em1
; D, ~ L" p+ Y/ p) ]0 \3 N) I9 [3 ?3 y, d6 M" J; B
- 4 E! q" Y/ }5 ]- E
& \# B# @3 H/ f' N$ t8 y
virtual_router_id 100* u* ~& E5 H: d( E$ ]$ Y1 q5 ]" ]
0 y8 |3 n, I9 _( F# n3 H - : a3 {/ r6 j6 n( ^5 m y! r
/ v0 R2 [6 b- j7 J* o( |) U priority 99
1 k5 U% M1 T. p) l/ d( U
4 U7 {# X+ k6 G; u. G$ F# i: S - 5 O0 [3 _: ?; J2 p
! {! H* ~4 `+ Q! t# x3 I& n advert_int 1
$ h! Y. n4 z: a! W- W ]0 ^ u3 r. K/ g8 B1 A
) ?. c q, O+ u
3 F/ y' n% S2 s$ I! o2 S" t( G8 _ authentication {
4 N& z: g: i) b* j
7 K1 Z4 g" q( _9 p0 T% _: c0 D- ( A/ i& R3 F% J% h0 m A& Z
u; {# P* i' z4 K3 C! P* l3 G
auth_type PASS+ z4 y0 q# w) t% e6 C5 P- a
2 B6 @! Y3 k+ h! z0 F - 4 Q# r7 p7 c" l. y' p
l, a6 c+ A7 \/ Z0 J
auth_pass 1111
) R- f* r) M6 T- U/ x1 [
V W2 b% d N% s
8 m6 W* z+ z- i1 |' |, {8 t: |0 Q( O" L, X$ t8 _* {
}9 R$ x& m# Y- R& D( @5 O! W
4 n H( A9 k6 ~4 f3 O ^9 K
$ b) ?2 u6 ? W( S7 I
8 M) L$ |. S2 P" O' y notify_master "/etc/keepalived/ChangeToMaster.sh"2 ^& a* W& q) q3 A# I
' K7 |3 V$ s" i# ~3 f
- ! Y6 x- _! ?% E3 ^) s
& k- I3 W& q6 b; |# S notify_backup "/etc/keepalived/ChangeToBackup.sh"/ C# X) p( t, i( X
' J$ G2 h7 l) f b6 h$ Z6 e# Q2 D - 2 b) X0 M; T8 h0 L/ j& S" U" ^5 z
: M- h8 v6 n' Q- {- \5 H) S
virtual_ipaddress {
& W }+ T$ t- `( j8 B7 i( {5 } }/ M0 ^
& O6 s5 r+ S) t- ^+ u' z1 |# n
( L! m5 T1 r7 X- o6 V7 x$ c3 V% @4 E) _& V# Z( f, O3 U) t
192.168.32.5/246 Y# ^# s* I% j
& E" S# e2 `9 m& B. G( ?
. a. j# {# u( Z8 I" N
; E8 i0 \$ Z- t1 g* B }
, Q8 V7 y2 K9 v; g. ?7 e" ^0 L$ E1 P3 }3 T( ~) V: Y
- 2 w9 v, G* l+ Y
+ U8 b- g; {9 m% h$ s
}6 u3 B6 F2 C; s& K0 K) j
8 Q H+ h! k+ _' Z% A" N1 l2 V- p5 M/ C
在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
, V( \7 e* ^- A在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. 测试
/ }- ?* [. C9 R) L4 R' w; [+ z关闭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,后面会进行记录。 |