MySQL Cluster 集羣

本文轉載 http://www.cnblogs.com/gomysql/p/3664783.htmlhtml

 

MySQL Cluster是一個基於NDB Cluster存儲引擎的完整的分佈式數據庫系統。不只僅具備高可用性,並且能夠自動切分數據,冗餘數據等高級功能。和Oracle Real Cluster Application不太同樣的是,MySQL Cluster 是一個Share Nothing的架構,各個MySQL Server之間並不共享任何數據,高度可擴展以及高度可用方面的突出表現是其最大的特點。雖然目前還只是MySQL家族中的一個新興產品,可是已經有很多企業正在積極的嘗試使用了。可是好像還不是不少,我經常聽見人家問這玩意,包括一些企業,雖然該產品還不是很成熟,還有不少缺陷,可是我仍是打算學習學習^_^node

MySQL Cluster 介紹mysql

簡單的說,MySQL Cluster 其實是在無共享存儲設備的狀況下實現的一種徹底分佈式數據庫系統,其主要經過 NDB Cluster(簡稱 NDB)存儲引擎來實現。MySQL Cluster 剛剛誕生的時候能夠說是一個能夠對數據進行持久化的內存數據庫,全部數據和索引都必須裝載在內存中才可以正常運行,可是最新的 MySQL Cluster 版本已經能夠作到僅僅將全部索引裝載在內存中便可,實際的數據能夠不用所有裝載到內存中。linux

一個 MySQL Cluster 的環境主要由如下三部分組成:
(1)SQL 層的 SQL 服務器節點(後面簡稱爲 SQL 節點);也就是咱們常說的MySQL Server。主要負責實現一個數據庫在存儲層之上的全部事情,好比鏈接管理,Query 優化和響應 ,Cache 管理等等,只有存儲層的工做交給了NDB 數據節點去處理了。也就是說,在純粹的MySQL Cluster 環境中的SQL 節點,能夠被認爲是一個不須要提供任何存儲引擎的MySQL服務器,由於他的存儲引擎有Cluster 環境中的NDB 節點來擔任。因此,SQL 層各MySQL服務器的啓動與普通的MySQL Server 啓動也有必定的區別,必需要添加ndbcluster參數選項才行。咱們能夠添加在my.cnf配置文件中,也能夠經過啓動命令行來指定。sql

(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 所得。bash

(3)負責管理各個節點的 Manage 節點主機;管理節點負責整個Cluster集羣中各個節點的管理工做,包括集羣的配置,啓動關閉各節點,對各個節點進行常規維護,以及實施數據的備份恢復等。管理節點會獲取整個Cluster環境中各節點的狀態和錯誤信息,而且將各 Cluster 集羣中各個節點的信息反饋給整個集羣中其餘的全部節點。因爲管理節點上保存了整個Cluster 環境的配置,同時擔任了集羣中各節點的基本溝通工做,因此他必須是最早被啓動的節點。
下面是一幅 MySQL Cluster 的基本架構圖(出自 MySQL 官方文檔手冊):服務器

經過圖中咱們能夠更清晰的瞭解整個 MySQL Cluster 環境各個節點以及客戶端應用之間的關係。

架構

MySQL Cluster 環境搭建dom

搭建 MySQL Cluster首先須要至少一個管理節點主機來實現管理功能,一個SQL節點主機來實現MySQL server功能和兩個ndb節點主機實現NDB Cluster的功能。我在這裏測試使用雙SQL節點來搭建測試環境,具體信息以下:

一、服務器準備

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

二、軟件安裝

測試環境(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存儲引擎,不只對數據進行了水平切分,還對數據進行了跨節點冗餘。既解決了數據庫的擴展問題,同時也在很大程度上提升了數據庫總體可用性。

相關文章
相關標籤/搜索