相比前面介紹的各種複製結構,MySql Cluster最顯著的優點就是高可用性,高即時性,高冗餘,擴充性強。但是MySql Cluster的效能一直偏低,好在現在的7.x版本,效能上已經有了很大的改進和提高。
MySql Cluster採用的是NDB儲存引擎,在建表的時候必須指定ENGINE為ndbcluster,這是一種記憶體式的儲存引擎,因此對記憶體的要求很高。足夠大的記憶體,處理速度更快的CPU,更快的網路的環境(千兆以上),在Sql節點使用cache技術等措施都能顯著提高叢集的效率,但是具體的最佳化配置得根據你的實際情況和需求而定,所以本文只是在測試環境下驗證Cluster的配置,不涉及效能調優等細節。
首先我們看看MySql官網對MySql Cluster主要構成的三大組成部分的簡單解釋:
管理(MGM)節點:這類節點的作用是管理MySQL叢集內的其他節點,如提供配置資料、啟動並停止節點、運行備份等。由於這類節點負責管理其他節點的配置,應在啟動其他節點之前首先啟動這類節點。MGM節點是用命令ndb_mgmd啟動的。
資料節點(Data Nodes):這類節點用於儲存叢集的資料。資料節點是用命令ndbd啟動的。
SQL節點(Sql Nodes):這是用來訪問叢集資料的節點。對於MySQL叢集,用戶端節點是使用NDB叢集儲存引擎的傳統MySQL伺服器。
本文配置的簡單結構圖如下(點擊圖片看大圖):
伺服器配置資訊約定:
?
12345678 |
主機名稱 ip 節點種類 ClusterMgm 192.168.0.100 管理節點 SqlNode1 192.168.0.101 Sql節點 SqlNode2 192.168.0.102 Sql節點 SqlNode3 192.168.0.103 Sql節點 DataNode1 192.168.0.104 Data節點 DataNode2 192.168.0.105 Data節點 DataNode3 192.168.0.106 Data節點 |
從圖上你可能看到,除了MySql Cluster本身的三大組成部分外,我在應用程式和Sql節點之間加了負載平衡裝置,這是因為叢集本身的Sql節點並沒有實現負載平衡,而且單獨使用的時候會出現單節點故障,要實現這個訪問負載平衡可以通過相關軟方法(比如LVS)或者專門的硬體裝置來實現,為了得到更好的效果,我推薦你用後者。
各種節點裡需要安裝的軟體:
Sql Nodes:MySQL-Cluster-gpl-server,MySQL-Cluster-gpl-client
Data Nodes:MySQL-Cluster-gpl-storage
NDB Management Server:MySQL-Cluster-gpl-management,MySQL-Cluster-gpl-tools
第一步,在各節點裡下載並安裝軟體:
1.在Sql節點(SqlNode1,SqlNode2,SqlNode3)上分別下載安裝MySQL-Cluster-gpl-server和MySQL-Cluster-gpl-client
?
1234 |
[root@SqlNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-server-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@SqlNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-server-7.1.15-1.rhel5.i386.rpm [root@SqlNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-client-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@SqlNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-client-7.1.15-1.rhel5.i386.rpm |
注意:安裝之後,有提示讓你設定root密碼,先不要設定,也不要啟動Mysql伺服器!
2.在NDB節點(DataNode1,DataNode2,DataNode3)上分別下載安裝MySQL-Cluster-gpl-storage
?
12 |
[root@DataNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-storage-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@DataNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-storage-7.1.15-1.rhel5.i386.rpm |
3.在管理節點(ClusterMgm)裡下載安裝MySQL-Cluster-gpl-management,MySQL-Cluster-gpl-tools
?
123 |
[root@ClusterMgm ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-management-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@ClusterMgm ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-tools-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@ClusterMgm ~] # rpm -ivh MySQL-Cluster-gpl-management-7.1.15-1.rhel5.i386.rpm MySQL-Cluster-gpl-tools-7.1.15-1.rhel5.i386.rpm |
注意,我是去MySql官網下載的,如果你複製代碼不能下載,那麼說明軟體版本可能升級了,你自己去官方下載。
第二步,開始配置叢集:
1.配置Sql節點(SqlNode1,SqlNode2,SqlNode3),分別在3個節點裡進行:
A.建立設定檔案/etc/my.cnf:
?
12345678910 |
[root@SqlNode1 /2/3 ~] # vi /etc/my.cnf #......其他參數略...... [client] port = 3306 socket = /var/lib/mysql/mysql .sock [mysqld] port = 3306 socket = /var/lib/mysql/mysql .sock ndbcluster ndb-connectstring = 192.168.0.100 <----管理節點IP |
2.配置資料節點(DataNode1,DataNode2,DataNode3),分別在3個節點裡進行:
A.建立叢集相關資料儲存目錄,並建立專屬使用者:
?
12 |
[root@DataNode1 /2/3 ~] # useradd -M -d /dev/null -s /sbin/nologin -c "Mysql Cluster" mysql [root@DataNode1 /2/3 ~] # chown mysql:mysql /var/lib/mysql-cluster |
B.建立設定檔案/etc/my.cnf:
?
123 |
[root@DataNode1 /2/3 ~] # vi /etc/my.cnf [mysql_cluster] ndb-connectstring = 192.168.0.100 <----管理節點IP |
3.組態管理節點(ClusterMgm):
A.建立設定檔案目錄,並配置設定檔案:
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
[root@ClusterMgm ~] # mkdir /var/lib/mysql-cluster [root@ClusterMgm ~] # vi /var/lib/mysql-cluster/cluster.conf # 影響所有資料節點的全域配置 # 如果你的記憶體不多,DataMemory和IndexMemory設定過大,會導致叢集啟動失敗(資料節點耗盡記憶體) [NDBD DEFAULT] NoOfReplicas=3 <----資料節點的個數 DataMemory=64M <----分配給data storage使用的記憶體 IndexMemory=18M <----分配給index storage使用的記憶體 #TCP/IP選項: [TCP DEFAULT] portnumber=2202 #管理節點配置: [NDB_MGMD] hostname =192.168.0.100 datadir= /var/lib/mysql-cluster #Sql節點1的配置(SqlNode1): [MYSQLD] hostname =192.168.0.101 #Sql節點2的配置(SqlNode21): [MYSQLD] hostname =192.168.0.102 #Sql節點3的配置(SqlNode3): [MYSQLD] hostname =192.168.0.103 #資料節點1的配置(DataNode1): [NDBD] hostname =192.168.0.104 datadir= /var/lib/mysql-cluster #資料節點2的配置(DataNode2): [NDBD] hostname =192.168.0.105 datadir= /var/lib/mysql-cluster #資料節點3的配置(DataNode3): [NDBD] hostname =192.168.0.106 datadir= /var/lib/mysql-cluster |
注意:這個設定檔案基本上是最簡單的設定檔,更多的設定參數請參照官方文檔並根據你伺服器的硬體條件和實際需求去設定。
第三步,啟動叢集:
我們啟動的順序是管理節點->資料節點->Sql節點
1.啟動管理節點:
?
1 |
[root@ClusterMgm ~] # ndb_mgmd -f /var/lib/mysql-cluster/cluster.conf |
2.稍等片刻後,啟動資料節點(DataNode1,DataNode2,DataNode3),分別在3個節點裡運行:
?
1 |
[root@DataNode1 /2/3 ~] # ndbd --initial |
★必須注意:只是在第一次啟動或在備份/恢複或配置變化後重啟ndbd時,才加–initial參數!
3.稍等片刻後,啟動Sql節點(SqlNode1,SqlNode2,SqlNode3)並設定root密碼,分別在3個節點裡運行:
?
12 |
[root@SqlNode1 /2/3 ~] # /etc/init.d/mysql start [root@SqlNode1 /2/3 ~] # /usr/bin/mysqladmin -u root password 'MyMysqlPassword' |
4.確認叢集狀態,在管理節點(ClusterMgm)裡執行:
?
1234567891011121314151617181920 |
[root@ClusterMgm ~] # ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 3 node(s) id =5 @192.168.0.104 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, Master) id =6 @192.168.0.105 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0) id =7 @192.168.0.106 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id =1 @192.168.0.100 (mysql-5.1.56 ndb-7.1.15) [mysqld(API)] 3 node(s) id =2 @192.168.0.101 (mysql-5.1.56 ndb-7.1.15) id =3 @192.168.0.102 (mysql-5.1.56 ndb-7.1.15) id =4 @192.168.0.103 (mysql-5.1.56 ndb-7.1.15) ndb_mgm> |
從上面的結果中可以看出,我們的叢集已經配置成功了,如果你的顯示結果裡有節點沒串連上,那麼檢查一遍你的所有配置,看看各節點裡的日誌相關資訊。
現在你可以在Sql節點添加一些MySql使用者,然後進行各種資料庫的測試了。
★非常重要:
1.在建表的時候一定要用ENGINE=NDB或ENGINE=NDBCLUSTER指定使用NDB叢集儲存引擎,或用ALTER TABLE選項更改表的儲存引擎。
2.NDB表必須有一個主鍵,因此建立表的時候必須定義主鍵,否則NDB儲存引擎將自動產生隱含的主鍵。
3.Sql節點的使用者權限表仍然採用MYISAM儲存引擎儲存的,所以在一個Sql節點建立的MySql使用者只能訪問這個節點,如果要用同樣的使用者訪問別的Sql節點,需要在對應的Sql節點追加使用者。雖然在MySql Cluster7.2版本開始提供了”使用者權限共用”,但是7.2還是開發版本,而本文用的是7.15穩定版,所以就不介紹這個功能了。
第三步,關閉叢集:
1.關閉管理節點和資料節點,只需要在管理節點(ClusterMgm)裡執行:
?
1234 |
[root@ClusterMgm ~] # ndb_mgm -e shutdown Connected to Management Server at: localhost:1186 3 NDB Cluster node(s) have shutdown . Disconnecting to allow management server to shutdown . |
2.然後關閉Sql節點(SqlNode1,SqlNode2,SqlNode3),分別在3個節點裡運行:
?
12 |
[root@SqlNode1 /2/3 ~] # /etc/init.d/mysql stop Shutting down MySQL... SUCCESS! |
注意:要再次啟動叢集,就按照第三步的啟動步驟即可,不過這次啟動資料節點的時候就不要加”–initial”參數了。