MySQL Cluster,需要的 server 要三台(含)以上,是不需要當心 primary key 重覆的問題,它架構分 Manage Nodes、Data Nodes、SQL Nodes,網路上有很多文章都說 Data Node 是存放資料的地方,明明 SQL Nodes 就存在著 mysql test XXX 等資料庫名稱啊,為何說它是存資料的地方,不會意思是 Data Nodes 是存資料在記憶體的意思吧,是的沒錯,Data Node 確實是儲存資料的地方 (ndbd程序),只是它不是像 /var/lib/mysql 的樣子可以容易被我們看得懂,Data Node 是將資料及index放在記憶體中,且也有存在硬碟裡(停止程序時再啟動資料是還在的),不過當記憶體不足時,它會有錯誤( table XXX is full),新版是有支援寫到硬碟裡。而 SQL Node (mysqld程序) 只是讓我們建立資料庫、表的地方 (看得到/var/lib/mysql/XXX),只是 SQL Node 這邊是看不到實際空間用量的。

環境

manager node: 10.10.10.137
data node1: 10.10.10.135
data node2: 10.10.10.134
data node3: 10.10.10.171
sql node1: 10.10.10.135
sql node2: 10.10.10.134
sql node3: 10.10.10.171

manager node 及所有的 node 都要裝 mysql-cluster (到 mysql 官網下載)

tar zxf mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz
mv mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64 /usr/local/mysql

manager node

mkdir /var/lib/mysql-cluster
cat <<EOF> /var/lib/mysql-cluster/config.ini
[ndb_mgmd default]
datadir=/var/lib/mysql-cluster

[ndbd default]
NoOfReplicas=3
DataMemory=80M
IndexMemory=18M
datadir=/usr/local/mysql/data

[ndb_mgmd]
NodeId=1
hostname=10.10.10.137

[ndbd]
NodeId=2
hostname=10.10.10.135

[ndbd]
NodeId=3
hostname=10.10.10.134

[ndbd]
NodeId=4
hostname=10.10.10.171

[mysqld]
NodeId=5
hostname=10.10.10.135

[mysqld]
NodeId=6
hostname=10.10.10.134

[mysqld]
NodeId=7
hostname=10.10.10.171
EOF

manager node 設定,它只要 ndb_mgm 與 ndb_mgmd 而已

cp -rp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
chmod +x /usr/local/bin/ndb_mgm*

data nodes

cat <<EOF> /etc/my.cnf
[mysqld]
# enable mysql cluster
ndbcluster
# 與 manager 連線,default port 是 1186
ndb-connectstring=10.10.10.137:1186

[mysql_cluster]
ndb-connectstring=10.10.10.137:1186
EOF

sql nodes

useradd -d /usr/local/mysql mysql
cd /usr/local/mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .
cat <<EOF> /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

default_storage_engine=ndbcluster

# enable mysql cluster
ndbcluster
# 與 manager 連線,default port 是 1186
ndb-connectstring=10.10.10.137:1186

[mysql_cluster]
ndb-connectstring=10.10.10.137:1186

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
socket=/usr/local/mysql/data/mysql.sock
EOF

sql nodes

cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql
yes|cp -rp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
chmod +x /etc/init.d/mysql.server

cluster 環境開始執行

manager node

ndb_mgmd --nodaemon -v -f /var/lib/mysql-cluster/config.ini

data nodes

/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon --initial

–initial 只能在第一次完全無正式資料時啟用,不然原資料就會毀了

第二次之後要再啟動,只要如此即可

/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon

–nodaemon 我只是測試用方便,正式跑時可以省略

sql nodes

/etc/init.d/mysql.server start

匯入已存在的 sql

需要把它們的 engine 都改成 ndbcluster

一定要是 ndb 的 engine,cluster 才會同步

sql nodes 的 mysql 起來後,改一下 root 密碼

/usr/local/mysql/bin/mysqladmin -u root password '123456'

如果有使用 phpmyadmin 遇到無法登入的情況 (錯誤  #2002 無法登入 MySQL 伺服器),那是因為 socket 檔的關系

ln -s /usr/local/mysql/data/mysql.sock /var/lib/mysql/

查看狀態,在 monitor 上

ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	3 node(s)
id=2	@10.10.10.135  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=3	@10.10.10.134  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
id=4	@10.10.10.171  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@10.10.10.137  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]	3 node(s)
id=5	@10.10.10.135  (mysql-5.6.24 ndb-7.4.6)
id=6	@10.10.10.134  (mysql-5.6.24 ndb-7.4.6)
id=7	@10.10.10.171  (mysql-5.6.24 ndb-7.4.6)

 

我測試時是用 virtualbox 架設環境的

  • centos 6.4 x64
  • 1 core cpu
  • 512MB ram
  • 500GB disk
  • wordpress 4.2.2

在大量 insert 資料時,我看 data nodes 每台的 ndbd 的 cpu 使用率在 30% 以下

當我真的 insert 資料後,可以發現在 sql nodes 用 phpmyadmin 查看時,大小的欄位是寫未知,也就是無法知道容量用了多少,就算 du -sh /usr/local/mysql/data/DBNAME 也永遠都是 148KB,也就是說 sql node 只是讓你用來連線 3306 用的,真正的資料確實存在於 data nodes (即 ndbd 啟動的地方)。

