如何架設 MySQL Cluster

MySQL Cluster提供無共享(shared-nothing)的叢集以及自動分片(auto-sharding)的功能,並且具備 High Availability 以及 Scalability 的特點。
*什麼是 shared-nothing?這是一種架構,在此架構下,每個節點都有自己的 CPU 、記憶體、空間,而跨節點之間的數據往來通常透過網路來完成。

以下使用 VM(Ubuntu) 來操作。要架設功能完整的 MySQL Cluster 至少需要 3 台 VM,一台 Management Node 以及兩台 Data Node 。 Management Node 的存在可以避免 Split-Brain 的情況發生,而兩台 Data Node 是為了 Availability ,MySQL Cluster 的 auto-sharding 功能會將資料分片,假設其中一台掛掉,另一台可充當備援,確保資料的可使用性。

而本文章將會使用 5 台 VM ,2 Management Node、2 Data Node 以及 1 load balancer,下圖是系統的架構。

1. 安裝 management nodes / Installing the management nodes

在開始前,要先到 http://www.mysql.com/downloads/cluster/#downloads 去下載 MySQL Cluster 。

mkdir temp
cd temp
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz
tar xvfz mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz

解壓縮後將 ndb_mgmndb_mgmd 移動到 /usr/bin 裡面

cd mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64
cp bin/ndb_mgm /usr/bin
cp bin/ndb_mgmd /usr/bin

修改 binary 檔案的權限,讓系統可以執行

chmod 755 /usr/bin/ndb_mg*
rm -rf temp

接著要在 /var/lib/mysql-cluster 新增一個設定檔

mkdir /var/lib/mysql-cluster
vim /var/lib/mysql-cluster/config.ini

內容如下,把 IP 改成你自己系統的:

[NDBD DEFAULT]

NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]
DataDir=/var/lib/mysql-cluster
[TCP DEFAULT]

# Section for the cluster management node
[NDB_MGMD]
NodeId=1
# IP address of the first management node (this system)
HostName=192.168.44.100

[NDB_MGMD]
NodeId=2
#IP address of the second management node
HostName=192.168.44.101

# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=192.168.44.105
DataDir= /var/lib/mysql-cluster
[NDBD]
# IP address of the second storage node
HostName=192.168.44.106
DataDir=/var/lib/mysql-cluster
# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]

完成後就可以馬上把這個節點生效

ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/

最後要設成隨開機啟動

echo "ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/" > /etc/init.d/ndb_mgmd
chmod 755 /etc/init.d/ndb_mgmd

management node 架設大致上就是這樣,第二顆也照著做就可以了,注意 NodeId 不需要更動。

2. 安裝 data nodes / Installing the data nodes

這部份跟 management node 差不多,都是利用下載下來的 MySQL Cluster 來運作。

首先要先新增 mysql 這個群組

groupadd mysql
useradd -g mysql mysql
cd /usr/local/
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz
tar xvfz mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz

接下來要創一個 symbolic link , 然後開始安裝 mysql

ln -s mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64 mysql
cd mysql
apt-get install libaio1 libaio-dev
scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

修改個資料夾的持有人

chown -R root:mysql .
chown -R mysql data

把 mysql 設成隨開機啟動

cp support-files/mysql.server /etc/init.d/
chmod 755 /etc/init.d/mysql.server

再來要把 /usr/local/mysql/bin 複製到 /usr/bin 裡面去,然後建立一個 symbolic link

cd /usr/local/mysql/bin
mv * /usr/bin
cd ../
rm -fr /usr/local/mysql/bin
ln -s /usr/bin /usr/local/mysql/bin

接著要新增一個 my.cnf ,這個跟一般 mysql 的 my.cnf 不大一樣。記得把 ndb-connectstring 改成你自己 management node 的 IP

[mysqld]
ndbcluster
# IP address of the cluster management node
ndb-connectstring=192.168.44.100,192.168.44.101
default-storage-engine=NDBCLUSTER
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysql_cluster]
# IP address of the cluster management node
ndb-connectstring=192.168.44.100,192.168.44.101

還記得在 management node 上設定的 data folder 是在哪嗎?現在要新增一個資料夾,然後就能初始話 ndbd 並且開始 mysql 服務

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
ndbd –-initial
/etc/init.d/mysql.server start

