MySQL NDB Cluster安裝
MySQL集羣是一個無共享的(share-nothing)、分佈式節點架構的存儲方案,目的是提供容錯性和高性能。
MySQL NDB Cluster架構如圖:
MySQL NDB Cluster架構按照節點類型分爲三部分:
- 管理節點:管理節點通過對配置文件conifg.ini的維護來對其他節點進行管理。該文件可以用來配置有多少副本需要維護、在數據節點上爲數據和索引分配多少內存、數據節點的位置、數據節點上保存數據的磁盤的位置,SQL節點的位置信息等,管理節點只能有一個。
- SQL節點:SQL節點可以理解爲應用程序和數據節點的一個橋樑,應用程序不能直接訪問數據節點,只能先訪問SQL節點,然後SQL節點再去訪問數據節點來返回數據,Cluster中可以有多個SQL節點,通過每個SQL節點查詢到的數據都是一致的,一般來說,SQL節點越多,分配到每個SQL節點的負載就越小,系統的整體性能就越好;
- 數據節點:數據節點用來存放數據,可有多個數據節點。
下面演示MySQL NDB Cluster的部署安裝:
在5臺VMware 虛擬機上安裝部署
在每臺虛擬機上執行
[root@localhost ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.133.131 mgr
172.16.133.132 ndb01
172.16.133.133 ndb02
172.16.133.134 ndb03
172.16.133.135 ndb04
使局域網內集羣可以通過主機名訪問
1、環境信息:
- 管理節點mgr:172.16.133.131
- SQL節點ndb01:172.16.133.132
- SQL節點ndb02:172.16.133.133
- 數據節點ndb03:172.16.133.134
- 數據節點ndb04:172.16.133.135
2、下載MySQL NDB Cluster軟件;
3、安裝SQL節點,在每個SQL節點都執行如下操作;
1)創建mysql用戶和組,如果該用戶和組不存在:
[root@localhost ~]# userdel mysql (因爲是新系統,所以就把現有的MySQL用戶給刪除了)
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -g mysql mysql
[root@localhost ~]# passwd mysql (MySQL密碼要設置的複雜一點,或者在創建用戶的時候設置不讓登陸系統
[root@localhost ~]# mkdir -p /data/mysql/db_file 在mysql 下創建bin_log 、log 目錄
[root@localhost ~]# chown -R mysql:mysql /data
2)解壓縮 mysql-cluster軟件;
[root@localhost ~]# tar -xvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
[root@localhost ~]# mv mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64 /usr/local/mysql
3)安裝數據庫系統;
[root@localhost ~]# su - mysql
[mysql@localhost~]$
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/db_file/
-----注意,初始化數據庫會生成登錄MySQL數據庫的root密碼,一定要記住,一會登錄數據庫要用
編輯SQL節點 my.cnf 文件
[mysqld]
character_set_server=utf8
collation_server=utf8_bin
max_allowed_packet = 128M
event_scheduler =1
open_files_limit = 20480
max_connections = 3000
default-storage-engine=ndbcluster
basedir=/usr/local/mysql/
datadir=/data/mysql/db_file
user=mysql
log-error=/data/mysql/log/sqlnode.err
ndbcluster
ndb-connectstring=mgr
[mysql_cluster]
ndb-connectstring=mgr
[root@localhost ~]# vi /etc/profile 在最下方加上
export PATH
PATH=$PATH:/usr/local/mysql/bin
保存退出
source /etc/profile 使環境生效
4)拷貝MySQL啓動腳本;
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
[mysql@localhost ~]$ /usr/local/mysql/support-files/mysql.server start
[mysql@localhost ~]$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/ect/my.cnf --user=mysql & (效果一樣)
5)進入數據庫檢查;
[mysql@localhost ~]$ /usr/local/mysql/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set password='root'; (因爲剛纔使用的密碼是個默認的登錄密碼,所以我們要修改)
mysql> flush privileges;
然後再重新登錄MySQL即可,進行檢查
這樣,二進制的MySQL SQL節點就順利安裝完成了。
4、安裝數據節點,在每個數據節點都執行如下操作;
[root@localhost ~]# tar -xvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
[root@localhost ~]# mv mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64 /usr/local/mysql
創建數據文件存放路徑
[root@localhost ~]# mkdir -p /data/mysql/db_file 在mysql 下創建log目錄
編輯數據節點my.cnf
[mysqld]
basedir=/usr/local/mysql/
datadir=/data/mysql/db_file
user=mysql
log-error=/data/mysql/log/sqlnode.err
ndbcluster
ndb-connectstring=mgr
[mysql_cluster]
ndb-connectstring=mgr
vi /etc/profile 在最下方加上
export PATH
PATH=$PATH:/usr/local/mysql/bin
保存退出
source /etc/profile 使環境生效
建議用上述方式,因爲以後使用我們可能會使用其他的管理工具查詢集羣狀態,如 ndb_cofig 等
或者直接scp sql節點 將ndbd、ndbmtd拷貝至/usr/local/bin/目錄中
5、安裝管理節點;
[root@localhost ~]# tar -xvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
[root@localhost ~]# mv mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64 /usr/local/mysql
[root@localhost ~]# mkdir -p /data/mysql-cluster 作爲管理節點文件存放路徑
[root@localhost ~]# vi /etc/profile 在最下方加上
export PATH
PATH=$PATH:/usr/local/mysql/bin
保存退出
source /etc/profile 使環境生效
建議用上述方式,因爲以後使用我們可能會使用其他的管理工具查詢集羣狀態,如 ndb_cofig 等
或者直接scp sql節點 將ndb_mgm、ndb_mgmd拷貝至/usr/local/bin/目錄中
編輯管理節點config.ini
[root@mgr ~]# cat /data/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=1024M
StringMemory=5M
MaxNoOfTables = 1024
MaxNoOfAttributes = 5000000
MaxNoOfOrderedIndexes = 10000
MaxNoOfTriggers = 10240
MaxNoOfConcurrentTransactions = 4096
MaxNoOfLocalOperations=110000
MaxNoOfConcurrentOperations=100000
TransactionDeadLockDetectionTimeOut = 15000
[ndb_mgmd]
hostname=mgr
datadir=/data/mysql-cluster
[ndbd]
NodeId=2
hostname=ndb03
datadir=/data/mysql/db_file
StopOnError=0
[ndbd]
NodeId=3
hostname=ndb04
datadir=/data/mysql/db_file
StopOnError=0
[mysqld]
NodeId=4
hostname=ndb01
[mysqld]
NodeId=5
hostname=ndb02
[mysqld]
[mysqld]
各個參數作用不在詳細介紹,可以自己google.根據自己的硬件及需求修改。
---注意:7.6.7版本不在支持IndexMemory,新版本將IndexMemory和DataMemory合併。
6、啓動Cluster;
Cluster需要各個節點都進行啓動後纔可以運行,節點的啓動順序爲管理節點——>數據節點——>SQL節點。
啓動管理節點:
- [root@mgr mysql-cluster]# ndb_mgmd - f ./config.ini --initial (如修改config.ini中配置,需要添加該參數才生效)
- MySQL Cluster Management Server mysql-5.7.21 ndb-7.5.9
- [root@mgrmysql-cluster]# ps aux |grep ndb_mgmd
- root 8155 2.5 0.6 504480 3380 ? Ssl 20:48 0:00 ndb_mgmd -f ./config.ini
- root 8166 13.0 0.1 112632 968 pts/0 S+ 20:48 0:00 grep --color=auto ndb_mgmd
- [root@mgr mysql-cluster]#
啓動數據節點:
- [root@strong local]# ndbd --initial (第一次啓動是添加該參數,初始化數據節點,如在有數據情況下,該參數將刪除所有數據,用於數據恢復時用,謹記!!!)
- 2018-09-06 20:51:40 [ndbd] INFO -- Angel connected to '10.24.32.180:1186'
- 2018-09-06 20:51:40 [ndbd] INFO -- Angel allocated nodeid: 2
啓動SQL節點:
- [root@ndb01 ~]# service mysql.server start
- Starting MySQL........................................................................................................................................... SUCCESS!
7、節點全部成功啓動後,在管理節點查看集羣狀態;
[root@mgr ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @172.16.133.134 (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0, *)
id=3 @172.16.133.135 (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @172.16.133.131 (mysql-5.7.23 ndb-7.6.7)
[mysqld(API)] 4 node(s)
id=4 @172.16.133.132 (mysql-5.7.23 ndb-7.6.7)
id=5 @172.16.133.133 (mysql-5.7.23 ndb-7.6.7)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
ndb_mgm>
ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客戶端管理工具,通過它可以方便的檢查Cluster的狀態、啓動備份、關閉Cluster等功能。
通過上面的狀態信息,可以看到:
- 1)集羣的管理服務端口是1186;
- Connected to Management Server at: localhost:1186
- 2)集羣的數據節點有2個;
- [ndbd(NDB)] 2 node(s)
id=2 @172.16.133.134 (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0, *)
id=3 @172.16.133.135 (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0) - 3)管理節點有一個;
- [ndb_mgmd(MGM)] 1 node(s)
id=1 @172.16.133.131 (mysql-5.7.23 ndb-7.6.7) - [ndb_mgmd(MGM)] 1 node(s)
- id=1 @10.24.32.180 (mysql-5.7.21 ndb-7.5.9)
- 4)SQL節點有4個,且處於連接狀態;
- [mysqld(API)] 4 node(s)
id=4 @172.16.133.132 (mysql-5.7.23 ndb-7.6.7)
id=5 @172.16.133.133 (mysql-5.7.23 ndb-7.6.7)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
8、測試Cluster;
使用Cluster,則表的存儲引擎必須爲NDB,其他類型存儲引擎的數據不會保存到數據節點中,對於CLuster的一個重要功能就是防止單點故障,下面將分別進行測試:
1)NDB存儲引擎測試
- --在任一SQL節點(本例用172.16.133.132)的test庫創建測試表t_cluster,設置存儲引擎爲NDB:
- mysql> create table t_cluster(id int,name varchar(100),cdate datetime default now()) engine=NDB;
- Query OK, 0 rows affected (0.42 sec)
- mysql> insert into t_cluster(id,name) values(1,'Alen'),(2,'Cluster Test');
- Query OK, 2 rows affected (0.10 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> select *from t_cluster;
- +------+--------------+---------------------+
- | id | name | cdate |
- +------+--------------+---------------------+
- | 1 | Alen | 2018-09-06 23:07:50 |
- | 2 | Cluster Test | 2018-09-06 23:07:50 |
- +------+--------------+---------------------+
- 2 rows in set (0.03 sec)
- mysql>
- --在另一SQL節點(本例用172.16.133.133)的test庫查詢表t_cluster,結果如下:
- mysql> select *from t_cluster;
- +------+--------------+---------------------+
- | id | name | cdate |
- +------+--------------+---------------------+
- | 1 | Alen | 2018-09-06 23:07:50 |
- | 2 | Cluster Test | 2018-09-06 23:07:50 |
- +------+--------------+---------------------+
- 2 rows in set (0.02 sec)
- mysql>
- --如上,兩個SQL節點查詢到的數據是一致的。
- --在SQL節點172.16.133.132將表t_cluster的存儲引擎改爲MyISAM,再次插入測試:
- mysql> alter table t_cluster engine=myisam;
- Query OK, 2 rows affected (0.66 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> insert into t_cluster(id,name) values(3,'MyISAM Test');
- Query OK, 1 row affected (0.03 sec)
- mysql> select *from t_cluster;
- +------+--------------+---------------------+
- | id | name | cdate |
- +------+--------------+---------------------+
- | 2 | Cluster Test | 2018-09-06 23:07:50 |
- | 1 | Alen | 2018-09-06 23:07:50 |
- | 3 | MyISAM Test | 2018-09-06 23:15:02 |
- +------+--------------+---------------------+
- 3 rows in set (0.00 sec)
- mysql>
- --在SQL節點172.16.133.133再次查詢表t_cluster,可以發現,表無法查詢,結果如下:
- mysql> select *from t_cluster;
- ERROR 1412 (HY000): Table definition has changed, please retry transaction
- mysql>
- --在SQL節點172.16.133.132將表t_cluster的存儲引擎改爲NDB:
- mysql> alter table t_cluster engine=ndb;
- Query OK, 3 rows affected (0.32 sec)
- Records: 3 Duplicates: 0 Warnings: 0
- mysql>
- --在SQL節點172.16.133.133再次查詢,結果如下:
- mysql> select *from t_cluster;
- +------+--------------+---------------------+
- | id | name | cdate |
- +------+--------------+---------------------+
- | 3 | MyISAM Test | 2018-03-06 23:15:02 |
- | 1 | Alen | 2018-03-06 23:07:50 |
- | 2 | Cluster Test | 2018-03-06 23:07:50 |
- +------+--------------+---------------------+
- 3 rows in set (0.01 sec)
- mysql>
- --顯然,表t_cluster的數據再次同步到了數據節點,所有SQL節點又都可以正常查詢數據。
9、Cluster的關閉;
- [root@strong mysql-cluster]# ndb_mgm
- -- NDB Cluster -- Management Client --
- ndb_mgm> shutdown
- Connected to Management Server at: localhost:1186
- Node 2: Cluster shutdown initiated
- Node 3: Cluster shutdown initiated
- Node 3: Node shutdown completed.
- 3 NDB Cluster node(s) have shutdown.
- Disconnecting to allow management server to shutdown.
- Node 2: Node shutdown completed.
- ndb_mgm>
注意:集羣關閉後,SQL節點不會關閉,需手工關閉;
經測試:虛擬機根本無法發揮集羣高併發的性能,同時集羣對網絡要求很是苛刻,數據節點經常無故宕服務,弄得手忙腳亂,如果倉促上正式環境,只能說佛祖保佑!!!這也是mysql ndb cluster 沒有廣泛使用的原因,bug太多!!!
如有問題探討,請加QQ羣:695182221