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。
Related posts 相關文章
使用連線控制插件提高 MySQL 安全性
More...
使用驗證插件提高 MySQL 密碼安全性
More...
用 pv 查看 mysql restore 還原資料進度
More...
使用 sysbench 壓力測試 mysql
More...

作者

留言

請問一下 是不是mysql cluster 如要load balance 要另外再用硬體或類似 HA Proxy 來達到是嗎? 此外,如中途有一台 SQL NODE 或DATA NODE 掛點, 是復恢服務後 有缺的資料( DB SCHEMA or Data )會就自動SYNC好嗎? 還有如要再多擴充一台 SQL NODE 或 DATA NODE 是否整套機制要先停機? 還是直接加入設定後 reload Manage node 的config就好?

    作者

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

撰寫回覆或留言

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