MySQL Cluster是一個基於NDB Cluster存儲引擎的完整的分布式數據庫系統。不僅僅具有高可用性,而且可以自動切分數據,冗余數據等高級功能。和Oracle Real Cluster Application不太一樣的是,MySQL Cluster 是一個Share Nothing的架構,各個MySQL Server之間並不共享任何數據,高度可擴展以及高度可用方面的突出表現是其最大的特色。雖然目前還只是MySQL家族中的一個新興產品,但是已經有不少企業正在積極的嘗試使用了。但是好像還不是很多,我常常聽見人家問這玩意,包括一些企業,雖然該產品還不是很成熟,還有很多缺陷,但是我還是打算學習學習^_^
MySQL Cluster 介紹
簡單的說,MySQL Cluster 實際上是在無共享存儲設備的情況下實現的一種完全分布式數據庫系統,其主要通過 NDB Cluster(簡稱 NDB)存儲引擎來實現。MySQL Cluster 剛剛誕生的時候可以說是一個可以對數據進行持久化的內存數據庫,所有數據和索引都必須裝載在內存中才能夠正常運行,但是最新的 MySQL Cluster 版本已經可以做到僅僅將所有索引裝載在內存中即可,實際的數據可以不用全部裝載到內存中。
一個 MySQL Cluster 的環境主要由以下三部分組成:
(1)SQL 層的 SQL 服務器節點(后面簡稱為 SQL 節點);也就是我們常說的MySQL Server。主要負責實現一個數據庫在存儲層之上的所有事情,比如連接管理,Query 優化和響應 ,Cache 管理等等,只有存儲層的工作交給了NDB 數據節點去處理了。也就是說,在純粹的MySQL Cluster 環境中的SQL 節點,可以被認為是一個不需要提供任何存儲引擎的MySQL服務器,因為他的存儲引擎有Cluster 環境中的NDB 節點來擔任。所以,SQL 層各MySQL服務器的啟動與普通的MySQL Server 啟動也有一定的區別,必須要添加ndbcluster參數選項才行。我們可以添加在my.cnf配置文件中,也可以通過啟動命令行來指定。
(2)Storage 層的 NDB 數據節點;也就是上面說的NDB Cluster。最初的NDB是一個內存式存儲引擎,當然也會將數據持久化到存儲設備上。但是最新的NDB Cluster存儲引擎已經改進了這一點,可以選擇數據是全部加載到內存中還是僅僅加載索引數據。NDB 節點主要是實現底層數據存儲功能,來保存Cluster 的數據。每一個Cluster節點保存完整數據的一個fragment,也就是一個數據分片(或者一份完整的數據,視節點數目和配置而定),所以只要配置得當,MySQL Cluster在存儲層不會出現單點的問題。一般來說,NDB 節點被組織成一個一個的NDB Group,一個 NDB Group實際上就是一組存有完全相同的物理數據的NDB節點群。
上面提到了NDB 各個節點對數據的組織,可能每個節點都存有全部的數據也可能只保存一部分數據,主要是受節點數目和參數來控制的。首先在 MySQL Cluster主配置文件(在管理節點上面,一般為 config.ini)中,有一個非常重要的參數叫NoOfReplicas,這個參數指定了每一份數據被冗余存儲在不同節點上面的份數,該參數一般至少應該被設置成2,也只需要設置成2就可以了。因為正常來說,兩個互為冗余的節點同時出現故障的概率還是非常小的,當然如果機器和內存足夠多的話,也可以繼續增大來更進一步減小出現故障的概率。此外,一個節點上面是保存所有的數據還是一部分數據還受到存儲節點數目的限制。NDB 存儲引擎首先保證NoOfReplicas參數配置的要求來使用存儲節點,對數據進行冗余,然后再根據節點數目將數據分段來繼續使用多余的NDB節點。分段的數目為節點總數除以NoOfReplicas 所得。
(3)負責管理各個節點的 Manage 節點主機;管理節點負責整個Cluster集群中各個節點的管理工作,包括集群的配置,啟動關閉各節點,對各個節點進行常規維護,以及實施數據的備份恢復等。管理節點會獲取整個Cluster環境中各節點的狀態和錯誤信息,並且將各 Cluster 集群中各個節點的信息反饋給整個集群中其他的所有節點。由於管理節點上保存了整個Cluster 環境的配置,同時擔任了集群中各節點的基本溝通工作,所以他必須是最先被啟動的節點。
下面是一幅 MySQL Cluster 的基本架構圖(出自 MySQL 官方文檔手冊):
通過圖中我們可以更清晰的了解整個 MySQL Cluster 環境各個節點以及客戶端應用之間的關系。
MySQL Cluster 環境搭建
搭建 MySQL Cluster首先需要至少一個管理節點主機來實現管理功能,一個SQL節點主機來實現MySQL server功能和兩個ndb節點主機實現NDB Cluster的功能。我在這里測試使用雙SQL節點來搭建測試環境,具體信息如下:
1、服務器准備
a) MySQL節點1 192.168.0.70 b) MySQL節點2 192.168.0.60 c) ndb節點1 192.168.0.50 d) ndb節點2 192.168.0.40 e) 管理節點 192.168.0.30
2、軟件安裝
測試環境(5台服務器均一樣,不是必須的,所以服務器均已關閉iptables和selinux,生產環境請自行開放相關端口)
[root@localhost ~]# uname -a Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
安裝 MySQL 節點:
sql節點1: 192.168.0.70
sql節點2: 192.168.0.60
下載安裝包:mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz,我這里使用二進制編譯好了的,同學們可以自己下載源碼包編譯。這里操作一台SQL節點服務器,另外一台SQL節點服務器也是相同的,都執行如下安裝步驟。
[root@192.168.0.70 ~]# wget https://downloads.skysql.com/archives/mysql-cluster-gpl-7.2/mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz
[root@192.168.0.70 ~]# groupadd mysql [root@192.168.0.70 ~]# useradd -r -g mysql mysql [root@192.168.0.70 ~]# tar xf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz -C /usr/local/ [root@192.168.0.70 ~]# cd /usr/local/ [root@192.168.0.70 local]# ln -s mysql-cluster-gpl-7.2.4-linux2.6-x86_64 mysql [root@192.168.0.70 local]# cd mysql [root@192.168.0.70 mysql]# chown -R mysql . [root@192.168.0.70 mysql]# chgrp -R mysql . [root@192.168.0.70 mysql]# mkdir /data/mysql [root@192.168.0.70 mysql]# chown -R mysql.mysql /data/mysql/ [root@192.168.0.70 mysql]# \cp support-files/my-large.cnf /etc/my.cnf [root@192.168.0.70 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql
[root@192.168.0.70 mysql]# chown -R root . [root@192.168.0.70 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@192.168.0.70 mysql]# chmod 755 /etc/init.d/mysqld [root@192.168.0.70 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile #添加環境變量,執行命令方便一點 [root@192.168.0.70 mysql]# source /root/.bash_profile
SQL節點配置
修改/etc/my.cnf配置文件,追加如下配置
[mysqld] datadir=/data/mysql basedir= /usr/local/mysql ndbcluster # 運行NDB存儲引擎 ndb-connectstring=192.168.0.30 # 管理節點 [MYSQL_CLUSTER] ndb-connectstring=192.168.0.30 #管理節點
NDB節點安裝(數據節點)
數據節點1: 192.168.0.50
數據節點2: 192.168.0.40
如果希望盡可能的各環境保持一致,建議在NDB節點也和SQL節點一樣安裝整個帶有 NDB Cluster 存儲引擎的MySQL Server。(NDB節點可以不用初始化數據,自己已經測試,但是我依然會初始化)安裝細節和上面的SQL節點完全一樣。兩台NDB節點操作一樣,如下:
[root@192.168.0.40 ~]# groupadd mysql [root@192.168.0.40 ~]# useradd -r -g mysql mysql [root@192.168.0.40 ~]# tar xf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz -C /usr/local/ [root@192.168.0.40 ~]# cd /usr/local/ [root@192.168.0.40 local]# ln -s mysql-cluster-gpl-7.2.4-linux2.6-x86_64 mysql [root@192.168.0.40 local]# cd mysql [root@192.168.0.40 mysql]# chown -R mysql . [root@192.168.0.40 mysql]# chgrp -R mysql . [root@192.168.0.40 mysql]# mkdir /data/mysql [root@192.168.0.40 mysql]# chown -R mysql.mysql /data/mysql/ [root@192.168.0.40 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql
[root@192.168.0.40 mysql]# chown -R root . [root@192.168.0.40 mysql]# \cp support-files/my-large.cnf /etc/my.cnf [root@192.168.0.40 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@192.168.0.40 mysql]# chmod 755 /etc/init.d/mysqld [root@192.168.0.40 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile [root@192.168.0.40 mysql]# source /root/.bash_profile [root@192.168.0.40 mysql]#
[root@192.168.0.40 mysql]# mkdir /data/mysql-cluster/data -p
上面這個目錄用來存放NDB節點的數據,在管理節點里面也要配置為該目錄,配置其他的目錄會報錯,說無法創建各種日志文件。上面提到的/data/mysql是用來在沒使用NDB時存放的數據,和平時我們使用的mysql沒有區別。
NDB節點配置(數據節點):
和SQL節點是一樣的,修改/etc/my.cnf,追加如下內容:
[mysqld] datadir=/data/mysql basedir= /usr/local/mysql ndbcluster # 運行NDB存儲引擎 ndb-connectstring=192.168.0.30 # 管理節點 [MYSQL_CLUSTER] ndb-connectstring=192.168.0.30 #管理節點
安裝管理節點
管理節點所需要的安裝更簡單,實際上只需要 ndb_mgm 和ndb_mgmd兩個程序即可,這兩個可執行程序可以在上面的MySQL節點的MySQL安裝目錄中的bin目錄下面找到。將這兩個程序copy到管理節點上面合適的位置(自行考慮,我一般會放在/usr/local/mysql/bin下面)並且添加環境變量就可以了。
[root@192.168.0.30 ~]# mkdir /usr/local/mysql/bin -p [root@192.168.0.30 ~]# scp 192.168.0.70:/usr/local/mysql/bin/ndb_mgm /usr/local/mysql/bin/ root@192.168.0.70's password: ndb_mgm 100% 6213KB 6.1MB/s 00:00 [root@192.168.0.30 ~]# scp 192.168.0.70:/usr/local/mysql/bin/ndb_mgmd /usr/local/mysql/bin/ root@192.168.0.70's password: ndb_mgmd 100% 14MB 6.9MB/s 00:02 [root@192.168.0.30 ~]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile [root@192.168.0.30 ~]# source /root/.bash_profile [root@192.168.0.30 ~]#
管理節點配置:
1.在/data/創建目錄mysql-cluster,該目錄會存放相關日志文件,以及pid號。並在目錄中創建配置文件config.ini
[root@192.168.0.30 ~]# mkdir /data/mysql-cluster [root@192.168.0.30 ~]# cd /data/mysql-cluster/ [root@192.168.0.30 mysql-cluster]# touch config.ini
2.根據我們上面提供的環境,config.ini文件配置如下(在安裝目錄下面也有樣例配置文件可以參考),詳細的配置參數請閱讀這里MySQL Cluster配置詳解
[root@192.168.0.30 ~]# cat /data/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=1 #每個數據節點的鏡像數量,通常最低設置為2,否則就沒有意義了,這里是方便后面測試。 DataMemory=64M #每個數據節點中給數據分配的內存 IndexMemory=16M #每個數據節點中給索引分配的內存 #管理節點 [NDB_MGMD] nodeid=1 hostname=192.168.0.30 #管理節點ip datadir=/data/mysql-cluster #管理節點數據目錄,存放相關日志,以及pid文件 #第一個 ndbd 節點: [NDBD] nodeid=2 hostname=192.168.0.50 #數據節點ip地址 datadir=/data/mysql-cluster/data #第二個 ndbd 節點: [NDBD] nodeid=3 hostname=192.168.0.40 datadir=/data/mysql-cluster/data #NDB點數據存放目錄 # SQL node options: [MySQLD] nodeid=4 hostname=192.168.0.70 #SQL節點ip地址 [MySQLD] nodeid=5 hostname=192.168.0.60 [MySQLD] 這里保留了一個空節點。否則停止NDB會報錯:No free node id found for ndbd(NDB).
[root@192.168.0.30 ~]#
在上面的配置文件中,包括很多的組,組名用"[]"括起來,這里我們最關心的是3類節點組的配置,分別定義如下:
[NDB_MGMD] 表示管理節點的配置,只能有一個。
[NDBD DEFAULT] 表示每個數據節點的默認配置,在每個節點的[NDBD]中不用再寫這些選項,只能有一個。
[NDBD] 表示每個數據節點的配置,可以有多個。
[MYSQLD] 表示SQL節點的配置,可以有多個,分別寫上不同的SQL節點的ip地址;也可以不用寫,只保留一個空節點,表示任意一個ip地址都可以進行訪問。此節點的個數表明了可以用來連接數據節點的SQL節點總數。
每個節點都有一個獨立的id號,可以填寫,比如nodeid=2,(老版本使用id,新版本已經不使用id標識了)也可以不用填寫,系統會按照配置文件的填寫順序自動分配。
開始使用Cluster
上面我們都已經配置完畢了,下面說明啟動,關閉和使用方法
啟動順序為:管理節點->數據節點->SQL節點(很重要)
(1)啟動管理節點:
[root@192.168.0.30 ~]# ndb_mgmd -f /data/mysql-cluster/config.ini MySQL Cluster Management Server mysql-5.5.19 ndb-7.2.4 [root@192.168.0.30 ~]# netstat -ntlp | grep 1186 tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 1329/ndb_mgmd [root@192.168.0.30 ~]# ps -ef | grep ndb_mgmd | grep -v grep root 1329 1 0 21:50 ? 00:00:00 ndb_mgmd -f /data/mysql-cluster/config.ini [root@192.168.0.30 ~]#
(2)啟動NDB(數據節點)
注意:只是在第一次啟動或在備份/恢復或配置變化后重啟ndbd時,才加–initial參數!原因在於,該參數會使節點刪除由早期ndbd實例創建的,用於恢復的任何文件,包括用於恢復的日志文件。
[root@192.168.0.40 ~]# ndbd --initial 2014-04-15 21:51:51 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2014-04-15 21:51:51 [ndbd] INFO -- Angel allocated nodeid: 3 [root@192.168.0.40 ~]#
[root@192.168.0.50 ~]# ndbd --initial 2014-04-15 21:52:29 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2014-04-15 21:52:29 [ndbd] INFO -- Angel allocated nodeid: 2 [root@192.168.0.50 ~]#
查看是否有相關進程:
[root@192.168.0.50 ~]# ps -ef | grep ndbd | grep -v grep root 1879 1 0 21:52 ? 00:00:00 ndbd --initial root 1880 1879 2 21:52 ? 00:00:03 ndbd --initial [root@192.168.0.50 ~]#
[root@192.168.0.40 ~]# ps -ef | grep ndbd | grep -v grep root 2266 1 0 21:51 ? 00:00:00 ndbd --initial root 2267 2266 1 21:51 ? 00:00:04 ndbd --initial [root@192.168.0.40 ~]#
ndbd進程是使用NDB存儲引擎處理表中數據的進程。通過該進程,存儲節點能夠實現分布式事務管理,節點恢復,在線備份相關任務。
(3)啟動SQL節點(啟動mysql服務)
本文中是192.168.0.60,192.168.0.70兩個節點
[root@192.168.0.60 ~]# /etc/init.d/mysqld start Starting MySQL [ OK ] [root@192.168.0.60 ~]#
[root@192.168.0.70 ~]# /etc/init.d/mysqld start Starting MySQL..... [ OK ] [root@192.168.0.70 ~]#
(4)節點全部啟動成功后,在管理節點使用ndb_mgm工具的show命令查看集群狀態:
[root@192.168.0.30 ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.50 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) id=3 @192.168.0.40 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.30 (mysql-5.5.19 ndb-7.2.4) [mysqld(API)] 3 node(s) id=4 @192.168.0.70 (mysql-5.5.19 ndb-7.2.4) id=5 @192.168.0.60 (mysql-5.5.19 ndb-7.2.4) id=6 (not connected, accepting connect from any host) ndb_mgm>
ndb_mgm工具是ndb_mgmd(MySQL Cluster Server)的客戶端管理工具,通過該工具可以方便的檢查Cluster的狀態,啟動備份,關閉等功能。更詳細的方法可以通過ndb_mgm --help命令來進行查看。
從上面顯示的狀態可以看出如下信息。
(1)集群目前的管理服務器端口是1186
Connected to Management Server at: localhost:1186
(2)集群的數據節點(NDB)有2個,詳細信息:
[ndbd(NDB)] 2 node(s) id=2 @192.168.0.50 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) id=3 @192.168.0.40 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 1)
(3)集群的管理節點有一個,詳細信息:
[ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.30 (mysql-5.5.19 ndb-7.2.4)
(4)SQL節點有3個,目前處於連接狀態的有2個,詳細信息:
[mysqld(API)] 3 node(s) id=4 @192.168.0.70 (mysql-5.5.19 ndb-7.2.4) id=5 @192.168.0.60 (mysql-5.5.19 ndb-7.2.4) id=6 (not connected, accepting connect from any host)
到這里MySQL Cluster就已經搭建完成了。接下來就到測試時間咯。^_^
MySQL Cluster 高可用測試
成功啟動后,下面來測試一下Cluster的功能。如果要使用cluster,則表的引擎必須為NDB,其他類型存儲引擎的數據不會保存到數據節點中。對於cluster的一個重要功能就是防止單點故障。我們下面對這些問題分別來進行測試。
1.NDB存儲引擎測試
(1)在任意一個SQL節點(我這里選擇192.168.0.70)的test庫中創建測試表t1,設置存儲引擎為NDB,並插入兩條測試數據:
mysql> create table t1 ( -> id int, -> name varchar(20) -> ) -> engine=ndb -> ; Query OK, 0 rows affected (0.44 sec) mysql> insert into t1 select 1,'yayun'; Query OK, 1 row affected (0.11 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 1,'atlas'; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(2)在另外一個SQL節點(192.168.0.60)查詢test庫中t1表,結果如下:
mysql> select * from test.t1; +------+-------+ | id | name | +------+-------+ | 1 | atlas | | 1 | yayun | +------+-------+ 2 rows in set (0.08 sec) mysql>
顯然,兩個SQL節點查詢的數據時一致的。
(3)在SQL節點192.168.0.70上把測試表t1引擎改為MyISAM,再次插入測試數據:
mysql> alter table t1 engine=myisam; Query OK, 2 rows affected (0.50 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 2,'good boy'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(4)在SQL節點192.168.0.60上再次查詢表t1,結果如下:
mysql> select * from t1; ERROR 1146 (42S02): Table 'test.t1' doesn't exist mysql> show tables; Empty set (0.04 sec) mysql>
直接報錯,說表不存在了。(老版本是報ERROR 1412:Table definition ha changed,please retry transaction)
(5)我們再次改回NDB引擎。
mysql> alter table t1 engine=ndb; Query OK, 3 rows affected (0.25 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
(6)再次進行查詢如下:
mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | atlas | | 2 | good boy | | 1 | yayun | +------+----------+ 3 rows in set (0.02 sec) mysql>
發現表t1的數據再次同步到了數據節點。所有SQL節點又都可以正常查詢數據。
2.單點故障測試
對於任意一種節點,都存在單點故障的可能性。在cluster的設置過程中,應該盡量對每一類節點設置冗余,以防止單點故障發生時造成的應用終端。對於管理節點,一般不需要特殊的配置,只需要將管理工具和配置文件防止多台服務器上即可。下面我們測試一下SQL節點和NDB(數據節點)的單點故障。
SQL節點發生單點故障
對於上面的測試環境中,我們設置了兩個SQL節點,應用從兩個節點對數據訪問都可以得到一致的結果。如果有一個節點故障,系統會正常運行嗎?我們測試便知。
(1)將SQL節點192.168.0.60上的MySQL服務停止:
[root@192.168.0.60 ~]# /etc/init.d/mysqld stop Shutting down MySQL.. [ OK ] [root@192.168.0.60 ~]#
(2)查看cluster狀態:
ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.50 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) id=3 @192.168.0.40 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.30 (mysql-5.5.19 ndb-7.2.4) [mysqld(API)] 3 node(s) id=4 @192.168.0.70 (mysql-5.5.19 ndb-7.2.4) id=5 (not connected, accepting connect from 192.168.0.60) id=6 (not connected, accepting connect from any host) ndb_mgm>
可以發現SQL節點192.168.0.60已經斷開,但是另外一個SQL節點192.168.0.70仍然處於正常狀態。
(3)從SQL節點192.168.0.70上查看表t1,結果如下:
mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 2 | good boy | | 1 | yayun | | 1 | atlas | +------+----------+ 3 rows in set (0.01 sec) mysql>
顯然,SQL節點的單點故障並沒有引起數據查詢的故障。對於應用來說,需要改變的就是將以前對故障節點的訪問改為對非故障節點的訪問(SQL節點前面可以掛LVS,然后做各種檢測)
NDB(數據節點)的單點故障
在這個測試環境中,數據節點也是兩個,那么他們對數據的存儲是互相鏡像還是一份數據分成幾塊存儲呢?(類似磁盤陣列RAID1還是RAID0)?這個答案關鍵在於配置文件中[NDBD DEFAULT]組中的NoOfReplicas參數,如果這個參數等於1,表示只有一份數據,但是分成N塊分別存儲在N個數據節點上,如果該值等於2,則表示數據被分成N/2,每塊數據都有兩個備份,這樣即使有任意一個節點發生故障,只要它的備份節點正常,數據就可以正常查詢。
在下面的例子中,先將兩個數據節點之一停止,訪問表t1,看能否正常訪問;然后將NoOfReplicas配置改為2,這時,數據節點實際上已經互為鏡像,保存了兩份。這時再停止任意一個數據節點,看是否能訪問表t1。
(1)將數據節點192.168.0.40上的NDB進程停止:
[root@192.168.0.40 ~]# ps -ef | grep ndbd root 2266 1 0 21:51 ? 00:00:00 ndbd --initial root 2267 2266 1 21:51 ? 00:01:03 ndbd --initial root 2368 1300 0 23:06 pts/0 00:00:00 grep ndbd [root@192.168.0.40 ~]# pkill -9 ndbd [root@192.168.0.40 ~]# ps -ef | grep ndbd root 2371 1300 0 23:07 pts/0 00:00:00 grep ndbd [root@192.168.0.40 ~]#
(2)在任意節點,這里是192.168.0.70查看表t1的數據:
mysql> select * from t1; ERROR 1296 (HY000): Got error 157 'Unknown error code' from NDBCLUSTER mysql>
顯然無法訪問表t1的數據了。
(3)將配置文件中的NoOfReplicas改為2,按照前面的步驟重新啟動集群:
[root@192.168.0.30 ~]# grep 'NoOfReplicas' /data/mysql-cluster/config.ini NoOfReplicas=2 #每個數據節點的鏡像數量 [root@192.168.0.30 ~]#
最后發現無法啟動數據節點,查看錯誤日志如下:
Time: Tuesday 15 April 2014 - 23:22:51 Status: Permanent error, external action needed Message: Invalid configuration received from Management Server (Configuration error) Error: 2350 Error data: Illegal configuration change. Initial start needs to be performed when changing no of replicas (1 != 2) Error object: DBDIH (Line: 4820) 0x00000002 Program: ndbd
看來NoOfReplicas參數無法臨時更改,我們開始就需要設置好,不要到后面才想到更改,那時就悲劇了。
如果重新ndbd --initial,將會丟失所有數據,好吧,記住這個坑,下次就不會踩進去了。
[root@192.168.0.40 ~]# ndbd --initial 2014-04-15 23:36:08 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2014-04-15 23:36:08 [ndbd] INFO -- Angel allocated nodeid: 3 [root@192.168.0.40 ~]#
[root@192.168.0.50 ~]# ndbd --initial 2014-04-15 23:38:50 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2014-04-15 23:38:50 [ndbd] INFO -- Angel allocated nodeid: 2 [root@192.168.0.50 ~]#
重新建表插入數據再測試吧,囧..............
mysql> create table t1 (name varchar(20))engine=ndb; Query OK, 0 rows affected (0.31 sec) mysql> insert into t1 select 'yayun'; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 'atlas'; Query OK, 1 row affected (0.06 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t1; +-------+ | name | +-------+ | atlas | | yayun | +-------+ 2 rows in set (0.01 sec) mysql>
查看cluster狀態:
[root@192.168.0.30 ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.50 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) id=3 @192.168.0.40 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.30 (mysql-5.5.19 ndb-7.2.4) [mysqld(API)] 3 node(s) id=4 @192.168.0.70 (mysql-5.5.19 ndb-7.2.4) id=5 @192.168.0.60 (mysql-5.5.19 ndb-7.2.4) id=6 (not connected, accepting connect from any host) ndb_mgm>
一切正常。我們現在停止NDB節點192.168.0.50,看是否還能訪問數據:
[root@192.168.0.50 ~]# ps -ef | grep ndbd root 2119 1 0 23:38 ? 00:00:00 ndbd --initial root 2120 2119 2 23:38 ? 00:00:10 ndbd --initial root 2161 1275 0 23:45 pts/0 00:00:00 grep ndbd [root@192.168.0.50 ~]# pkill -9 ndbd [root@192.168.0.50 ~]# ps -ef | grep ndbd root 2164 1275 0 23:45 pts/0 00:00:00 grep ndbd [root@192.168.0.50 ~]#
ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.0.50) id=3 @192.168.0.40 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.30 (mysql-5.5.19 ndb-7.2.4) [mysqld(API)] 3 node(s) id=4 @192.168.0.70 (mysql-5.5.19 ndb-7.2.4) id=5 @192.168.0.60 (mysql-5.5.19 ndb-7.2.4) id=6 (not connected, accepting connect from any host) ndb_mgm>
看見只有一個NDB節點在運行。
訪問任意SQL節點查詢數據,我這里用192.168.0.70,查詢結果如下:
mysql> select * from t1; +-------+ | name | +-------+ | atlas | | yayun | +-------+ 2 rows in set (0.01 sec) mysql>
顯然掛掉一個NDB節點不影響我們正常的數據查詢,數據節點的冗余同樣防止了單點故障。
MySQL Cluster集群的關閉
關閉順序:SQL節點->數據節點->管理節點(在MySQL Cluster環境中,NDB節點和管理節點的關閉都可以在管理節點的管理程序中完成,也可以分節點關閉,但是SQL節點卻沒辦法。所以,在關閉整個MySQL Cluster環境或者關閉某個SQL節點的時候,首先必須到SQL節點主機上來關閉SQL節點程序。關閉方法和MySQL Server的關閉一樣。)
(1)SQL節點關閉
[root@192.168.0.70 ~]# /etc/init.d/mysqld stop Shutting down MySQL.. [ OK ] [root@192.168.0.70 ~]#
(2)(NDB)數據節點關閉
[root@192.168.0.50 ~]# ndbd stop 2014-04-15 23:54:36 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2014-04-15 23:54:36 [ndbd] INFO -- Angel allocated nodeid: 2 [root@192.168.0.50 ~]#
(3)管理節點關閉
ndb_mgm> shutdown Node 2: Cluster shutdown initiated Node 3: Cluster shutdown initiated 3 NDB Cluster node(s) have shutdown. Disconnecting to allow management server to shutdown. Node 3: Node shutdown completed. ndb_mgm>
總結:
慢慢的學習過程中,踩了不少坑,比如參數NoOfReplicas無法臨時更改,管理節點配置文件中如果不多預留一個[MySQLD],在停止NDB節點時會報錯,以及配置文件中的[NDBD]段落中的datadir指定的目錄在數據節點的服務器上面要存在。以及selinux,iptables等相關問題。總之收獲滿滿。后續的文章中將會介紹mysql cluster的日常維護,包括數據備份,數據恢復,日志管理等。MySQL Cluster的核心在於NDB Cluster存儲引擎,不僅對數據進行了水平切分,還對數據進行了跨節點冗余。既解決了數據庫的擴展問題,同時也在很大程度上提高了數據庫整體可用性。
參考資料: