MySQL Cluster 是MySQL適合於分佈式計算環境的高實用、高冗餘版本。它採用了NDB Cluster 存儲引擎,允許在1個 Cluster 中運行多個MySQL服務器。 該技術允許在無共享的系統中部署“內存中”數據庫的 Cluster 。
管理節點(mgm):這類節點的作用是管理MySQLCluster內的其他節點,如提供配置數據,並停止節點,運行備份等。由於這類節點負責管理其他節點的配置,應該在啓動其他節點之前啓動這類節點。MGM節點是用命令“ndb_mgmd”啓動的;
數據節點(ndb):這類節點用於保存Cluster的數據,數據節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4個數據節點,沒有必要設定過多的副本,在NDB中數據會盡量的保存在內存中。數據節點使用命令“ndb”啓動的;
SQL節點:這是用來訪問Cluster數據的節點,對於MySQL Cluster,客戶端節點是使用NDB Cluster存儲引擎的傳統MySQL服務器。通常,SQL節點使用命令“mysqld-ndbcluster”啓動的;
mysql-cluster軟件提供3種進程:
-
mysqld進程:供用戶訪問和執行sql語句
-
數據進程ndbd:存儲數據
- 管理進程mgmd:管理集羣中的所有的主機
- 不需要安裝mysql-server軟件了,所以可以關掉mysql服務
主機名 | 角色 | IP地址 |
---|---|---|
node01 | 管理、數據節點 | 192.168.0.201 |
node02 | 管理、數據節點 | 192.168.0.202 |
node03 | 數據、sql節點 | 192.168.0.203 |
ipsan1 | 172.16.10.191 | |
ipsan2 | 172.16.10.192 |
安裝的是Mysql cluster 7.3,爲了和參考文檔中的版本一致。
關閉防火牆及selinux(all)
wget https://cdn.mysql.com//Downloads/MySQL-Cluster-7.3/MySQL-Cluster-gpl-7.3.21-1.el7.x86_64.rpm-bundle.tar
下載並解壓:
mkdir ./mysql-cluster
tar xvf MySQL-Cluster-gpl-7.3.21-1.el7.x86_64.rpm-bundle.tar -C ./mysql-cluster
檢查並卸載掉之前安裝的Mysql及mariadb版本並安裝集羣版本(all):
cd mysql-cluster
rpm -ivh *.rpm
根據提示補安裝依賴包:
yum -y install net-tools perl-Module-Install
運行mysql-install-db腳本(5.6及以下版本)進行初始化,注意其中用戶爲root的名稱需要跟配置文件my.cnf中的相同(rpm安裝已經自動設置了環境變量,其他方式安裝可以到對應目錄下執行———all)
mysql_install_db -user=mysql
編輯集羣管理節點配置文件/usr/mysql-cluster/config.ini
[ndb_mgmd default]
datadir = /usr/local/mysql/ndbdata
[ndbd default]
NoOfReplicas = 1 #定義在Cluster環境中相同數據的份數,最大爲4
DataMemory = 80M #每個數據節點中給數據分配的內存
IndexMemory = 18M #每個數據節點中給索引分配的內存
datadir = /usr/local/mysql/ndbdata
[ndb_mgmd] #定義管理節點
NodeId = 1
HostName = node01
#[ndbd]
#NodeId = 11
#HostName = node01
[ndbd] #定義Ndb節點
NodeId = 11
HostName = node01
[ndbd]
NodeId = 12
HostName = node02
[ndbd]
NodeId = 13
HostName = node03
[mysqld]
NodeId = 14
HostName = node01
[mysqld]
NodeId = 15
HostName = node02
在數據節點上配置/etc/my.cnf
[mysqld]
symbolic-link = 0
ndbcluster #使用ndb集羣引擎
ndb-connectstring = 192.168.0.201 #指定管理集羣的ip地址,多個以,分隔
[mysqld_safe]
log-error = /var/log/mysql.log
pid-file=/var/run/mysqld/mysql.pid
[mysql_cluster] #指定管理集羣的ip地址,多個以,分隔
ndb-connectstring = 192.168.0.201
在啓動mysql集羣的時候,注意首先要啓動管理節點,並依次啓動其他等若干個節點,相應的啓動步驟如下:
1. 在管理節點上,切換到/usr/local/mysql/bin目錄下,執行ndb_mgmd -f /var/lib/mysql-cluster/config.ini命令,完成管理節點的啓動;
2. 在各個數據節點上,切換到/usr/local/mysql/bin目錄下,執行ndbd --initial(第一次啓動時,否則執行ndbd即可),完成對數據節點的啓動;
3. 在各個SQL節點上,同樣切換到/usr/local/mysql/bin目錄下,執行mysqld_safe --user=root完成啓動;
4. 在管理節點上運行ndb_mgm命令,進入數據庫管理的客戶端,輸入show命令,查看與之相連接的各個節點的狀態;
初始化集羣管理進程並啓動(監聽客戶端):
[root@node01 mysql-cluster]# ndb_mgmd -f /usr/mysql-cluster/config.ini --initial
MySQL Cluster Management Server mysql-5.6.40 ndb-7.3.21
[root@node01 ~]# ps aux|grep mgm
root 1069 0.4 0.2 637040 8348 ? Ssl 10:48 0:00 ndb_mgmd -f /usr/mysql-cluster/config.ini
root 1080 0.0 0.0 112704 964 pts/0 S+ 10:48 0:00 grep --color=auto mgm
在所有節點上初始化集羣:
[root@node03 mysql-cluster]# ndbd --initial
[root@node03 mysql-cluster]# ndbd --initial
2018-06-11 16:09:23 [ndbd] INFO -- Angel connected to '192.168.0.201:1186'
2018-06-11 16:09:23 [ndbd] INFO -- Angel allocated nodeid: 13
如果只有第一行的信息提示,很有可能是mgmd節點沒有正常啓動。
首次啓動,需要添加--initial參數,進行NDB節點的初始化工作,在以後的啓動過程中,不能添加該參數,否則NDBD程序會清除之前建立的所有用於恢復的數據文件和日誌文件;
集羣正常後的狀態:
[root@node01 mysql-cluster]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.0.201:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 3 node(s)
id=11 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 0, *)
id=12 @192.168.0.202 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 1)
id=13 @192.168.0.203 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 2)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21)
[mysqld(API)] 2 node(s)
id=14 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21)
id=15 @192.168.0.202 (mysql-5.6.40 ndb-7.3.21)
或者
[root@node01 ~]# ndb_mgm -e show
Connected to Management Server at: 192.168.0.201:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 3 node(s)
id=11 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 0, *)
id=12 @192.168.0.202 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 1)
id=13 @192.168.0.203 (mysql-5.6.40 ndb-7.3.21, Nodegroup: 2)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21)
[mysqld(API)] 2 node(s)
id=14 @192.168.0.201 (mysql-5.6.40 ndb-7.3.21)
id=15 @192.168.0.202 (mysql-5.6.40 ndb-7.3.21)
在SQL節點上分別進入系統的安全狀態,並完成對root用戶的密碼修改:
mysqld_safe --user=root &
直接輸入Mysql登錄
驗證集羣是否搭建成功,在SQL節點A上運行命令,在SQL節點B上查詢:
mysql> create database ctest;
Query OK, 1 row affected (0.05 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ctest |
| mysql |
| ndbinfo |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> create table test(
-> id int PRIMARY KEY
-> );
Query OK, 0 rows affected (0.03 sec)
注意所建立表的存儲引擎必須是ndbcluster類型,否則無法同步到其他節點;
查看錶的存儲引擎類型:
mysql> show table status from ctest where name='test' \G;
*************************** 1. row ***************************
Name: test
Engine: ndbcluster #存儲引擎類型
Version: 10
Row_format: Fixed
Rows: 1
Avg_row_length: 28
Data_length: 32768
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)
如果類型是InnoDB,就使用語句更改:
alter table test engine=ndbcluster;
trouble shooting
- 啓動nbd_mgmd失敗,報錯:
[root@node01 mysql-cluster]# ndb_mgmd -f /usr/mysql-cluster/config.ini --reloadMySQL Cluster Management Server mysql-5.6.40 ndb-7.3.21 2018-06-11 15:41:35 [MgmtSrvr] ERROR -- at line 37: Nodegroup 1 has 1 members, NoOfReplicas=2 2018-06-11 15:41:35 [MgmtSrvr] ERROR -- Could not load configuration from '/usr/mysql-cluster/config.ini' 2018-06-11 15:41:35 [MgmtSrvr] ERROR -- Could not determine which nodeid to use for this node. Specify it with --ndb-nodeid=<nodeid> on command line
是指配置文件的參數NoOfReplicas = 2,對應配置文件中定義的ndb_mgmd就應該有2個,改成1就行。