然後你可以對 mysql 做一些安全性的設定,就像一般安裝 mysql 一樣

/usr/local/mysql/bin/mysql_secure_installation

最後還是要把 ndbd 設成隨開機啟動

echo "ndbd" > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd

以上就是 data node 安裝的流程。

3. 測試 / Testing

上面都啟動完成後,現在可以來試試看 ndb_mgm 到底是長怎樣。連到你的 management node ,然後照下面指令輸入,如果 output 看起來很相似,那就是成功囉!

root@mysql-mgm1:/home/ubuntu# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=3    @192.168.44.105  (mysql-5.6.25 ndb-7.4.7, Nodegroup: 0, *)
id=4    @192.168.44.106  (mysql-5.6.25 ndb-7.4.7, Nodegroup: 0)

[ndb_mgmd(MGM)] 2 node(s)
id=1    @192.168.44.100  (mysql-5.6.25 ndb-7.4.7)
id=2    @192.168.44.101  (mysql-5.6.25 ndb-7.4.7)

[mysqld(API)]   2 node(s)
id=5    @192.168.44.106  (mysql-5.6.25 ndb-7.4.7)
id=6    @192.168.44.105  (mysql-5.6.25 ndb-7.4.7)

成功後可以連到 data node 1 ,輸入一些基本的 sql 指令試試看

mysql -uroot -p
mysql > create database test;
mysql > use test;
mysql > CREATE TABLE attendees (id INT NOT NULL, name VARCHAR(100), PRIMARY KEY (id));
mysql > insert into attendees (id, name) values (1, 'jaychung');
mysql > select * from attendees;
+----+----------+
| id | name     |
+----+----------+
|  1 | jaychung |
+----+----------+
1 row in set (0.00 sec)

由於我們在 data node 的 my.cnf 中,有將預設引擎設定成 NDBCLUSTER ,所以我們在建置資料表時就不用再輸入一次了。

然後可以到另一台 data node ,試試看以下的指令,你會看到相同的 output !

mysql -u root -p
mysql> use test;
mysql > select * from attendees;
+----+----------+
| id | name     |
+----+----------+
|  1 | jaychung |
+----+----------+
1 row in set (0.00 sec)

現在你如果在 data node 2 插入資料,他一樣會 replicate 回 data node 1。

4. 安裝 Load-balancer / Installing the load balancer

這個部分是額外的安裝,其實說 load balancer ,倒不如說 proxy 就好,我們的目的是要讓使用者可以統一窗口,只要連接到這台就能進行 write / read。

apt-get install mysql-proxy
mkdir /etc/mysql-proxy
cd /etc/mysql-proxy
vim mysql-proxy.conf

將以下內容加到 mysql-proxy.conf

[mysql-proxy]
daemon = true
proxy-address = 192.168.44.103:3306
proxy-skip-profiling = true
keepalive = true
event-threads = 50
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
proxy-backend-addresses = 192.168.44.105:3306,192.168.44.106:3306
proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/balance.lua

然後也要設定成隨開機啟動,增修內容至 /etc/default/mysql-proxy

ENABLED="true"
OPTIONS="--defaults-file=/etc/mysql-proxy/mysql-proxy.conf --plugins=proxy"

如此一來,你可以使用這個指令

/etc/init.d/mysql-proxy start
/etc/init.d/mysql-proxy stop
/etc/init.d/mysql-proxy status

最後的最後,如果你想讓使用者可以透過 proxy 操作資料庫,那就得幫他們新增 user ,但由於 mysql 中的 user 是不會同步到每個 sql node 的,所以必須每個 node 都新增一次,這是比較麻煩的地方。

例如我要新增一個使用者 kcchung ,允許的網域在 192.168.44.%,然後給他可以新增 kcchung_% 資料庫的權限,語法如下:

CREATE USER 'kcchung'@'192.168.44.%' IDENTIFIED BY  'password';
GRANT USAGE ON * . * TO  'kcchung'@'192.168.44.%' IDENTIFIED BY  'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
GRANT ALL PRIVILEGES ON  `kcchung\_%` . * TO  'kcchung'@'192.168.44.%';

以上就是整個 MySQL Cluster 建置的流程,注意自己的 IP 要修改對,然後那些主機都要是互通的,可以互相 ping 看看。

如果想要更進一步了解,建議看 官方文件

Show Comments