2015年2月25日 星期三

決定MySQL Cluster 的效能的因素 - 在韓國的PoC的經驗談

過年前一星期去了趟韓國協助那裡的同事為當地的大客戶做MySQL Cluster PoC,它的情境是一自個現有跑在另一個資料庫的應用系統移植過來,測試的環境架了一個有4個data node, 3個SQL node的MySQL Cluster。原有的應用系統有許多複雜的SQL命令(有derive table,join的base table和derrived 達62個),也有的table有text格式的欄位,這兩點是我比較擔心的。果然執行這些SQL命令所需要的時間由0.x秒增加到5~6秒,而導入3萬多行到一個有text欄位的table需要2~3個小時。為此檢查這些SQL命令,發現其中有些重複的join,甚至還有些會産生cartesian product。經過以下的調優使PoC獲得還不錯的結果:
  1. 調整SQL命令,排除cartesian product
  2. 將text欄位改成varchar格式,因為NDB會為有text欄位的table開一個隱藏的table放text欄位的資料,而使table的DML産生更多的鎖
  3. 使用多個SQL節點,同時每個SQL節點開多個到data node的連線(在my.cnf設ndb-cluster-connection-pool=6,在config.ini開多個[mysqld] slot)
  4. 在SQL node使用thread pool plugin (在my.cnf設plugin-load=thread_pool.so)
  5. 在config.ini以ThreadConfig參數指定各種NDB thread所使用的CPU therad,以減少CPU的content switch
  6. 將一些不會online更改,較小的table由NDB改為InnoDB以解決太多NDB表的Join所造成的問題(最複雜的SQL由約30個NDB的table改為15個NDB table和十多個InnoDB table)
經過這些調整,我們得到不錯的結果,例如當SQL節點數增加時,整個呑吐量近乎等比的增加,這個結果使得客戶和合作夥伴很高興,對MySQL Cluster所帶來的效能和高可用性更有信心。