MySQL集羣作用:解決MySQL代理服務器的缺點單點故障和數據備份
結構圖如下:
使用6臺RHEL6.4虛擬機,如圖所示sqlA和sqlB作爲SQL節點,ndbA和ndbB作爲數據節點,mgmd作爲管理節點,這5個節點構成MySQLCluster體系;而另一臺虛擬機192.168.4.120作爲MySQL測試客戶機。
角色說明:
客戶端(client) :訪問集羣主機
管理集羣的主機(mgmd):管理集羣中所有主機,加載自己的主配置文件,設置集羣中所有主機的角色
SQL結點(sql) :供用戶訪問和執行SQL語句,存儲表結構(2臺以上)
數據結點(ndbd節點) :存儲表中的記錄(2臺以上)
MySQL集羣提供三進程:
mgmd 管理進程 運行在管理機上 config.ini
mysqld 數據庫服務 運行在sql節點上 /etc/my.cnf
ndbd 數據存儲服務 運行在ndbd節點 /etc/my.cnf
1、公共配置(要保留RHEL自帶的mysql-libs包)
A、關閉防火牆、停止自帶的mysql服務,移走配置文件/etc/my.cnf
# service iptables stop;chkconfig iptables off
# service mysql stop;chkconfig mysql off
B、卸載衝突的軟件包(所有節點)
# rpm -qa | grep -i mysql //查看原有的mysql包
# yum -y remove .....
C、關閉selinux並重啓系統
# setenforce 0;sed -ri 's/SELINUX=[a-z]+/SELINUX=disabled/' /etc/sysconfig/selinux
# reboot
C、安裝集羣軟件(所有節點)
# tar -xf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar
# rpm -Uvh MySQL-Cluster-*.rpm //默認路徑/var/lib/mysql
# rpm -qa | grep MySQL-Cluster
2、配置管理主機mgm
啓動管理進程時,調用配置文件cluster.ini,知道集羣中主機的角色(配置文件要自己編輯,不允許有空行)
# mkdir -p /var/lib/mysql-cluster //創建工作文件夾
# chown -R mysql: /var/lib/mysql-cluster
# vi /var/lib/mysql-cluster/cluster.ini
[ndbd default] //定義數據結點的公共配置
NoOfReplicas=2 //指定一份數據備份幾份(數據結點數或能被數據節點數整除)
DataMemory=80M //數據內存(保存用戶執行過的SQL語句和查詢結果,通常是物理內存的1/3)
IndexMemory=18M //保存索引的內存
[ndb_mgmd] //指定管理主機
nodeid=1 //指定編號(管理標識),值不允許重複
hostname=192.168.4.100 //管理主機的IP
datadir=/var/lib/mysql-cluster //路徑在mgm上,用於存放集羣中主機的信息,路徑需自己創建
[ndbd] //指定數據結點1
nodeid =30
hostname=192.168.4.30 //數據結點的IP
Datadir=/var/lib/mysql/data //路徑在數據結點上要存在,該目錄用於存放表中的記錄
[ndbd] //指定數據結點2
nodeid =40
hostname=192.168.4.40
Datadir=/var/lib/mysql/data
[mysqld] //指定sql結點1
nodeid =10
hostname=192.168.4.10 //sql結點的IP
[mysqld] //指定sql結點2
nodeid =20
hostname=192.168.4.20
3、配置數據結點ndb(在 .30 .40上操作)
1)創建存儲表中記錄的目錄
# mkdir -p /var/lib/mysql/data
2)編輯配置文件/etc/my.cnf(與mysqld的主配置文件同名)
若原來已存在my.cnf文件,則先做改名
# mv /etc/my.cnf /etc/my.cnf.bak
# vi /etc/my.cnf
[mysqld] //設置數據結點 datadir=/var/lib/mysql/data //將記錄存儲在本機的哪個目錄下,與管理主機上的設置一致
ndb-connectstring=192.168.4.100 //管理主機的IP
ndbcluster //指定運行的存儲引擎
[mysql_cluster] //設置管理集羣的主機
ndb-connectstring=192.168.4.100 //管理主機的IP
4、配置SQL結點sql (在.10 .20上操作)
1)編輯配置文件/etc/my.cnf
# mv /etc/my.cnf /etc/my.cnf.bak
# vi /etc/my.cnf [mysqld] //設置sql結點
ndbcluster //指定表的存儲引擎
default-storage-engine=ndbcluster
[mysql_cluster] //設置管理集羣的主機
ndb-connectstring=192.168.4.100 //管理主機的IP
5、啓動(注意啓動順序)
*正確的啓動順序:管理節點 --> 數據節點 --> SQL節點。
*關閉順序: SQL節點 --> 數據節點 --> 管理節點。
1)啓動管理進程
# ndb_mgmd -f /var/lib/mysql-cluster/cluster.ini --nodaemon //啓動管理進程腳本
# pgrep mgmd //查看進程是否開啓,可用pkill -9 mgmd 結束管理進程
# ndb_mgm //執行登錄管理界面的腳本 ndb_mgm>show //查看集羣信息
# ndb_mgm -e shutdown //關閉管理節點和數據節點
# netstat -atunp | grep ndb
tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 4965/ndb_mgmd
設置爲開機自啓動
#vim /etc/rc.local
ndb_mgmd -f /var/lib/mysql-cluster/cluster.ini --nodaemon
關於管理節點的啓動,有以下幾個需要注意的地方:
ndb_mgmd 默認以後臺模式運行(--daemon),調試過程中可添加選項--nodaemon來禁用後臺模式;
ndb_mgmd 初次啓動成功以後,會自動保存集羣配置,以後再啓動時會忽略-f指定的配置文件,除非添加--inital選項(比如向集羣中添加新的節點時,就應該重新初始化)。
2)啓動數據結點進程
MySQL Cluster數據節點的對應服務程序爲ndbd(單線程的)、ndbmtd(多線程的),首次啓動或重新初始化時加 --initial選項,以後不用加。
# ndbd --initial-start //啓動數據結點進程
# pgrep ndbd //查看進程,可用pkill -9 ndbd 結束管理進程
# vim /etc/rc.local //設置爲開機自啓動
ndbd
3)啓動sql結點的數據庫服務進程
# pgrep mysqld
# pkill -9 mysql
# service mysql start
# chkconfig mysql on
修改密碼
# cat /root/.mysql_secret
# the root user at Tue Dec24 15:24:50 2013 (local time): Z3Qw2OWJ
# mysql -u root -p Z3Qw2OWJ
mysql> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123');
檢查sql節點默認存儲引擎,確保已支持ndbcluster且作爲默認存儲引擎:
# mysql -u root -p123456 //本機帳號登錄
mysql> show engines\G;
Engine: ndbcluster
Support: DEFAULT
管理節點查看集羣狀態
#ndb_mgm //進入羣集管理環境
ndb_mgm> show //若能看到如下信息就說明集羣創建成功
Cluster Configuration
---------------------
[ndbd(NDB)] 2node(s)
id=30 @192.168.4.30 (mysql-5.6.14 ndb-7.3.3, starting, Nodegroup:0)
id=40 @192.168.4.40 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.4.100 (mysql-5.6.14 ndb-7.3.3)
[mysqld(API)] 2node(s)
id=10 @192.168.4.10 (mysql-5.6.14 ndb-7.3.3)
id=20 @192.168.4.20 (mysql-5.6.14 ndb-7.3.3)
6、sql結點授權客戶端用戶(兩點節點都要)
mysql>grant all on *.* to root@'192.168.4.%' identified by '123';
7、MySQL集羣的高可用性測試(驗證集羣)
**如果默認引擎未設爲ndbcluster,則建表操作末尾需手工指定存儲引擎**
**不能自動切換兩個節點→mysql-mmm 解決**
1)數據同步(自動備份)測試
客戶端登錄 mysql節點.10 和.20 ( .10和.20的數據會同步)
# mysql -h192.168.4.10 -uroot -p123
mysql> create database ndb;
mysql> use ndb;
mysql> create table ndb01(idint);
mysql> insert into ndb01values(100);
mysql> select * from ndb01;
+------+
| id |
+------+
| 100 |
| 100 |
從客戶機訪問20,確認結果(能看到從10上所建的庫、表、表記錄)
# mysql -h192.168.4.20 -uroot-p123
2)高可用性測試(單點故障)(關閉一臺數據節點)
**只要還有一臺數據節點可用,MYSQL數據庫整體就仍然可用**
關閉數據節點.30上的ndbd進程:
# pkill -9 ndbd
# netstat -antup | grep ndbd //確認
ndb_mgm> show //此時從管理節點上查看集羣狀態,會發現ndbA已斷開連接
id=30 (not connected, acceptingconnect from 192.168.4.30)
然後從客戶機訪問sqlA或sqlB,仍然可讀、寫數據庫。
驗證故障恢復過程
重新啓動.30上的ndbd服務進程,稍待片刻後強制關閉.40上的ndbd服務進程。然後再次訪問.30或.40節點,查詢ndb01表的記錄,發現與前面添加的結果一致:
以上測試成立說明:因故障中斷的數據節點(.30)恢復後,會立即從正常的數據節點(.40)同步數據,確保數據一致性。
3)高可用性測試(關閉一臺SQL節點)
這個比較好理解:當MySQL集羣內有多個SQL節點時,只要有一臺SQL節點可用,就可以通過它來訪問MySQL數據庫中保存的表數據。
比如說,關閉sqlA、sqlB中的任何一臺以後,還可以通過另外一臺來訪問mydb庫
完畢!