一、介紹
如何安裝配置基于2臺服務器的MySQL集群。并且實現任意一臺服務器出現問題或宕機時MySql集群依然能夠繼續運行。加下后續的(keepalived+lvs+mysql cluster文檔),可以實現Mysql雙機的高可用及負載均衡。
安裝環境及軟件包:
vmware workstation 5.5.3
mysql-5.2.3-falcon-alpha.tar.gz
gentoo 2006.1
Server1: 192.168.1.111
Server2:?? 192.168.1.110
二、在Server1和Server2上安裝MySQL
以下步驟需要在Server1和Server2上各做一次
# mv mysql-5.2.3-falcon-alpha.tar.gz?? /tmp/package
# cd /tmp/package
# groupadd mysql
# useradd -g mysql mysql
# tar -zxvf mysql-5.2.3-falcon-alpha.tar.gz
# rm -f mysql-5.2.3-falcon-alpha.tar.gz
# mv mysql-5.2.3-falcon-alpha mysql
# cd mysql
# ./configure --prefix=/usr --with-extra-charsets=complex --with-plugin-ndbcluster --with-plugin-partition --with-plugin-innobase
# make && make install
#ln -s /usr/libexec/ndbd /usr/bin
#ln -s /usr/libexec/ndb_mgmd /usr/bin
#ln -s /usr/libexec/ndb_cpcd /usr/bin
#ln -s /usr/libexec/mysqld /usr/bin
#ln -s /usr/libexec/mysqlmanager /usr/bin
#mysql_install_db --user=mysql
三、安裝并配置節點
以下步驟需要在Server1和Server2上各做一次
1.配置管理節點配置文件:
# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
在config.ini中添加如下內容:
[ndbd default]
NoOfReplicas= 2
MaxNoOfConcurrentOperations= 10000
DataMemory= 80M
IndexMemory= 24M
TimeBetweenWatchDogCheck= 30000
DataDir= /var/lib/mysql-cluster
MaxNoOfOrderedIndexes= 512
StartPartialTimeout=100
StartPartitionedTimeout=100
ArbitrationTimeout=5000
TransactionDeadlockDetectionTimeout=5000
HeartbeatIntervalDbDb=5000
StopOnError=0
[ndb_mgmd default]
DataDir= /var/lib/mysql-cluster
[ndb_mgmd]
Id=1
HostName= 192.168.1.111
[ndb_mgmd]
Id=2
HostName= 192.168.1.110
[ndbd]
Id= 3
HostName= 192.168.1.111
[ndbd]
Id= 4
HostName= 192.168.1.110
[mysqld]
ArbitrationRank=2 (非常重要,全靠有它,才可以形成仲裁競爭,從而當另一個機子當了時,此機還可以有知道partion完整的節點)
[mysqld]
ArbitrationRank=2
[tcp default]
PortNumber= 63132
2.配置通用my.cnf文件,mysqld及ndbd,ndb_mgmd均使用此文件.
# vi /etc/my.cnf
在my.cnf中添加如下內容:
[mysqld]
default-storage-engine=ndbcluster?? 避免在sql語句中還要加入ENGINE=NDBCLUSTER。
ndbcluster
ndb-connectstring=192.168.1.111,192.168.1.110
[ndbd]
connect-string=192.168.1.111,192.168.1.110
[ndb_mgm]
connect-string=192.168.1.111,192.168.1.110
[ndb_mgmd]
config-file=/var/lib/mysql-cluster/config.ini
[mysql_cluster]
ndb-connectstring= 192.168.1.111,192.168.1.110
保存退出后,啟動管理節點Server1為:
# ndb_mgmd --ndb_nodeid=1
啟動管理節點Server2為:
# ndb_mgmd --ndb_nodeid=2
注:在啟動時有一個警告提示
Cluster configuration warning:
?? arbitrator with id 1 and db node with id 3 on same host 192.168.1.111
?? arbitrator with id 2 and db node with id 4 on same host 192.168.1.110
?? Running arbitrator on the same host as a database node may
?? cause complete cluster shutdown in case of host failure.
說節點1和3,2和4的arbitrator一樣,可能引起整個集群失敗。(可以不用放在心上)
四、初始化集群
在Server1中
# ndbd --nodeid=3 --initial
在Server2中
# ndbd --nodeid=4 --iniitial
注:只有在第一次啟動ndbd時或者對config.ini進行改動后才需要使用--initial參數!
五、檢查工作狀態
在任意一臺機子上啟動管理終端:
# ndb_mgm
鍵入show命令查看當前工作狀態:(下面是一個狀態輸出示例)
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.1.111:1186
Cluster Configuration
---------------------
[ndbd(NDB)]????? 2 node(s)
id=3???? @192.168.1.111?? (Version: 5.2.3, Nodegroup: 0, Master)
id=4???? @192.168.1.110?? (Version: 5.2.3, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=1???? @192.168.1.111?? (Version: 5.2.3)
id=2???? @192.168.1.110?? (Version: 5.2.3)
[mysqld(API)]??? 2 node(s)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
ndb_mgm>
如果上面沒有問題,現在開始加入mysqld(API):
注意,這篇文檔對于MySQL并沒有設置root密碼,推薦你自己設置Server1和Server2的MySQL root密碼。
在Server1 中:
#mysqld_safe --ndb_nodeid=5 --user=mysql &
在Server2 中:
#mysqld_safe --ndb_nodeid=6 --user=mysql &
# ndb_mgm -e show
信息如下:
Connected to Management Server at: 192.168.1.111:1186
Cluster Configuration
---------------------
[ndbd(NDB)]????? 2 node(s)
id=3???? @192.168.1.111?? (Version: 5.2.3, Nodegroup: 0, Master)
id=4???? @192.168.1.110?? (Version: 5.2.3, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=1???? @192.168.1.111?? (Version: 5.2.3)
id=2???? @192.168.1.110?? (Version: 5.2.3)
[mysqld(API)]??? 4 node(s)
id=5???? @192.168.1.111?? (Version: 5.2.3)
id=6???? @192.168.1.110?? (Version: 5.2.3)
ok,可以測試了:
在Server1 中
# /usr/local/mysql/bin/mysql -u root -p
>create database aa;
> use aa;
> CREATE TABLE ctest (i INT) ;
> INSERT INTO ctest () VALUES (1);
> SELECT * FROM ctest;
應該可以看到1 row returned信息(返回數值1)。
如果上述正常,則換到Server2,觀察效果。如果成功,則在Server2中執行INSERT再換回到Server1觀察是否工作正常。
如果都沒有問題,那么恭喜成功!
六、破壞性測試
將Server1或Server2的網線拔掉(即ifconfig eth0 down),觀察另外一臺集群服務器工作是否正常(可以使用SELECT查詢測試)。測試完畢后,重新插入網線即可。
注意:在未對集群做任何讀寫操作前,此測試結果無效,因為,集群初始后只在/var/lib/mysql-cluster/下建了幾個空目錄,還沒有正常協同工作,會出現整個所有存儲(ndbd)節點關閉.
也可以這樣測試:在Server1或Server2上:
# ps aux | grep ndbd
將會看到所有ndbd進程信息:
root?????? 5578?? 0.0?? 0.3?? 6220 1964 ????????? S???? 03:14??? 0:00 ndbd
root?????? 5579?? 0.0 20.4 492072 102828 ?????? R???? 03:14??? 0:04 ndbd
root????? 23532?? 0.0?? 0.1?? 3680?? 684 pts/1???? S???? 07:59??? 0:00 grep ndbd
然后殺掉一個ndbd進程以達到破壞MySQL集群服務器的目的:
# kill -9 5578 5579
之后在另一臺集群服務器上使用SELECT查詢測試。并且在管理節點服務器的管理終端中執行show命令會看到被破壞的那臺服務器的狀態。
測試完成后,只需要重新啟動被破壞服務器的ndbd進程即可:
# ndbd --ndb_nodeid=此存儲節點的id
注意!前面說過了,此時是不用加--inital參數的!
至此,MySQL雙機集群就配置完成了!