實驗需求:部署MySQL集羣,減少數據庫單點故障。
實驗方案:準備5臺服務器,mgmd(192.168.100.1)作爲管理節點,sqlA(192.168.100.2)和sqlB(192.168.100.3)作爲SQL節點,ndbA(192.168.100.4)和ndbB(192.168.100.5)作爲數據節點,這5個節點構成MySQL Cluster體系
實施過程:
一.公共配置
1.所有節點上安裝MySQL集羣軟件
1.1所有節點卸載衝突包
官方提供的MySQL-Cluster相關軟件包已集成數據庫服務端/客戶端程序,因此可直接用來替換普通的MySQL服務端/客戶端程序。如果已安裝有普通版的mysql-server、mysql、MySQL-server、MySQL-client包,請先將其卸載(若沒有則忽略):
# service mysql stop
# chkconfig mysql off
# rpm -e --nodeps MySQL-server MySQL-client MySQL-shared MySQL-embedded MySQL-test MySQL-devel
1.2清理殘餘配置文件
mv /etc/my.cnf /etc/my.cnf.bak
useradd mysql
1.3 所有節點安裝MySQL-Cluster相關軟件包
# tar xvf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar
MySQL-Cluster-shared-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-test-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-devel-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.3.3-1.el6.x86_64.rpm
rpm -Uvh MySQL-Cluster-*.rpm
2.在SQL節點(sqlA、sqlB)服務器上,修改MySQL數據庫的root密碼
3.SQL節點添加授權數據庫用戶,方便客戶端訪問
mysql>grant all on*.*to'root'@'192.168.100.%'identifiedby'123456';
二.配置管理節點 mgmd (192.168.100.1)
1.創建工作文件夾
# mkdir -p /var/log/mysql-cluster
2.創建配置文件
[ndbd default]:爲所有的數據節點指定默認配置。
[ndbd]:指定某一個數據節點的配置。
[ndb_mgmd default]:爲所有的管理節點指定默認配置。
[ndb_mgmd]:指定某一個管理節點的配置。
[mysqld default]:爲所有的SQL節點指定默認配置。
[mysqld]:指定某一個SQL節點的配置。
# vim /etc/config.ini
[ndbd default]
NoOfReplicas=2//保留2份數據拷貝
DataMemory=80M //數據緩存大小
IndexMemory=18M //索引緩存大小
[ndb_mgmd]
nodeid=1//第1個管理節點的ID號
hostname=192.168.100.1//此管理節點的地址
datadir=/var/log/mysql-cluster //此管理節點的工作目錄
[mysqld]
nodeid=2//第1個SQL節點的ID號
hostname=192.168.100.2 //第1個SQL節點的地址
[mysqld]
nodeid=3//第2個SQL節點的ID號
hostname=192.168.100.3 //第2個SQL節點的地址
[ndbd]
nodeid=4//第1個數據節點的ID號
hostname=192.168.100.4 //第1個數據節點的地址
datadir=/mysql-cluster/data //第1個數據節點的工作目錄,需創建
[ndbd]
nodeid=5//第2個數據節點的ID號
hostname=192.168.100.5//第2個數據節點的地址
datadir=/mysql-cluster/data //第2個數據節點的工作目錄,需創建
三.配置數據節點 ndbA(192.168.100.4) 、ndbB (192.168.100.5)
1.創建工作文件夾
# mkdir -p /mysql-cluster/data
2.創建配置文件
# vim /etc/my.cnf
[mysqld]
datadir=/mysql-cluster/data //指定數據存儲目錄
ndb-connectstring=192.168.100.1 //要連接的管理服務器的IP地址
ndbcluster //指定運行的存儲引擎
[mysql_cluster] //集羣連接配置段
ndb-connectstring=192.168.100.1
四.配置SQL節點sqlA(192.168.100.2) 、sqlB (192.168.100.3)
在MySQL-Cluster集羣環境中,若某個數據庫未採用ndbcluster引擎(而是InnoDB、MyISAM等其他引擎),則當更新數據庫表時,可能無法同步到其他節點。
# vim /etc/my.cnf
ndbcluster //指定運行的存儲引擎
default-storage-engine=ndbcluster //設置默認存儲引擎
[mysql_cluster] //集羣連接配置段
ndb-connectstring=192.168.100.1
五.啓動MySQL集羣
正確的啓動順序:管理節點 --> 數據節點 --> SQL節點。
關閉順序:SQL節點 --> 數據節點 --> 管理節點。
數據節點、SQL節點都正常運行後,理論上管理節點可關閉(無監控等任務的話)。
1.啓動管理節點mgmd
# ndb_mgmd -f /etc/config.ini //啓動管理節點,-f指定集羣配置文件
關於管理節點的啓動,有以下幾個需要注意的地方:
ndb_mgmd默認以後臺模式運行(--daemon),調試過程中可添加選項--nodaemon來禁用後臺模式。
ndb_mgmd初次啓動成功以後,會自動保存集羣配置,以後再啓動時會忽略-f指定的配置文件,除非添加--inital選項(比如向集羣中添加新的節點時,就應該重新初始化)。
若希望每次開機後自動運行ndb_mgmd,可將上述啓動操作寫入到/etc/rc.local配置文件內,例如:
# vim /etc/rc.local
....
ndb_mgmd -f /etc/config.ini
啓動完成後可查看監聽狀態:
# netstat -tuanlp | grep ndb
確認自動保存的集羣配置數據:
# ls -lh /usr/mysql-cluster/ndb_1_config.bin.1
-rw-r--r--.1 root root 4.1K 12月 2417:52/usr/mysql-cluster/ndb_1_config.bin.1
查看日誌文件相關數據:
# ls /var/log/mysql-cluster/
ndb_1_cluster.log ndb_1_out.log ndb_1.pid
2.啓動數據節點ndbA、ndbB
MySQL Cluster數據節點的對應服務程序爲ndbd(單線程的)、ndbmtd(多線程的),首次啓動或重新初始化時加 --initial選項,以後不用加。
# ndbd --initial //啓動數據節點
在ndbA和ndbB服務器上,修改/etc/rc.local配置文件,以便每次開機後能自動啓動數據節點服務:
# vim /etc/rc.local
....
ndbd
3.啓動SQL節點sqlA、sqlB
對於MySQL Cluster的SQL節點來說,對應的服務程序就是mysqld,正常通過mysql腳本重新啓動服務就可以了。
# service mysql restart
# chkconfig mysql on
4.在管理節點mgmd上查看羣集狀態
直接執行ndb_mgm可進入羣集管理環境:
# ndb_mgm
ndb_mgm>
進入ndb_mgm> 環境後,執行SHOW可查看當前各節點的狀態,確保本例中的5個節點都已經成功連接;
ndb_mgm> SHOW
六.MySQL集羣的高可用性測試
1.數據同步測試
從客戶機訪問sqlA,執行寫數據庫、表相關操作:
# mysql -u root -p -h 192.168.100.2
mysql> create database mycluster;
mysql> create table mycluster.a(id int(3));
mysql> insert into mycluster.a values(123),(456); //插入測試記錄
然後從客戶機訪問sqlB,確認結果(能看到從sqlA上所建的庫、表、表記錄):
# mysql -u root -p -h 192.168.100.3
mysql> select * from mycluster.a; //查看錶記錄也一致
2.高可用性測試(關閉一臺數據節點)
關閉數據節點ndbA上的ndbd進程:
# killall -9 ndbd //暴力結束ndbd進程
# netstat -tulanp | grep ndbd //確認已結束
此時從管理節點上查看集羣狀態,會發現ndbA已斷開連接:
ndb_mgm> show
然後從客戶機訪問sqlA或sqlB,仍然可讀、寫數據庫。比如可向mycluster.a表中再添加一條記錄:
mysql> insert into mycluster.a values(789); //添加一條表記錄
以上測試成立說明:只要還有一臺數據節點可用,MYSQL數據庫整體就仍然可用。
接下來可進一步驗證故障恢復過程 —— 重新啓動ndbA上的ndbd服務進程,稍待片刻後強制關閉ndbB上的ndbd服務進程。然後再次訪問sqlA或sqlB節點,查詢mycluster.a表的記錄,發現與前面添加的結果一致:
mysql> select * from mycluster.a; //確認結果
以上測試成立說明:因故障中斷的數據節點(ndbA)恢復後,會立即從正常的數據節點(ndbB)同步數據,確保數據一致性。
3.高可用性測試(關閉一臺SQL節點)
當MySQL集羣內有多個SQL節點時,只要有一臺SQL節點可用,就可以通過它來訪問MySQL數據庫中保存的表數據。
關閉sqlA、sqlB中的任何一臺以後,還可以通過另外一臺來訪問mycluster庫。