情境測試
1x manage node + 1x sql node + 3x data nodes 的情況下
only manage node 掛了,服務正常
1x data node 掛了,服務正常
2x data node 掛了,服務正常
1x data node > 1x data node > 1x manage node 依序掛了,服務正常
1x manage node > 1x data node 依序掛了,中斷,因為 manage node 是負責管理掌管者,沒有它就不知道誰掛了後要怎麼處理了
假如其中一台 data node 掛了,要再起來,不過中途是有資料再寫入了,這台 data node 就要 –initial

Q: index 與 data 是存在 memory,那存在 disk 怎麼作 ?

Q: 怎麼查資料用量 ?

Q: 當 ndbd 的 %MEM 100%時 ?

Q: ERROR 1114 (HY000): The table ‘wp_posts’ is full
A: 評估用量,然後用 http://www.severalnines.com/clusterconfigurator 計算

其它 table full 情況

http://blog.snsgou.com/post-132.html
    DataMemory=15000M
    IndexMemory=2560M

http://www.greensoftcode.net/techntxt/20135434119419995310
    1.config.ini
    [ndbd default]
    NoOfReplicas=2 
    MaxNoOfConcurrentOperations=10000
    DataMemory=320M
    IndexMemory=96M
    TimeBetweenWatchDogCheck=30000
    MaxNoOfOrderedIndexes=512

    2.my.cnf
    [mysqld]
    ndbcluster
    ndb-connectstring=124.95.137.12
    optimizer_switch=engine_condition_pushdown=off

http://www.aichengxu.com/view/51918
    場景一,數據空間或索引內存空間滿
    DataMemory= 80 M
    IndexMemory= 20 M
    場景二,索引數量限制
    MaxNoOfTables= 1024
    MaxNoOfOrderedIndexes= 10240
    MaxNoOfUniqueHashIndexes= 10240
    場景三,數據目錄所在的硬盤空間滿了

Q: 假如把全部 ndbd 全停用時,資料還在嗎 ?
A: 在,但不知道怎麼查看內容 (實際存在狀態)

QA: 要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台

QA: manage node 不要和 data node 同一台

QA: Management 可以跟 SQL node 放同一台

QA: Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止

 

以下參考 MySQL Cluster FAQ 截取一些說明

現在的 MySQL Cluster 7.3 版本,已是 MySQL 5.6 了

硬體規格
CPU: Intel/AMD x86, UltraSPARC
Memory: Minimum 1GB RAM
HDD: 3GB
Network: 1+ nodes (Gigabit Ethernet - TCP/IP)

誰適合
High volume OLTP
Real time analytics
Ecommerce and financial trading with fraud detection
Mobile and micro-payments
Session management & caching
Feed streaming, analysis and recommendations
Content management and delivery
Massively Multiplayer Online Games
Communications and presence services
Subscriber/user profile management and entitlements

Availability 99.999% (<5 min downtime/year)

Performance http://www.mysql.com/why-mysql/benchmarks/mysql-cluster/ 每秒可達 200 萬查詢量 (前提要有好的硬體設備) (http://ssorc.tw/5664)

數量配置
2 x data nodes
2 x SQL/NoSQL Application Nodes
2 x Management Nodes

MySQL Cluster 使用是要購買 License 的

MySQL Cluster 記憶體需求的計算公式:
(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

MySQL Cluster 叢集安裝環境介紹

* 官方建議叢集伺服器的節點(Node) 硬體配備最低需求:
CPU: Intel/AMD x86
Memory: 512MB RAM
HDD: 3GB
Network: 1+ nodes (Standard Ethernet - TCP/IP)
最佳硬體配備:
CPU: 2x Intel Xeon, Intel Itanium, AMD Opteron, Sun SPARC, IBM PowerPC
Memory: 16GB RAM
HDD: 4x 36GB SCSI (RAID 1 Controller)
Network: 1-8 Nodes (Gigabit Ethernet); 8+ Nodes (Dedicated Cluster Interconnect e.g. SCI)


要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台 

Management 可以跟 SQL node 放同一台

Management 不能跟 Data node 放同一台

Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止

Split-Brain 是叢集應用中常見的問題。簡單的說,當叢集中的兩個節點間斷線時,便會認為對方停止服務,因此認為自己是叢集中唯一的節點,於是開始嘗試取代對方的服務,這種狀況通常稱為 Split-brain。
最後修改日期: 2015 年 06 月 05 日

作者

留言

請問一下 是不是mysql cluster 如要load balance 要另外再用硬體或類似 HA Proxy 來達到是嗎?

此外,如中途有一台 SQL NODE 或DATA NODE 掛點,
是復恢服務後 有缺的資料( DB SCHEMA or Data )會就自動SYNC好嗎?

還有如要再多擴充一台 SQL NODE 或 DATA NODE 是否整套機制要先停機? 還是直接加入設定後 reload Manage node 的config就好?

[Reply]

cross Reply:

1. 你已有答案了不是嗎 !
2. 如果你測出來,可否跟我說答案呢 ?

[Reply]

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。