天天看點

MySQL Cluster搭建與測試

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 環境搭建

搭建 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節點伺服器也是相同的,都執行如下安裝步驟。

[[email protected] ~]# wget https://downloads.skysql.com/archives/mysql-cluster-gpl-7.2/mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz      
[[email protected] ~]# groupadd mysql
[[email protected] ~]# useradd -r -g mysql mysql
[[email protected] ~]# tar xf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz -C /usr/local/
[[email protected] ~]# cd /usr/local/
[[email protected] local]# ln -s mysql-cluster-gpl-7.2.4-linux2.6-x86_64 mysql
[[email protected] local]# cd mysql
[[email protected] mysql]# chown -R mysql .
[[email protected] mysql]# chgrp -R mysql .
[[email protected] mysql]# mkdir /data/mysql
[[email protected] mysql]# chown -R mysql.mysql /data/mysql/
[[email protected] mysql]# \cp support-files/my-large.cnf /etc/my.cnf 
[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql      
[[email protected] mysql]# chown -R root .
[[email protected] mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[[email protected] mysql]# chmod 755 /etc/init.d/mysqld 
[[email protected] mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile    #添加環境變量,執行指令友善一點
[[email protected] 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節點操作一樣,如下:

[[email protected] ~]# groupadd mysql
[[email protected] ~]# useradd -r -g mysql mysql
[[email protected] ~]# tar xf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz -C /usr/local/
[[email protected] ~]# cd /usr/local/
[[email protected] local]# ln -s mysql-cluster-gpl-7.2.4-linux2.6-x86_64 mysql
[[email protected] local]# cd mysql
[[email protected] mysql]# chown -R mysql .
[[email protected] mysql]# chgrp -R mysql .
[[email protected] mysql]# mkdir /data/mysql
[[email protected] mysql]# chown -R mysql.mysql /data/mysql/
[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql      
[[email protected] mysql]# chown -R root .
[[email protected] mysql]# \cp support-files/my-large.cnf /etc/my.cnf 
[[email protected] mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[[email protected] mysql]# chmod 755 /etc/init.d/mysqld 
[[email protected] mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[[email protected] mysql]# source /root/.bash_profile 
[[email protected] mysql]#       
[[email protected] 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下面)并且添加環境變量就可以了。

[[email protected] ~]# mkdir /usr/local/mysql/bin -p                                      
[[email protected] ~]# scp 192.168.0.70:/usr/local/mysql/bin/ndb_mgm /usr/local/mysql/bin/
[email protected]'s password: 
ndb_mgm                                                                                                            100% 6213KB   6.1MB/s   00:00    
[[email protected] ~]# scp 192.168.0.70:/usr/local/mysql/bin/ndb_mgmd /usr/local/mysql/bin/
[email protected]'s password: 
ndb_mgmd                                                                                                           100%   14MB   6.9MB/s   00:02    
[[email protected] ~]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[[email protected] ~]# source /root/.bash_profile 
[[email protected] ~]#       

管理節點配置:

1.在/data/建立目錄mysql-cluster,該目錄會存放相關日志檔案,以及pid号。并在目錄中建立配置檔案config.ini

[[email protected] ~]# mkdir /data/mysql-cluster
[[email protected] ~]# cd /data/mysql-cluster/
[[email protected] mysql-cluster]# touch config.ini
      

2.根據我們上面提供的環境,config.ini檔案配置如下(在安裝目錄下面也有樣例配置檔案可以參考),詳細的配置參數請閱讀這裡MySQL Cluster配置詳解

[[email protected] ~]# 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).      
[[email protected] ~]#      

在上面的配置檔案中,包括很多的組,組名用"[]"括起來,這裡我們最關心的是3類節點組的配置,分别定義如下:

[NDB_MGMD] 表示管理節點的配置,隻能有一個。

[NDBD DEFAULT] 表示每個資料節點的預設配置,在每個節點的[NDBD]中不用再寫這些選項,隻能有一個。

[NDBD] 表示每個資料節點的配置,可以有多個。

[MYSQLD] 表示SQL節點的配置,可以有多個,分别寫上不同的SQL節點的ip位址;也可以不用寫,隻保留一個空節點,表示任意一個ip位址都可以進行通路。此節點的個數表明了可以用來連接配接資料節點的SQL節點總數。

每個節點都有一個獨立的id号,可以填寫,比如nodeid=2,(老版本使用id,新版本已經不使用id辨別了)也可以不用填寫,系統會按照配置檔案的填寫順序自動配置設定。

開始使用Cluster

上面我們都已經配置完畢了,下面說明啟動,關閉和使用方法

啟動順序為:管理節點->資料節點->SQL節點(很重要)

(1)啟動管理節點:

[[email protected] ~]# ndb_mgmd -f /data/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.5.19 ndb-7.2.4
[[email protected] ~]# netstat -ntlp | grep 1186
tcp        0      0 0.0.0.0:1186                0.0.0.0:*                   LISTEN      1329/ndb_mgmd       
[[email protected] ~]# 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
[[email protected] ~]#       

(2)啟動NDB(資料節點)

注意:隻是在第一次啟動或在備份/恢複或配置變化後重新開機ndbd時,才加–initial參數!原因在于,該參數會使節點删除由早期ndbd執行個體建立的,用于恢複的任何檔案,包括用于恢複的日志檔案。

[[email protected] ~]# 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
[[email protected] ~]#       
[[email protected] ~]# 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
[[email protected] ~]#       

檢視是否有相關程序:

[[email protected] ~]# 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
[[email protected] ~]#       
[[email protected] ~]# 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
[[email protected] ~]#       

ndbd程序是使用NDB存儲引擎處理表中資料的程序。通過該程序,存儲節點能夠實作分布式事務管理,節點恢複,線上備份相關任務。

(3)啟動SQL節點(啟動mysql服務)

本文中是192.168.0.60,192.168.0.70兩個節點

[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL                                             [  OK  ]
[[email protected] ~]#       
[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL.....                                        [  OK  ]
[[email protected] ~]#       

(4)節點全部啟動成功後,在管理節點使用ndb_mgm工具的show指令檢視叢集狀态:

[[email protected] ~]# 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服務停止:

[[email protected] ~]# /etc/init.d/mysqld stop
Shutting down MySQL..                                      [  OK  ]
[[email protected] ~]#       

(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程序停止:

[[email protected] ~]# 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
[[email protected] ~]# pkill -9 ndbd
[[email protected] ~]# ps -ef | grep ndbd
root      2371  1300  0 23:07 pts/0    00:00:00 grep ndbd
[[email protected] ~]#       

(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,按照前面的步驟重新啟動叢集:

[[email protected] ~]# grep 'NoOfReplicas' /data/mysql-cluster/config.ini 
NoOfReplicas=2                        #每個資料節點的鏡像數量
[[email protected] ~]#       

最後發現無法啟動資料節點,檢視錯誤日志如下:

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,将會丢失所有資料,好吧,記住這個坑,下次就不會踩進去了。

[[email protected] ~]# 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
[[email protected] ~]#       
[[email protected] ~]# 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
[[email protected] ~]#       

重建立表插入資料再測試吧,囧..............

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狀态:

[[email protected] ~]# 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,看是否還能通路資料:

[[email protected] ~]# 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
[[email protected] ~]# pkill -9 ndbd
[[email protected] ~]# ps -ef | grep ndbd
root      2164  1275  0 23:45 pts/0    00:00:00 grep ndbd
[[email protected] ~]#       
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節點關閉

[[email protected] ~]# /etc/init.d/mysqld stop
Shutting down MySQL..                                      [  OK  ]
[[email protected] ~]#       

(2)(NDB)資料節點關閉

[[email protected] ~]# 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
[[email protected] ~]#       

(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存儲引擎,不僅對資料進行了水準切分,還對資料進行了跨節點備援。既解決了資料庫的擴充問題,同時也在很大程度上提高了資料庫整體可用性。

參考資料:

http://www.xuchanggang.cn/archives/632.html

http://blog.csdn.net/mchdba/article/details/10544585

作者:Atlas

出處:Atlas的部落格 http://www.cnblogs.com/gomysql

您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。如果您需要技術支援,本人亦提供有償服務。

繼續閱讀