2011年7月18日 星期一

[記事] MySQL Cluster

想看的再點開

說真的還不知道有什麼威能,但吃飽撐著總得找點事做

基本上照著下面兩篇做就可以,所以以下只能算是執行及粗淺理解的一些記錄
http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html (英文)
http://twpug.net/docs/mysql-5.1/ndbcluster.html(中文)
MySQL Cluster 中的三種角色
Mgmt Node : 假裝自己很重要的管理節點,Data Node/SQL Node 彼此間透過Mgmt Node 溝通,一個Cluster中應該只有一個
SQL Node : 你可以把它當作一般的MySQL Server,負責吃你的Query,吐你要的結果,一個Cluster中至少一個
Data Node : 放資料的結點,一個Cluster中至兩有兩個
架構
                             Client
                                 |
                          SQL Node
                         /        |         \
       Data Node1        |         Data Node2              
                         \        |         /
                          Mgmt Node
                           
IP 配置
Mgmt Node : 192.168.1.1
SQL Node : 192.168.1.2
Data Node 1: 192.168.1.3
Data Node 2: 192.168.1.4
安裝

不論是 Mgmt/SQL/Data Node 裝的都是同一份程式,可以從 http://twpug.net/docs/mysql-5.1/ndbcluster.html#mysql-cluster-limitations 挑適合的版本安裝,為求速成選擇Generic Linux X86_64 的RPM版本

Mgmt/SQL/Data node共通的安裝動作
shell> groupadd mysql
shell> useradd -s /sbin/nologin -M -g mysql mysql
shell>cd  /home
shell> wget wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/mysql-cluster-gpl-7.1.15-linux-x86_64-glibc23.tar.gz/from/http://mysql.ntu.edu.tw/
shell> tar zxvf mysql-cluster-gpl-7.1.15-linux-x86_64-glibc23.tar.gz
shell> mv mysql-cluster-gpl-7.1.15-linux-x86_64-glibc23 mysql_cluster
shell> chown mysql:msql /home/mysql_cluster
Mgmt Node 設定
shell> cd /home/mysql_cluster
shell> mkdir conf
shell> cp support-files/ndb-config-2-node.ini conf/config.ini
shell> vi conf/config.ini

Note: config.ini 很重要的檔案,之後SQL Node/Data Node的設定都是來這邊問,而在啟動後,ndb_mgmd會生出一個binary的cache config fiel (ndb_1_config.bin.1)在同一個目錄下,如果要改config設定,記得先把ndb_1_config.bin.1砍掉!!
#Data Node 預設設定
[ndbd default]
NoOfReplicas= 2
MaxNoOfConcurrentOperations= 10000
DataMemory= 4G
IndexMemory= 2G
TimeBetweenWatchDogCheck= 30000
DataDir= /home/mysql_cluster/data
MaxNoOfOrderedIndexes= 512
NoOfFragmentLogFiles= 512
#Mgmt node 設定
[ndb_mgmd default]
DataDir= /home/mysql_cluster/data
#Mgmt node 設定
[ndb_mgmd]
HostName= 192.168.1.1
#SQL Node 設定
[mysqld]
HostName= 192.168.1.2
#Data Node 設定
[ndbd]
HostName= 192.168.1.3
#Data Node 設定
[ndbd]
HostName= 192.168.1.4
#這個是Data Node Listen 的port ,如果沒有防火牆問題可以不要設,如果被關在鐵幕裡,那還是設一下防火牆規則比較好寫
[tcp default]
PortNumber= 2202
如果機器有防火牆設定, mgmt node 預設聽在 port 1186 ,記得把它打開
Data Node 設定
基本上沒有,但data node 彼此間溝通是透過 port 2202,一樣,如果防火牆有開,記得一併打開
SQL Node 設定
shell> cd /home/mysql_cluster
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cp support-files/mysql.server /etc/init.d/mysqld
shell> vi /etc/my.cnf
#主要在[mysqld]區塊下加入以下兩行設定
[mysqld]
ndbcluster                      # run NDB engine
ndb-connectstring=192.168.1.1  # location of mgmt node
shell> vi /etc/init.d/mysqld
#設定以下兩個參數
basedir=/home/mysql_cluster
datadir=/home/mysql_cluster/data
初始化資料庫
shell> bash scripts/mysql_install_db --user=mysql --basedir=/home/mysql_cluster/ --datadir=/home/mysql_cluster/data
啟動

