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
* 官方建議叢集伺服器的節點(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。
留言
請問一下 是不是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. 如果你測出來,可否跟我說答案呢 ?