MySQL Cluster集群探索與實踐
MySQL集群是一種在無共享架構(SNA,Share Nothing Architecture)系統里應用內存數據庫集群的技術。這種無共享的架構可以使得系統使用低廉的硬件獲取高的可擴展性。
MySQL集群是一種分布式設計,目標是要達到沒有任何單點故障點。因此,任何組成部分都應該擁有自己的內存和磁盤。任何共享存儲方案如網絡共享,網絡文件系統和SAN設備是不推薦或不支持的。通過這種冗余設計,MySQL聲稱數據的可用度可以達到99.999%。
實際上,MySQL集群是把一個叫做NDB的內存集群存儲引擎集成與標準的MySQL服務器集成。它包含一組計算機,每個都跑一個或者多個進程,這可能包括一個MySQL服務器,一個數據節點,一個管理服務器和一個專有的一個數據訪問程序。它們之間的關系如下圖所示:
存儲引擎
MySQL Cluster 使用了一個專用的基于內存的存儲引擎,這樣做的好處是速度快, 沒有磁盤I/O的瓶頸,但是由于是基于內存的,所以數據庫的規模受系統總內存的限制, 如果運行NDB的MySQL服務器一定要內存夠大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多臺服務器上來實現數據的可靠性和擴展性,理論上 通過配置2臺NDB的存儲節點就能實現整個數據庫集群的冗余性和解決單點故障問題。
該存儲引擎有下列弊端:
- 基于內存,數據庫的規模受集群總內存的大小限制
- 基于內存,斷電后數據可能會有數據丟失,這點還需要通過測試驗證。
- 多個節點通過網絡實現通訊和數據同步、查詢等操作,因此整體性受網絡速度影響,
- 因此速度也比較慢
當然也有它的優點:
- 多個節點之間可以分布在不同的地理位置,因此也是一個實現分布式數據庫的方案。
- 擴展性很好,增加節點即可實現數據庫集群的擴展。
- 冗余性很好,多個節點上都有完整的數據庫數據,因此任何一個節點宕機都不會造成服務中斷。
- 實現高可用性的成本比較低,不象傳統的高可用方案一樣需要共享的存儲設備和專用的軟件才能實現,NDB 只要有足夠的內存就能實現。
體系結構
MySQL Cluster 由3個不同功能的服務構成,每個服務由一個專用的守護進程提供,一項 服務也叫做一個節點,下面來介紹每個節點的功能。
The management (MGM) node
管理節點,用來實現整個集群的管理,理論上一般只啟動一個,而且宕機也不影響 cluster 的服務,這個進程只在cluster 啟動以及節點加入集群時起作用, 所以這個節點不是很需要冗余,理論上通過一臺服務器提供服務就可以了。
通過 ndb_mgmd 命令啟動,使用 config.ini 配置文件
The storage or database (DB) node:
數據庫節點,用來存儲數據,可以和管理節點(MGM) , 用戶端節點(API) 可以處在 不同的機器上,也可以在同一個機器上面,集群中至少要有一個DB節點,2個以上 時就能實現集群的高可用保證,DB節點增加時,集群的處理速度會變慢。
通過 ndbd 命令啟動,第一次創建好cluster DB 節點時,需要使用 –init參數初始化。
例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial
The client (API) node:
客戶端節點,通過他實現 cluster DB 的訪問,這個節點也就是普通的 mysqld 進程, 需要在配置文件中配置ndbcluster 指令打開 NDB Cluster storage engine 存儲引擎,增加 API 節點會提高整個集群的并發訪問速度和整體的吞吐量,該節點 可以部署在Web應用服務器上,也可以部署在專用的服務器上,也開以和DB部署在 同一臺服務器上。
通過 mysqld_safe 命令啟動,
這3類節點可以分布在不同的主機上,比如 DB 可以是多臺專用的服務器,也可以 每個DB都有一個API,當然也可以把API分布在Web前端的服務器上去,通常來說, API越多cluster的性能會越好。
Mysql集群探索與實踐
1. 準備好3臺機器,從官網下載最新的mysql集群版本,此處用到mysql-cluster-gpl-7.1.5.tar.gz源碼包, 配置并安裝,記得加上
–with-plugins=innobase,ndbcluster (innobase可選)
3臺機器分別是192.168.207.153,192.168.208.3,192.168.208.9,具體分配如下
管理節點(ndb_mgmd):192.168.207.153
數據節點(ndbd): 192.168.208.3
數據節點(ndbd): 192.168.208.9
SQL節點(mysqld): 192.168.208.3
SQL節點(mysqld): 192.168.208.9
2. 在mysql目錄下新建mysql-cluster文件夾,切換到mysql-cluster,新建config.ini
[NDBD DEFAULT] NoOfReplicas=2 #備份,副本,這樣的話2臺數據節點的數據就會同步 DataMemory=200M IndexMemory=100M [TCP DEFAULT] portnumber=2202 [NDB_MGMD] #管理節點 id=1 hostname=192.168.207.153 datadir=/home/taozi/mysql/mysql-cluster [NDBD] #數據節點 id=2 hostname=192.168.208.3 datadir=/home/taozi/mysql/data [NDBD] #數據節點 id=3 hostname=192.168.208.9 datadir=/home/taozi/mysql/data [MySQLD] #sql節點 id=4 hostname=192.168.208.3 [MySQLD] #sql節點 id=5 hostname=192.168.208.9 [MySQLD] #sql節點 id=6
3. 在管理節點服務器上啟動管理節點服務 (如果不存在ndb_mgmd那么要從libexec下面復制過來)
~/mysql/bin/ndb_mgmd -f ~/mysql/mysql-cluster/config.ini
4. 進入2臺數據節點服務器,分別啟動數據節點服務
~/mysql/bin/ndbd (第一次啟動使用 ~/mysql/bin/ndbd --initial)
5. 最后分別進入sql節點服務器,修改my.cnf,加入
[MYSQL_CLUSTER] ndb-connectstring=192.168.207.153 [MYSQLD] ndbcluster ndb-connectstring=192.168.207.153
啟動mysql服務
/home/taozi/mysql/bin/mysqld_safe --ledir=/home/taozi/mysql/bin / --log-error=/home/taozi/mysql/data/t.err --datadir=/home/taozi/mysql/data / --socket=/home/taozi/mysql/tmp/mysql.sock --pid-file=/home/taozi/mysql/data/mysqld.pid &
6. 此時回到管理節點
~/mysql/bin/ndb_mgm -e show
可以看到顯示如下
[taozi@search153 mysql]$ ./show.sh Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0, Master) id=3 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.207.153 (mysql-5.1.47 ndb-7.1.5) [mysqld(API)] 3 node(s) id=4 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5) id=5 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5) id=6 (not connected, accepting connect from any host)
7. 進入sql節點,在test數據庫創建表
CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=ndbcluster DEFAULT CHARSET=gbk
切換到2臺數據節點服務器~/mysql/data/ndb_2_fs和~/mysql/data/ndb_3_fs看看,
或者直接去數據庫查,數據已經同步了!
8. 關閉集群服務
關閉sql節點等同于停止mysql服務,此時外界數據不將再進來。然后關閉管理節點
~/mysql/bin/ndb_mgm -e shutdown rm ~/mysql/mysql-cluster/ndb_1_config.bin.1 #不是必須的,如果config.ini有改動則要加上
這樣操作后,管理節點和數據節點都將停止服務
Notes:
1:如果發現關閉一臺機器的ndbd進程,另一臺機器的ndbd的進程也關閉,則需要修改參數NoOfReplicas。 2:./ndbd --initial 不能同時在所有數據節點機器上執行,如執行,會刪除所有數據 3:可以像操作非簇類型的數據庫那樣,操作mysqld節點 4:每次修改config.ini文件,重啟ndb_mgmd時,需要刪除mysql-cluster文件下的ndb_1_config.bin.1文件, 因為他默認調用此文件 5:NDB 簇不支持自動發現數據庫的功能,這點很重要,一旦在一個數據節點上創建了世界(world)數據庫和它的表, 在簇中的每個SQL節點上還需要發出命令 CREATE DATABASE world,后跟FLUSH TABLES。這樣,節點就能 識別數據庫并讀取其表定義。(在本版本MySQL Cluster 7.1.5下數據庫也會自動同步的) 6:如果在相關節點服務器啟動時,注意查看~/mysql/mysql-cluster目錄內的相關日志文件以獲取錯誤信息. 7:在管理節點的配置文件里各[mysqld],[ndbd]和[ndb_mgmd]配置的選項值順序應該如下: [mysqld] Id=4 HostName=192.168.208.3 Id在頂端緊跟其后的是HostName,如果順序錯了,當SQL或數據節點連接管理節點時,管理節點無法正確的定位 到其對應的節點配置上. 因為無法定位到對應的節點配置,當沒有剩余的[空節點]時,客戶端節點啟動時(./mysqld or ./ndbd) 還會報: Configuration error: Error : Could not alloc node id at 192.168.0.231 port 1186: No free node id found for mysqld (API).Failed to initialize consumers 8:[空節點]是沒有指定HostName選項的節點配置均為空節點,空節點可以用來動態配置一些動態IP的節點, 一般管理節點的 配置文件要預留3個以上的空節點,因為備份時需要連接一個節點,如下: [mysqld] Id=6