一、介绍
1 s9 l6 T/ O- ~, X; a========
& u6 ]1 F4 o4 W, j这篇文档旨在介绍如何安装配置基于2台
服务器的MySQL集群。并且实现任意一台
服务器出现问题或宕机时MySQL依然能够继续运行。
% E5 R/ A+ N# M: ?6 G. Z
5 E- `+ ?! y( W; q
注意!
7 d" R. ?+ A/ R( f- m
虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。
* }- L! b0 A7 c* H- [' K* f2 V6 B
9 K1 P/ k! B, ]3 U3 j: j另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。
; [( y9 q# n9 H# y# M" g A- K/ N/ G8 M. M4 y# c+ I
下面假设这3台服务的情况:
. u* F6 |/ e* F
; V. p$ i y8 e* K, r5 t! [. t
Server1: mysql1.vmtest.net 192.168.0.1
4 M( O: y. \9 S2 RServer2: mysql2.vmtest.net 192.168.0.2
m# ~& O ~& Z0 n4 R2 {- {$ c/ L
Server3: mysql3.vmtest.net 192.168.0.3
) a6 G$ t, T/ i0 @& ~# m7 k1 R2 f* X
Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL,Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。
/ \5 ^9 d3 \: R
* d+ D! K" Q4 M# D
( \* W2 ?) S9 E% `) I1 k) g4 i0 {二、在Server1和Server2上安装MySQL
D3 Y0 E' W h" w, c" x3 H' l) `=================================
: J. O# x0 _+ m. ?5 L8 C0 j
从
http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
! \: o; {) u) [* Q注意:必须是max版本的MySQL,Standard版本不支持集群部署!
- D# B/ r" N6 C I# C# v
& A+ F7 Q3 q9 j以下步骤需要在Server1和Server2上各做一次
+ n+ Z# w# ]4 M# Z8 ^8 S# o1 @# mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/
( J, F# ^- @3 y2 e
# cd /usr/local/
' m& i! W" n" x! g7 o
# groupadd mysql
# z6 N7 B* i& U. ]7 B
# useradd -g mysql mysql
) \' A | b% t1 N; v: o% C
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
4 |$ k: U1 T& p$ ?' o' X
# rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
, Y. l$ U9 N$ ]' J9 q8 ]; }
# mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql
* b% W8 l4 S8 v4 s3 a# cd mysql
+ \/ y9 D+ r0 W' Q; D9 `# scripts/mysql_install_db --user=mysql
; q. Z- T% ^' j
# chown -R root .
2 H" W, t& N O" D1 p* j& f# chown -R mysql data
& m# Y. @# E2 i( ~+ q
# chgrp -R mysql .
7 p2 ~! O! S# B; Q) M+ Y" x# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
0 E% E, g; E3 o$ x6 K- d# chmod +x /etc/rc.d/init.d/mysqld
9 }% X- z& Z5 z7 o X: D# chkconfig --add mysqld
/ ~7 i$ k1 @& u( A. z! c+ s6 B
. e- t4 F" a$ v- f- [此时不要启动MySQL!
9 i: K# Z+ t3 y% A. S
7 B3 w; s- @. ^ v2 S3 W9 U0 `+ |1 l* ?: u4 `# y; E
) ^- Q9 t% X' j9 e
三、安装并配置管理节点服务器(Server3)
R# s+ P! H0 r0 s; d1 v* z=====================================
6 i9 d% l/ E- w: ^
作为管理节点服务器,Server3需要ndb_mgm和ndb_mgmd两个文件:
. n! j) A6 B& _5 m: s7 h' t7 u v; V7 }, `7 t) F1 J: i
从
http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
- r3 ~, D S+ i' u3 \
0 W' j# [) ?1 W' [# mkdir /usr/src/mysql-mgm
: C1 A3 ?7 u" y
# cd /usr/src/mysql-mgm
6 N. Q$ x2 B+ V; ~2 U b; Q( m- Z
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
6 w* @6 l* A# r+ y' V
# rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
6 g/ a% h4 O! n" x
# cd mysql-max-4.1.9-pc-linux-gnu-i686
7 w- K1 I4 j% Y q# mv bin/ndb_mgm .
0 C% q* s6 G9 r- F( ?" ?- @3 @) M
# mv bin/ndb_mgmd .
2 s7 h( h. W6 v+ v8 _# chmod +x ndb_mg*
, d: t5 ^# ?* v9 [3 c
# mv ndb_mg* /usr/bin/
% c# A8 A! a0 p! D2 M G# cd
3 {) C$ Q" o; S3 t5 y, B4 j9 k# rm -rf /usr/src/mysql-mgm
& u! Q; o' C) _8 p8 P
' h4 z8 |/ q; e' }& |5 {$ x' [现在开始为这台管理节点服务器建立配置文件:
7 G7 E6 O8 Y; A1 j- `9 q
1 {1 c/ D/ `1 M3 j& K# mkdir /var/lib/mysql-cluster
1 c, `: Q7 K; m k$ O) i6 j$ J
# cd /var/lib/mysql-cluster
8 ~4 X, x" d+ s) B
# vi config.ini
7 y+ l% t, n( x
: m% Q* t& P# j; {1 O- B在config.ini中添加如下内容:
# C, I4 M2 d* Z2 o& A; s9 |+ w" j9 \( u
[NDBD DEFAULT]
& W2 L$ h& U* N/ P* I* G7 Q, i/ fNoOfReplicas=2
' [% E" \3 Q4 w; W. Y) [2 ~4 s[MYSQLD DEFAULT]
. [! d& A, q9 g, |" v W( E2 v8 ^
[NDB_MGMD DEFAULT]
; Q5 V9 l; O3 Q3 q+ }5 w[TCP DEFAULT]
8 V1 m- _; `% @& u `8 L# Managment Server
' Y$ D/ T+ W9 r/ Z. T
[NDB_MGMD]
1 F% {/ D. R! c) y& f0 \( pHostName=192.168.0.3 #管理节点服务器Server3的IP地址
: P* h" w+ S) h2 Z# Storage Engines
0 _2 @8 f9 ^! }0 I[NDBD]
' I* _4 Y7 D. ?3 i
HostName=192.168.0.1 #MySQL集群Server1的IP地址
6 Q; K- L' J/ w
DataDir= /var/lib/mysql-cluster
$ L/ {5 b/ x6 Y" P
[NDBD]
% T( W, E0 _" z# x/ [( H I& |
HostName=192.168.0.2 #MySQL集群Server2的IP地址
7 t( l1 d$ B% F. h+ M3 t/ @
DataDir=/var/lib/mysql-cluster
) b! t9 d- L) v# 以下2个[MYSQLD]可以填写Server1和Server2的主机名。
/ v8 M. X9 b. @! i
# 但为了能够更快的更换集群中的服务器,推荐留空,否则更换服务器后必须对这个配置进行更改。
% a, n7 X& y& M( Y[MYSQLD]
3 m. k8 l/ N% J o# s0 \[MYSQLD]
. P* u. c) b3 J1 f# \/ _4 A
) e' T" O/ f' O/ V+ m3 Z" l1 C
保存退出后,启动管理节点服务器Server3:
) u0 N8 p! o% R+ p7 ~* L4 b# ndb_mgmd
! _/ b3 n, o0 ]1 _- t4 W8 |/ ]6 ?4 q/ `" O# e) w! A( L' G
启动管理节点后应该注意,这只是管理节点服务,并不是管理终端。因而你看不到任何关于启动后的输出信息。
1 `! e+ p! [4 Y7 ^9 _5 \$ S8 D M0 t9 J/ t- j5 M% ]% i# C
8 w6 v. y$ x |8 Q
& g; ]; z: m H* l四、配置集群服务器并启动MySQL% u% d0 Z4 L- D( J% A2 ^
=============================
1 L1 H& U1 k0 v在Server1和Server2中都需要进行如下改动:
0 U; ?, B' j6 Z4 `" R! `# ]
+ C0 _% P' C. a$ B( B4 }/ p- }1 g
# vi /etc/my.cnf
0 l7 C8 P+ k' _$ I$ M/ ?
8 f( n6 |- c( S/ y3 j! q' y[mysqld]
+ \1 `3 } p$ o5 x6 Q$ [% p" zndbcluster
/ B3 i6 m( p+ }: z. [7 o' _) q
ndb-connectstring=192.168.0.3 #Server3的IP地址
! t; V5 E6 n: D! N9 z: \
[mysql_cluster]
3 [2 b9 o' ]2 ~2 O# C& J6 i. _ndb-connectstring=192.168.0.3 #Server3的IP地址
9 r7 F4 J0 t* \# o# B
9 b G4 x9 S- \; p2 C保存退出后,建立数据目录并启动MySQL:
: D3 V* U+ @8 G( a; ~- j
( g7 w2 {9 ?0 u) g) \$ p# mkdir /var/lib/mysql-cluster
0 B* ]5 k3 ]/ ^ M B* g# cd /var/lib/mysql-cluster
- R2 y% q' ]6 h) j ~9 v# /usr/local/mysql/bin/ndbd --initial
, }. G! j4 }5 D! I3 s) r$ [
# /etc/rc.d/init.d/mysqld start
$ o: A5 b6 ~0 z( u
+ V7 }0 ^, _& T6 ]5 E可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。
! J- n$ G$ @; k% t" r9 n注意:只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用--initial参数!
b+ Z' ~ b' O" w8 m
% C! y5 X" x" y6 G$ S. M L5 K* q: Y% f
! U& Y* a. `6 |! q( s# j五、检查工作状态, M* e. Q0 Q' C* G. q) A2 p
================
L3 G0 p/ E/ @" O* }
回到管理节点服务器Server3上,并启动管理终端:
. c3 F8 d) ]& m% [" h
+ F/ I: [5 @5 \! c O, K5 R# /usr/bin/ndb_mgm
$ o! n! e9 y, g1 p' \( \6 {键入show命令查看当前工作状态:(下面是一个状态输出示例)
% p" e2 G. q8 t: }$ K, _& m T5 Z3 ?
[root@mysql3 root]# /usr/bin/ndb_mgm
" W- g( j, w6 h
-- NDB Cluster -- Management Client --
, M% y# M+ n% P4 ?; s* _, xndb_mgm> show
5 O* C$ Q# t& n( e: {% l
Connected to Management Server at: localhost:1186
* e, m B& i2 K+ ]$ x# ~5 ^
Cluster Configuration
! l6 A# `% ?/ |9 q2 r3 V: H---------------------
% S$ \6 Q4 y Z) e, l. a$ ^
[ndbd(NDB)] 2 node(s)
c% z" Y" l" _
id=2 @192.168.0.1 (Version: 4.1.9, Nodegroup: 0, Master)
0 S# A0 w) b2 k2 q6 z3 Jid=3 @192.168.0.2 (Version: 4.1.9, Nodegroup: 0)
2 d# `0 s, `5 F8 H- E: N5 @" T( i: S$ P- Q: m5 t8 s1 ^
[ndb_mgmd(MGM)] 1 node(s)
. a$ G% w, K5 m t0 a6 G
id=1 @192.168.0.3 (Version: 4.1.9)
- [' K# A3 }9 I
, {% W) Z9 R& }; j% D[mysqld(API)] 2 node(s)
# h' @ K6 t: B! |5 Y1 J( m
id=4 (Version: 4.1.9)
+ v7 e9 c( u3 r) {% C5 j: y
id=5 (Version: 4.1.9)
1 E. o7 v+ Q T0 P. u1 ?
3 _5 H' H4 n' h$ A* O3 ^! @
ndb_mgm>
8 j7 s( y, M$ u
) K( u8 G1 y: q: u, J; ?如果上面没有问题,现在开始测试MySQL:
. _& b1 W! l& u* b* v注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1和Server2的MySQL root密码。
! J* L8 j" @7 H1 Y3 K+ W
3 K9 Q0 `8 e; C- W在Server1中:
9 K; R7 M4 E5 f H- r$ R
- V$ g# S! |. @# c5 A# /usr/local/mysql/bin/mysql -u root -p
5 {) Q ]! e& P2 o3 X$ o/ Y2 O, l> use test;
0 c# n. z+ M# p> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
! H/ E5 a% F) k, C1 V) P
> INSERT INTO ctest () VALUES (1);
8 c- ]/ d! {& n: Y. s> SELECT * FROM ctest;
- k ?- c" C8 j1 ^; \6 Y( w+ S- s1 I8 M7 Y. g' k+ w
应该可以看到1 row returned信息(返回数值1)。
: U5 c# ~. s2 j7 L7 B$ ?2 |; g4 X9 O7 X" g7 P: m9 X& P' u9 K
如果上述正常,则换到Server2上重复上面的测试,观察效果。如果成功,则在Server2中执行INSERT再换回到Server1观察是否工作正常。
6 k9 ^+ x$ d+ d如果都没有问题,那么恭喜成功!
' i+ h/ u2 A! g- k/ \
8 C$ C" q9 _- |" U8 F. D8 Z t: N
) d, ?5 B0 W9 e六、破坏性测试 ?0 ~6 N: U, N L# c5 w
==============
E& v3 r, }. U% ^" ~将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测试)。测试完毕后,重新插入网线即可。
9 U+ m+ F1 R3 r
1 T5 ^6 Y N1 u, A
如果你接触不到物理服务器,也就是说不能拔掉网线,那也可以这样测试:
& S% A2 }7 y" n; ^. r* |3 o! S
在Server1或Server2上:
1 a8 Q" `: s+ p( d" v
8 N# T1 [. G/ d/ `" a, O# ps aux | grep ndbd
) N7 y t& z! ?1 \将会看到所有ndbd进程信息:
# |0 k9 D! ~2 n9 J0 O7 R; S* ]9 y q
% F' ^5 M: o- R, [3 O$ k2 jroot 5578 0.0 0.3 6220 1964 ? S 03:14 0:00 ndbd
1 d$ t/ {' P$ K
root 5579 0.0 20.4 492072 102828 ? R 03:14 0:04 ndbd
2 a/ {1 a; u8 Z1 ^# h( t, L7 a8 Sroot 23532 0.0 0.1 3680 684 pts/1 S 07:59 0:00 grep ndbd
/ c8 e; m5 f% ]( i
' x8 H) N# b( B/ c( k; D然后杀掉一个ndbd进程以达到破坏MySQL集群服务器的目的:
% [/ t9 D4 E8 l5 }) s# |0 n. T9 a/ ]
* r6 o6 s9 d, J$ |" V! Q
# kill -9 5578 5579
, G0 J% L7 ^$ V- ~. u+ U7 B
5 W2 L) ?$ \! S! X v
之后在另一台集群服务器上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。
8 _0 w- |$ l3 ^5 M0 a
测试完成后,只需要重新启动被破坏服务器的ndbd进程即可:
5 p5 D5 O" ~- k) s# D$ c
' z- A% `( B$ [* Q3 A- j# ndbd
$ r) L9 x' o6 t2 g
注意!前面说过了,此时是不用加--inital参数的!
: o- ?+ b, N: s5 K- F% @2 }; z% A+ h* n: `7 x
至此,MySQL集群就配置完成了!