Windows Server 2003 下配置 MySQL 群集(Cluster)
MySQL 群集是 MySQL 適合於分散式計算環境的高可用、高冗餘版本。它採用了 NDB Cluster 儲存引擎,允許在 1 個群集中執行多個 MySQL 伺服器。在 MySQL 5.0 及以上的二進位制版本中,以及與最新的 Linux 版本相容的 RPM 包中提供了該儲存引擎。
MySQL 群集是一種技術,該技術允許在無共享的系統中部署“記憶體中”和“磁碟中”資料庫的 Cluster 。通過無共享體系結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。此外,由於每個元件有自己的記憶體和磁碟,不存在單點故障。MySQL Cluster 由一組計算機構成,每臺計算機上均執行著多種程序,包括 MySQL 伺服器,NDB Cluster 的資料節點,管理伺服器,以及(可能存在的)專門的資料訪問程式。
管理伺服器(MGM節點)負責管理 Cluster 配置檔案和 Cluster 日誌。Cluster 中的每個節點從管理伺服器檢索配置資料。當資料節點內出現新的事件時,節點將關於這類事件的資訊傳輸到管理伺服器,然後,將這類資訊寫入 Cluster 日誌。
目前能夠執行 MySQL Cluster 的作業系統有 Linux、Mac OS X 和 Solaris,最新的版本已經支援 Windows 作業系統。
MySQL 群集的資料節點之間的通訊是不加密的,並且需要高速的頻寬,所以建議把群集建立在一個高速區域網內,不建議跨網段、跨公網的部署這種系統體系。
MySQL 群集分為三種節點:管理節點,資料節點和SQL節點。
管理節點:主要用於管理各個節點,能夠通過命令對某個節點進行重啟、關閉、啟動等操作。也能夠監視全部節點的工作狀態。
資料節點:主要是對資料的儲存,不提供其他的服務。
SQL節點:主要是對外提供SQL功能,類似一臺普通的 MySQL Server。
而SQL節點和資料節點可以是同一臺機器,也就是說這臺機器即是SQL節點也是資料節點。它們只是邏輯關係上的劃分,實際部署時,甚至所有的階段都可以位於同一臺物理機器上,只是配置較複雜些。
一、軟體下載機器操作環境
配置 MySQL 群集必需使用其群集版本,注意和 MySQL Server 版本的區別。本文以 Windows 平臺下的 MySQL 群集版本 MySQL Cluster 7.1.3 為例(截至2010年6月初的最高版本),這是 MySQL Server 5.1 系列版本之一,添加了群集的功能。下載地址為:
根據自己的作業系統的位數,也可以選擇 64 位版本的。還有一個 27.2M 的 Windows(x86, 32-bit) 版本,下載下來需要自己編譯,有經驗的高階使用者可以選用。
本實驗在 2 檯安裝 Windows Server 2003(sp2) 的機器上進行。節點分配及 IP 配置如下:
第一臺機器,IP 為 10.0.0.201,作為管理節點(MGM),SQL節點1(SQL1),資料節點1(NDBD1)。
第二臺機器,IP 為 10.0.0.202,作為SQL節點2(SQL2),資料節點2(NDBD2)。
管理節點最好不要與資料節點部署在同一臺伺服器上,否則可能會因為該資料節點伺服器的當機,而導致管理節點伺服器的問題,從而導致整個群集系統的崩潰。
二,配置管理節點:
在第一臺機器上,建資料夾 D:/mysql-cluster,在其下建立檔案 config.ini,內容如下:
[NDBD DEFAULT]
NoOfReplicas=1
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
hostname=10.0.0.201
# Storage Engines
[NDBD]
hostname=10.0.0.201
datadir= D:/data
[NDBD]
hostname=10.0.0.202
datadir= D:/data
# SQL Engines
[MYSQLD]
hostname=10.0.0.201
[MYSQLD]
hostname=10.0.0.202
Cluster 管理節點的預設埠是1186,資料節點的預設埠是 2202。從 MySQL 5.0.3開始,該限制已被放寬,Cluster 能夠根據空閒的埠自動地為資料節點分配埠。如果你的版本低於5.0.22,請注意這個細節。
Cluster 管理節點作為一個服務端(通過執行 db_mgmd.exe 程式讀取本配置檔案來啟動),通過本機上的客戶端 ndb_mgm.exe 來連線和操作。
三、配置 MySQL 資料庫伺服器:
在2臺機器上,分別依次操作。
解壓 mysql-cluster-gpl-noinstall-7.1.3-win32.zip 檔案到 D:/mysql-cluster-gpl-noinstall-7.1.3-win32 資料夾下,把 D:/mysql-cluster-gpl-noinstall-7.1.3-win32/bin 加到 Windows 的系統 path 中。
開啟DOS命令列視窗(配置完系統path後,在再次開啟新的命令列視窗),執行以下語句,讓 MySQL 作為 Windows 服務執行:
mysqld.exe -install mysql
再在 Windows 服務管理介面裡,配置 mysql 服務,手動啟動(不要自動啟動)。
把 D:/mysql-cluster-gpl-noinstall-7.1.3-win32 下的某個備用的配置檔案(例如my-small.ini)複製為 my.ini 檔案。
建立 D:/tmp 資料夾。
四、配置SQL節點和資料節點:
在2臺機器上,分別依次操作。
建立資料夾 D:/data。
編輯 NySQL 配置檔案 D:/mysql-cluster-gpl-noinstall-7.1.3-win32/my.ini,在 [mysqld] 節末尾加語句:
#SQL群集節點
ndbcluster
ndb-connectstring=10.0.0.201
有了 ndbcluster 語句,mysql 服務將作為群集的 SQL 節點啟動。mysqld.exe 命令帶引數 –ndbcluster 執行是一樣的效果。
mysql 服務連線到資料節點的 2202 預設埠,或自動分配的別的可用埠。
(問題:SQL節點如何獲得資料節點的IP地址?是否通過連線管理節點,取得所有資料節點的IP地址的列表?)
這裡的連線字串的值在 MySQL 服務啟動時使用,用於連線到管理節點。
在末尾加語句:
#NDB叢集節點
[mysql_cluster]
ndb-connectstring=10.0.0.201
注:好像以下形式也可:
[ndbd]
ndb-connectstring=10.0.0.201
這裡的連線字串的值在資料節點啟動時使用,用於連線到管理節點。
五,啟動群集各伺服器
啟動順序依次是:管理節點、資料節點、SQL節點。
1,啟動管理節點
在第一臺伺服器的DOS視窗,執行命令:
C:/>ndb_mgmd.exe -f d:/mysql-cluster.conf/config.ini –configdir=d:/mysql-cluster
注:如果不帶 –configdir=d:/mysql-cluster 引數,將預設為 C:/mysql/mysql-cluster 資料夾。
螢幕顯示:
C:/>ndb_mgmd.exe -f d:/mysql-cluster.conf/config.ini –configdir=d:/mysql-cluster
2010-06-10 01:16:57 [MgmtSrvr] INFO — NDB Cluster Management Server. mysql-5.1.44 ndb-7.1.3
2010-06-10 01:16:57 [MgmtSrvr] INFO — Reading cluster configuration from ‘d:/mysql-cluster.conf/config.ini’
2010-06-10 01:16:57 [MgmtSrvr] INFO — Got initial configuration from ‘d:/mysql-cluster.conf/config.ini’, will try to set it when all ndb_mgmd(s) started
2010-06-10 01:16:57 [MgmtSrvr] INFO — Mgmt server state: nodeid 1 reserved for ip 10.0.0.201, m_reserved_nodes 1.
2010-06-10 01:16:57 [MgmtSrvr] INFO — Id: 1, Command port: *:1186
==INITIAL==
2010-06-10 01:16:57 [MgmtSrvr] INFO — Starting initial configuration change
2010-06-10 01:16:57 [MgmtSrvr] INFO — Configuration 1 commited
2010-06-10 01:16:57 [MgmtSrvr] INFO — Config change completed! New generation: 1
==CONFIRMED==
2,啟動資料節點
分別在2臺伺服器的DOS視窗執行命令。
第一次,或初始化群集節點時,執行命令:
ndbd.exe –initial
初始化之後,只執行 ndbd.exe 即可。若帶引數 –initial 執行,將使正常執行的群集系統中,資料節點的資料全部丟失。
資料節點依賴管理節點伺服器,進行資料的自動複製和同步,使各個資料節點的資料保持一致,並在某個資料節點意外關閉又恢復後,進行資料的恢復重建。
3,啟動SQL節點
有了 ndbcluster 語句,啟動 mysql 服務,就啟動了SQL節點。應在前2種節點啟動後,分別在2臺伺服器上進行。
六、群集管理
在所有的資料節點和SQL節點未啟動之前,執行群集管理節點服務的客戶端 ndb_mgm.exe,只能獲得以下資訊:
C:/>ndb_mgm.exe
— NDB Cluster — Management Client –
ndb_mgm> show
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 10.0.0.201)
id=3 (not connected, accepting connect from 10.0.0.202)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.0.0.201 (mysql-5.1.44 ndb-7.1.3)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from 10.0.0.201)
id=5 (not connected, accepting connect from 10.0.0.202)
ndb_mgm>
說明資料節點、SQL節點均未連線到管理節點服務。
在所有的資料節點和SQL節點正確啟動之後,將獲得以下資訊:
ndb_mgm> show
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @10.0.0.201 (mysql-5.1.44 ndb-7.1.3, Nodegroup: 0, Master)
id=3 @10.0.0.202 (mysql-5.1.44 ndb-7.1.3, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.0.0.201 (mysql-5.1.44 ndb-7.1.3)
[mysqld(API)] 2 node(s)
id=4 @10.0.0.201 (mysql-5.1.44 ndb-7.1.3)
id=5 @10.0.0.202 (mysql-5.1.44 ndb-7.1.3)
ndb_mgm>
關閉群集的DOS命令:
ndb_mgm -e shutdown
或在 ndb_mgm 環境下執行 shutdown 命令。
以上命令或關閉管理節點服務和所有的資料節點。隨意、強行關閉群集系統(關機或關閉程序),會導致資料沒有全部寫回磁碟而導致的資料丟失。
關閉SQL節點的 mysqld 服務:
C:/>net stop mysql,或:
C:/>mysqladmin -u root shutdown
七、測試
正常執行的 MySQL 群集系統,通過SQL節點可以對資料節點進行資料庫操作,各資料節點可以自動進行資料同步。某一個數據節點關閉後,不影響SQL節點的使用。某些資料節點出錯後,可以進行恢復。需要注意的是,SQL節點建立資料庫時,必須選擇“ndbcluster”資料庫引擎。如果不選擇“ndbcluster”引擎,建立的資料庫將不會進入MySQL群集系統中,但是可以獨立使用。
另外,每個 NDB 表必須有一個主鍵。如果在建立表時未定義主鍵,NDB Cluster 儲存引擎將自動生成隱含的主鍵。該隱含的鍵也將佔用空間,就像任何其他的表索引一樣。由於沒有足夠的記憶體來容納這些自動建立的鍵,出現問題並不罕見。
測試例項:
在某臺 SQL 節點上登入 mysql,建表 city,並插入資料:
C:/>mysql -u root test
mysql>create table city (nId mediumint unsigned not null auto_increment primary key, sName varchar(20) not null)
engine = ndbcluster default charset utf8;
mysql>insert city values(1, ‘city-1′);
mysql>insert city values(1, ‘city-2′);
在另一臺 SQL 節點上登入 mysql,從表 city 裡得到記錄:
C:/>mysql -u root test
mysql>select * from city;
在群集系統正常工作的情況下,應當能取到先前插入的所有記錄。
另外的測試(單點故障測試):
1,還可以人為停止某一個數據節點(Ctrl+C中斷DOS命令ndbd.exe,停止該服務),看看所有的 SQL 節點是不是能正常工作。
2,在某一個數據節點停止後,進行資料庫操作。然後重新開啟該資料節點,看看群集中的所有的 SQL 節點能不能得到完整的資料。
八、常見問題與擴充套件
配置和管理 MySQL 群集系統並不是一件簡單的事情。由於不合理的配置導致的系統問題非常常見,比如網路故障、記憶體限制等,會導致仲裁體統強制關閉資料節點。
如果機器上原來已經安裝過 MySQL Server,則一定要解除安裝乾淨原來的資料庫系統。注意群集系統中的 mysql.exe 程式與非群集系統的管理 Client 是不同的。
還可以與負載均衡系統結合,以提供更強的可用性和資料存取效率。
可能由於未知的Bug或別的原因,導致群集系統出現一些意外故障。所以建議選取版本時,選擇已經得到大多數人認可的版本,不一定選取最新的版本,最新的版本往往不太穩定。當然也不要選用太陳舊的功能有限制的版本。