因為Data node 彼此間需要mgmt node 溝通,而Sql node 需要mgmt node得知data node的位置來當storage,所以第一次啟動要依 mgmt -> data -> sql node 的順序開啟

啟動 mgmt node
shell> /home/mysql_cluster/bin/ndb_mgmd -f /home/mysql_cluster/conf/config.ini --config-dir=/home/mysql_cluster/conf
如果沒有錯誤的話,在Mgmt Node開啟(文字)管理介面,下show 指令,此時應該只有一台mgmt node在列表裡
shell> /home/mysql_cluster/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> status
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2 (not connected, accepting connect from 192.168.1.3)
id=3 (not connected, accepting connect from 192.168.1.4)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.1  (mysql-5.1.56 ndb-7.1.15)
[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from 192.168.1.2)
ndb_mgm> exit
啟動兩台data node
shell> /home/mysql_cluster/bin/ndbd -c 192.168.1.1 --initial (首次啟動才需要加 --initial ,這會清掉舊的所有資料)
開啟一台的時候在 mgmt node 的log中,應該會看到像下面這樣的訊息
2011-07-15 16:58:11 [MgmtSrvr] INFO     -- Node 2: Initial start, waiting for 3 to connect,  nodes [ all: 2 and 3 connected: 2 no-wait:  ]
這會一直持續到第二台開起來,且完成訊息交換。如果兩台都開起來還是一直跳,表示data node的連接埠 (port 2202) 不通。

正常的話,回到 mgmt node 打開ndb_mgm會看到兩個data node
shell>/home/mysql_cluster/bin/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    @192.168.1.3  (mysql-5.1.56 ndb-7.1.15, starting, Nodegroup: 0, Master)
id=3    @192.168.1.4  (mysql-5.1.56 ndb-7.1.15, starting, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.1  (mysql-5.1.56 ndb-7.1.15)
[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from 192.168.1.2)
最後開啟 sql node
shell> /etc/init.d/mysqld start
如果所有設定都搞對,那回到ndb_mgm應該就會看到四個 node都連上來了
shell> /home/mysql_cluster/bin/ndb_mgm
-- NDB Cluster -- Management Client --
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.1.3  (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, Master)
id=3    @192.168.1.4  (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.1  (mysql-5.1.56 ndb-7.1.15)
[mysqld(API)]   1 node(s)
id=4    @192.168.1.2  (mysql-5.1.56 ndb-7.1.15)
除錯

大部份的錯誤可以在mgmt node 的 data/<HOSTNAME>.err 中看出來

效能測試

在Cluster架構下及一般的MySQL Server 中塞入15295685筆資料 (檔案大小 1.7 GB)
cluster >  time /home/mysql_cluster/bin/mysql -p tsp < /tmp/data/taiwan_log_2.sql
Enter password:

real    11m42.884s
user    0m55.469s
sys     0m2.374s

single >  time /home/mysql/bin/mysql -p tsp < /tmp/data/taiwan_log_2.sql
Enter password:

real    24m17.981s
user    1m3.451s
sys     0m3.176s


看起來很美好啊 (除了 config 參數不知道怎麼設外),是誰說MySQL Cluster 沒用的 @@?

2 則留言:

  1. 您好,我最近正開始嘗試建立mysql cluster 依照你的步驟執行時,在啟動的時候會遇到一個問題:
    2012-11-21 21:17:49 [ndbd] WARNING -- Cannot change directory to '/home/netdb/mysql_cluster/data', error: 2
    2012-11-21 21:17:49 [ndbd] ERROR -- Couldn't start as daemon, error: 'Failed to open logfile '/home/netdb/mysql_cluster/data/ndb_2_out.log' for write, errno: 2'


    不知道您有沒有甚麼意見能分享? 感謝><

    回覆刪除
    回覆
    1. mysql 是否用特殊身份啟動(eg : mysql),看看相關的路徑該身份是否有寫入權限囉 @@a

      刪除