前言:
MySQL Cluster 是一個基於 NDB Cluster 存儲引擎的完整的分布式數據庫系統。不僅僅具有高可用性,而且可以自動切分數據,冗余數據等高級功能。和 Oracle Real Cluster Application 不太一樣的是,MySQL Cluster 是一個 Share Nothing 的架構,各個 MySQL Server 之間並不共享任何數據,高度可擴展以及高度可用方面的突出表現是其最大的特色。
雖然目前還只是 MySQL 家族中的一個新興產品,但是已經有不少企業正在積極的嘗試使用了。本章我們將通過對 MySQL Cluster 的了解來尋找其在可擴展設計方面的優勢。
16.1 MySQL Cluster介紹
簡單的說,MySQL Cluster實際上是在無共享存儲設備的情況下實現的一種完全分布式數據庫系統,其主要通過NDB Cluster(簡稱NDB)存儲引擎來實現。MySQL Cluster 剛剛誕生的時候可以說是一個可以對數據進行持久化的內存數據庫,所有數據和索引都必須裝載在內存中才能夠正常運行,但是最新的 MySQL Cluster 版本已經可以做到僅僅將所有索引裝載在內存中即可,實際的數據可以不用全部裝載到內存中。
一個MySQL Cluster的環境主要由以下三部分組成:
a) SQL層的SQL服務器節點(后面簡稱為SQL節點),也就是我們常說的MySQL Server。
主要負責實現一個數據庫在存儲層之上的所有事情,比如連接管理,Query 優化和響應, Cache 管理等等,只有存儲層的工作交給了 NDB 數據節點去處理了。也就是說,在純粹的MySQL Cluster環境中的SQL節點,可以被認為是一個不需要提供任何存儲引擎的 MySQL服務器,因為他的存儲引擎有Cluster環境中的 NDB 節點來擔任。所以,SQL層各MySQL 服務器的啟動與普通的 MySQL Server 啟動也有一定的區別,必須要添加ndbcluster參數選項才行。我們可以添加在my.cnf配置文件中,也可以通過啟動命令行來指定。
b) Storage 層的 NDB 數據節點,也就是上面說的 NDB Cluster。
最初的 NDB 是一個內存式存儲引擎,當然也會將數據持久化到存儲設備上。但是最新的 NDB Cluster 存儲引擎已經改進了這一點,可以選擇數據是全部加載到內存中還是僅僅加載索引數據。NDB 節點主要是實現底層數據存儲功能,來保存Cluster的數據。每一個Cluster節點保存完整數據的一個fragment,也就是一個數據分片(或者一份完整的數據,視節點數目和配置而定),所以只要配置得當,MySQL Cluster在存儲層不會出現單點的問題。一般來說,NDB 節點被組織成一個一個的NDB Group,一個NDB Group實際上就是一組存有完全相同的物理數據的NDB節點群。
上面提到了NDB各個節點對數據的組織,可能每個節點都存有全部的數據也可能只保存一部分數據,主要是受節點數目和參數來控制的。首先在MySQL Cluster主配置文件(在管理節點上面,一般為config.ini)中,有一個非常重要的參數叫NoOfReplicas,這個參數指定了每一份數據被冗余存儲在不同節點上面的份數,該參數一般至少應該被設置成2,也只需要設置成2就可以了。因為正常來說,兩個互為冗余的節點同時出現故障的概率還是非常小的,當然如果機器和內存足夠多的話,也可以繼續增大來更進一步減小出現故障的概率。
此外,一個節點上面是保存所有的數據還是一部分數據還受到存儲節點數目的限制。NDB存儲引擎首先保證NoOfReplicas參數配置的要求來使用存儲節點,對數據進行冗余,然后再根據節點數目將數據分段來繼續使用多余的NDB節點。分段的數目為節點總數除以NoOfReplicas所得。
c) 負責管理各個節點的Manage節點主機:
管理節點負責整個Cluster集群中各個節點的管理工作,包括集群的配置,啟動關閉各節點,對各個節點進行常規維護,以及實施數據的備份恢復等。管理節點會獲取整個Cluster環境中各節點的狀態和錯誤信息,並且將各Cluster集群中各個節點的信息反饋給整個集群中其他的所有節點。由於管理節點上保存了整個Cluster環境的配置,同時擔任了集群中各節點的基本溝通工作,所以他必須是最先被啟動的節點。
下面是一幅 MySQL Cluster 的基本架構圖(出自 MySQL 官方文檔手冊):
通過圖中我們可以更清晰的了解整個 MySQL Cluster 環境各個節點以及客戶端應用之間的關系。
由於 MySQL Cluster 目前的成熟使用並不是太多,實現也較普通的 MySQL 略復雜,所以本章將首先從如何搭建一個 MySQL Cluster 環境開始來介紹他。
16.2 MySQL Cluster環境搭建
搭建MySQL Cluster首先需要至少一個管理節點主機來實現管理功能,一個SQL節點主機來實現MySQL server功能和兩個ndb節點主機實現NDB Cluster的功能。在后面的介紹中,我采用雙SQL節點來搭建測試環境,具體信息如下:
1、硬件准備
a) MySQL節點1 192.168.0.1 b) MySQL節點2 192.168.0.2 c) ndb節點1 192.168.0.3 d) ndb節點2 192.168.0.4 e) 管理節點 192.168.0.5
2、軟件安裝
首先在上面5個節點的主機上盡量確保環境基本一致,然后從MySQL官方下載相應的軟件包並分發到兩台SQL節點和兩台NDB節點上,以備后面的安裝時候的使用。
我的測試環境OS(RedHat Linux)如下(非必須):
root@mysql1:/usr/local>uname -a Linux oratest1 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686 i686 i386 GNU/Linux
a) 安裝MySQL節點:
在MySQL節點上面需要安裝支持cluster的MySQL Server,可以通過自編譯源代碼安裝也可以選擇MySQL官方提供的編譯好的tar包或者rpm安裝包,我是通過源代碼自行編譯的,實際上完全可以通過MySQL官方提供的經過優化編譯的二進制tar包,只是我自己習慣了而已,我的編譯設置參數如下:
root@mysql1>./configure \ --prefix=/usr/local/MySQL \ --without-debug \ --without-bench \ --enable-thread-safe-client \ --enable-assembler \ --with-charset=utf8 \ --with-extra-charsets=complex \ --with-client-ldflags=-all-static \ --with-MySQLd-ldflags=-all-static \ --with-ndbcluster \ --with-server-suffix=-max \ --datadir=/data/mysqldata \ --with-unix-socket-path=/usr/local/MySQL/sock/mysql.sock ... root@mysql1>make ... root@mysql1>make install ...
然后是配置設置配置文件/etc/my.cnf,由於是測試環境,所以我僅僅設置了ndbcluster所需要的最基本的兩個配置項,其他所有的配置均用默認配置(后面會有較為詳細的配置說明),如下:
root@mysql1>vi /etc/my.cnf [client] socket = /usr/local/mysql/sock/mysql.sock #由於編譯時候特殊指定了,所以設置在這里,方便以后登入的時候使用 [MySQLd] socket = /usr/local/mysql/sock/mysql.sock ndbcluster [MySQL_cluster] ndb-connectstring = 192.168.0.5
繼續完成后面的MySQL安裝過程:
root@mysql1>cd /usr/local/mysql root@mysql1>bin/mysql_install_db --user=mysql -- socket=/usr/local/mysql/sock/mysql.sock Installing MySQL system tables... OK Filling help tables... OK To start MySQLd at boot time you have to copy support-files/MySQL.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/local/mysql/bin/MySQLadmin -u root password 'new-password' /usr/local/mysql/bin/MySQLadmin -u root -h ointest_stb password 'new- password' Alternatively you can run: /usr/local/mysql/bin/MySQL_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd /usr/local/MySQL ; /usr/local/mysql/bin/MySQLd_safe You can test the MySQL daemon with MySQL-test-run.pl cd MySQL-test ; perl MySQL-test-run.pl Please report any problems with the /usr/local/mysql/bin/MySQLbug script! The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com root@mysql1>chown -R root . root@mysql1>chgrp -R mysql . root@mysql1>chown -R mysql.mysql /usr/local/mysql/etc root@mysql1>chown -R mysql.mysql /usr/local/mysql/sock root@mysql1>chown -R mysql.mysql /usr/local/mysql/log root@mysql1>:/usr/local/mysql# ls -l total 40 drwxr-xr-x 2 root MySQL 4096 May 4 14:47 bin drwxr-xr-x 2 MySQL MySQL 4096 May 4 14:20 etc drwxr-xr-x 3 root MySQL 4096 May 4 14:46 include drwxr-xr-x 2 root MySQL 4096 May 4 14:46 info drwxr-xr-x 3 root MySQL 4096 May 4 14:46 lib drwxr-xr-x 2 root MySQL 4096 May 4 14:47 libexec drwxr-xr-x 2 MySQL MySQL 4096 May 4 14:20 log drwxr-xr-x 4 root MySQL 4096 May 4 14:47 man drwxr-xr-x 9 root MySQL 4096 May 4 14:47 MySQL-test drwxr-xr-x 2 MySQL MySQL 4096 May 5 22:16 sock root@mysql1>:/usr/local/mysql#
b) 安裝ndb節點:
如果希望盡可能的各環境保持一致,建議在NDB節點也和SQL節點一樣安裝整個帶有NDB Cluster存儲引擎的MySQL Server。由於安裝細節和上面的SQL節點完全一樣, 所以這里就不再累述。
另外,如果只是為了保證能夠完整的MySQL Cluster這個環境,則在NDB節點上完全可以僅安裝NDB存儲引擎(mysql ndb storage engine)即可。安裝NDB存儲引擎好像目前是找不到源碼來自行編譯安裝的,只能通過MySQL AB官方提供的rpm包來安裝。安裝過程非常簡單,和其他的rpm軟件包安裝沒有任何區別。
c) 管理節點:
管理節點所需要的安裝更簡單,實際上只需要ndb_mgm和ndb_mgmd兩個程序即可,這兩個可執行程序可以在上面的MySQL節點的MySQL安裝目錄中的bin目錄下面找到。將這兩個程序copy到管理節點上面合適的位置(自行考慮,我一般會放在/usr/local/mysql/bin下面),並在path制定的目錄中建立兩個同名的soft link在到這兩個程序上面,就可以了。
以上即是MySQL Cluster環境的軟件安裝過程,看上去並不復雜是吧,希望大家的安裝過程也能夠一切順利,當然如果遇到了什錯誤也不用擔心,MySQL官方手冊中也提供了非常詳細的安裝過程說明。
3、基本配置
在上面所有節點的軟件安裝完成之后,就是MySQL Cluster環境的配置工作了。如果不考慮其他一些優化和個性化的配置需求,MySQL Cluster的基本配置是比較簡單的。這里暫時先僅僅完成一個簡單的測試環境的配置,詳細的配置說明請看后面的MySQL Cluster配置介紹的章節。
對於MySQL節點和ndb節點在上面的安裝過程中已經完成了,僅需要設置[MySQL_cluster]參數組的ndb-connectstring參數即可完成最基本的配置。
管理節點的配置稍微復雜一點,因為他需要配置出Cluster環境中每一個節點的基本信息。配置文件並不需要一個特別固定的位置和名稱,都由用戶自行設定,只需要在啟動過程中指定配置文件即可。在我們的測試環境中配置為建名稱為/var/lib/MySQL-cluster/config.ini,內容如下:
[root@mysqlMgm ~]# cat /var/lib/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=2 DataMemory=64M IndexMemory=16M [TCP DEFAULT] portnumber=2202 #管理節點 [NDB_MGMD] id=1 hostname=192.168.0.5 datadir=/var/lib/mysql-cluster #第一個ndbd節點: [NDBD] id=2 hostname=192.168.0.3 datadir=/data/mysqldata #第二個ndbd節點: [NDBD] id=3 hostname=192.168.0.4 datadir=/drbddata/mysqldata # SQL node options: [MySQLD] id=4 hostname=192.168.0.1 [MySQLD] id=5 hostname=10.0.65.203 [root@mysqlMgm ~]#
1) SQL節點的配置:
MySQL節點的配置和普通的MySQL Server的配置區別主要是需要在my.cnf文件中增加[mysql_cluster]這個配置選項組,並至少指定ndb-connectstring=192.168.0.5,也就是制定管理節點的ip地址或者hostname。另外,如果希望能在啟動MySQLd的時候不用手動指定ndbcluster參數,則在[mysqld]參數選項組中增加ndbcluster項參數。除了這兩項之外,其他的所有參數都可以可以使用默認值。
2) NDB存儲節點的配置:
NDB存儲節點的配置就更簡單的了,僅僅需[mysql_cluster]中的ndb-connectstring = 192.168.0.5 參數,其他所有的都可以不再配置了。
4、環境測試
在MySQL Cluster環境搭建完成后,首先肯定要對新搭建的環境進行一些基本的功能和異常測試,以確認搭建的環境是否已經可以正常提供服務。
1) 首先檢測ndb引擎是否已經正常工作
通過任意客戶端連接任意選定的一個SQL節點,測試各種基本的ddl,dml操作, 然后再通過客戶端連接上Cluster環境中另外的SQL節點校驗所作的草食是否在其他節點同樣可見了。下面是測試create table 后再插入一條數據的示例:
在節點4上面:
mysql>use test; mysql>create table t1 ( a int) engine=ndb; Query ok, 0 rows affected (0.00 sec) mysql>insert into t1 values(100); Query ok, 1 rows affected (0.00 sec) 然后在節點5上面: mysql>use test; mysql>select * from t1; +-----+ | id | +-----+ | 100 | +-----+ 1 row in set (0.00 sec)
可見,在節點4上面所插入的數據,已經在節點5上面了,說明ndb引擎工作正常的。其他的測試與此類似,大家可以自行測試。
如果在測試中發現在某兩個節點之間出現不一致現象,那么可以肯定的是,Cluster 環境的配置有問題。在管理節點上面通過“ndb_mgm -e SHOW”命令查看各節點狀態是否正常,是否都已經連接到了管理節點上面。並檢查不正常節點的my.cnf配置文件,是否已經配置好了以ndbcluster方式啟動MySQLd,是否有正確配置[mysql_cluster]這個參數組的最基本的ndb-connectstring參數。然后檢查管理節點上面的config文件,里面是否有正確配置好各所有節點的配置,尤其是不正常的SQL節點的配置。
2) 檢測冗余環境的單點故障問題
a、模擬NDB節點Crash
由於是模擬Crash,所以我們通過在節點2上面kill掉ndb進程,然后再分別通過兩個SQL節點去訪問t1表,查看是否可以正常訪問,數據是否一樣。
在節點4上面:
mysql> use test; mysql> select * from t1; +-----+ | id | +-----+ | 100 | +-----+ 1 row in set (0.00 sec) mysql> insert into t1 values(200); Query ok, 1 rows affected (0.00 sec)
在節點5上面:
mysql>use test; mysql>select * from t1; +-----+ | id | +-----+ | 100 | | 200 | +-----+ 2 row in set (0.00 sec) mysql> delete from t1 where id = 100; Query ok, 1 rows affected (0.00 sec)
再回到節點4上面:
mysql> select * from t1; +-----+ | id | +-----+ | 200 | +-----+ 1 row in set (0.00 sec)
可以看到,不僅t1仍然可以正常訪問,數據也沒有任何丟失,且仍然可以正常插入,刪除數據。可見,在有一個NDB節點Crash之后,真個MySQL Cluster環境仍然可以正常提供服務。當然,如果兩個NDB節點都Crash之后,MySQL Cluster環境就無法正常提供服務了,大家也可以自行測試一下。
b、模擬SQL節點Crash
同樣和測試NDB節點Crash一樣,kill掉一個SQL節點(比如節點4)的mysqld 進程,然后通過節點5進行訪問:
在節點5上面:
mysql> use test; mysql> select * from t1; +-----+ | id | +-----+ | 200 | +-----+ 1 row in set (0.00 sec) mysql> insert into t1 values(300); Query ok, 1 rows affected (0.00 sec) mysql> select * from t1; +-----+ | id | +-----+ | 200 | | 300 | +-----+ 2 row in set (0.00 sec)
可以看到,當節點4 Crash之后,節點5仍然能夠提供正常的服務。當然,如果在應用環境中,應用環境需要至少支持當一個SQL節點出現問題的時候能夠自行切換到剩下的正常的SQL節點來訪問。
c、管理節點的單點
一般情況來說,管理節點是最容易控制的,實施也非常簡單,只需要將配置文件和
兩個可執行程序(ndb_mgmd和ndb_mgm)存放在多台機器上面即可,所以一般來說不需要太多考慮單點故障。
16.3 MySQL Cluster配置詳細介紹(config.ini)
在MySQL Cluster環境的配置文件config.ini里面,每一類節點都有兩個(或以上)的相應配置項組,每一類節點的配置項都主要由兩部分組成,一部分是同類所有節點相同的配置項組,在[NDB_MGM DEFAULT]、[NDBD DEFAULT]和[MySQLD DEFAULT]這三個配置組里面, 而且每一個配置組只出現一次;而另外一部分則是針對每一個節點獨有配置內容的配置項組[NDB_MGM]、[NDBD]和[MySQLD],由於這三類配置組中配置的每一個節點獨有的個性化配置,所以每一個配置組都可能會出現多次(每一個節點一次)。下面是每一類節點的各種配置說明:
1、管理節點相關配置
在整個MySQL Cluster環境中,管理節點相關的配置為[NDBD_MGM DEFAULT]和[NDB_MGMD]相關的兩組:
1) [NDB_MGMD DEFAULT]中各管理節點的共用配置項:
PortNumber:配置管理節點的服務端程序(ndb_mgmd)監聽客戶端(ndb_mgm)連接請求和發送的指令,從文檔上可以查找到,默認端口是1186端口。一般來說這一項不需要更改,當然如果是為了在同一台主機上面啟動多個管理節點的話,肯定需要將兩個管理節點啟動不同的監聽端口;
LogDestination:配置管理節點上面的cluster日志處理方式。
a) 可以寫入文件如:LogDestination=FILE:filename=my-
cluster.log,maxsize=500000,maxfiles=4;
b) 也可以通過標准輸出來打印出來如:LogDestination=CONSOLE;
c) 還可以計入syslog里面如:LogDestination=SYSLOG:facility=syslog;
d) 甚至多種方式共存:
LogDestination=CONSOLE;SYSLOG:facility=syslog;FILE:filename=/var/log/cluster- log
Datadir:設置用於管理節點存放文件輸出的位置。如process文件(.pid),cluster log文件(當LogDestination有FILE處理方式存在時候)。
ArbitrationRank:配置各節點在處理某些事件出現分歧的時候的級別。有0,1,2 三個值可以選擇。
a) 0代表本節點完全聽其他節點的,不參與決策
b) 1代表本節點有最高優先權,“一切由我來決策”
c) 2代表本節點參與決策,但是優先權較1低,但是比0高
ArbitrationRank參數不僅僅管理節點有,MySQL節點也有。而且一般來說,所有的管理節點一般都應該設置成1,所有SQL節點都設置成2。
2) [NDB_MGMD]是每個管理節點配置一組,所需配置項如下(下面的參數只能設置在[NDB_MGMD]參數組中):
Id:為節點指定一個唯一的ID號,要求在整個Cluster環境中唯一;
Hostname:配置該節點的IP地址或者主機名,如果是主機名,則該主機名必須要在配置文件所在的節點的/etc/hosts文件中存在,而且綁定的IP是准確的。
上面[NDB_MGMD DEFAULT]里面的所有參數項,都可以設置在下面的[NDB_MGMD]參數組里面,但是Id和Hostname兩個參數只能設置在[NDB_MGMD]里面,而不能設置在[NDB_MGMD DEFAULT]里面,因為這兩個參數項針對每一個節點都是不相同的內容。
2、NDB節點相關配置
NDB節點和管理節點一樣,既有各個節點共用的配置信息組[NDBD DEFAULT],也有每一個節點個性化配置的[NDBD]配置組(實際上SQL節點也是如此)。
1) [NDBD DEFAULT]中的配置項:
NoOfReplicas:定義在Cluster環境中相同數據的分數,通俗一點來說就是每一份數據存放NoOfReplicas份。如果希望能夠冗余,那么至少設置為2(一般情況來說此參數值設置為2就夠了),最大只能設置為4。另外,NoOfReplicas值得大小,實際上也就是node group大小的定義。NoOfReplicas參數沒有系統默認值,所以必須設定,而且只能設置在[NDBD DEFAULT]中,因為此數值在整個Cluster集群中一個node group中所有的NDBD節點都需要一樣。另外NoOfReplicas的數目對整個Cluster環境中NDB節點數量有較大的影響, 因為NDB節點總數量是NoOfReplicas * 2 * node_group_num;
DataDir:指定本地的pid文件,trace文件,日志文件以及錯誤日志子等存放的路徑,無系統默認地址,所以必須設定;
DataMemory:設定用於存放數據和主鍵索引的內存段的大小。這個大小限制了能存放的數據的大小,因為ndb存儲引擎需屬於內存數據庫引擎,需要將所有的數據(包括索引)都load到內存中。這個參數並不是一定需要設定的,但是默認值非常小(80M),只也就是說如果使用默認值,將只能存放很小的數據。參數設置需要帶上單位,如512M,2G等。另外,DataMemory里面還會存放UNDO相關的信息,所以,事務的大小和事務並發量也決定了DataMemory的使用量,建議盡量使用小事務;
IndexMemory:設定用於存放索引(非主鍵)數據的內存段大小。和DataMemory類似,這個參數值的大小同樣也會限制該節點能存放的數據的大小,因為索引的大小是隨着數據量增長而增長的。參數設置也如DataMemory一樣需要單位。IndexMemory默認大小為18M;
實際上,一個NDB節點能存放的數據量是會受到DataMemory和IndexMemory兩個參數設置的約束,兩者任何一個達到限制數量后,都無法再增加能存儲的數據量。如果繼續存入數據系統會報錯“table is full”。
FileSystemPath:指定redo日志,undo日志,數據文件以及meta數據等的存放位置,默認位置為DataDir的設置,並且在ndbd初始化的時候,參數所設定的文件夾必須存在。在第一次啟動的時候,ndbd進程會在所設定的文件夾下建立一個子文件夾叫ndb_id_fs,這里的id為節點的ID值,如節點id為3則文件夾名稱為ndb_3_fs。當然,這個參數也不一定非得設置在[NDBD DEFAULT]參數組里面讓所有節點的設置都一樣(不過建議這樣設置),還可以設置在[NDBD]參數組下為每一個節點單獨設置自己的FileSystemPath值;
BackupDataDir:設置備份目錄路徑,默認為FileSystemPath/BACKUP。
接下來的幾個參數也是非常重要的,主要都是與並行事務數和其他一些並行限制有關的參數設置。
MaxNoOfConcurrentTransactions:設置在一個節點上面的最大並行事務數目,默認為4096,一般情況下來說是足夠了的。這個參數值所有節點必須設置一樣,所以一般都是設置在[NDBD DEFAULT]參數組下面;
MaxNoOfConcurrentOperations:設置同時能夠被更新(或者鎖定)的記錄數量。
一般來說可以設置為在整個集群中相同時間內可能被更新(或者鎖定)的總記錄數,除以NDB節點數,所得到的值。比如,在集群中有兩個NDB節點,而希望能夠處理同時更新(或鎖定)100000條記錄,那么此參數應該被設置為:100000 / 4 = 25000。此外,這里的記錄數量並不是指單純的表里面的記錄數,而是指事物里面的操作記錄。當使用到唯一索引的時候,表的數據和索引兩者都要算在里面,也就是說,如果是通過一個唯一索引來作為過濾條件更新某一條記錄,那么這里算是兩條操作記錄。而且即使是鎖定也會產生操作記錄,比如通過唯一索引來查找一條記錄,就會產生如下兩條操作記錄:通過讀取唯一索引中的某個記錄數據會產生鎖定,產生一條操作記錄,然后讀取基表里面的數據,這里也會產生讀鎖,也會產生一條操作記錄。MaxNoOfConcurrentOperations參數的默認值為32768。當我們額度系統運行過程中,如果出現此參數不夠的時候,就會報出“Out of operation records in transaction coordinator”這樣的錯誤信息;MaxNoOfLocalOperations:此參數默認是MaxNoOfConcurrentOperations * 1.1 的大小,也就是說,每個節點一般可以處理超過平均值的10%的操作記錄數量。但是一般來說,MySQL建議單獨設置此參數而不要使用默認值,並且將此參數設置得更較大一些;
以下的三個參數主要是在一個事務中執行一條query的時候臨時用到存儲(或者內存)的情況下所使用到的,所使用的存儲信息會在事務結束(commit或者rollback)的時候釋放資源;
MaxNoOfConcurrentIndexOperations:這個參數和MaxNoOfConcurrentOperations參數比較類似,只不過所針對的是Index的record而已。其默認值為8192,對伊一般的系統來說都已經足夠了,只有在事務並發非常非常大的系統上才有需要增加這個參數的設置。
當然,此參數越大,系統運行時候為此而消耗的內存也會越大;
MaxNoOfFiredTriggers:觸發唯一索引(hash index)操作的最大的操作數,這個操作數是影響索引的操作條目數,而不是操作的次數。系統默認值為4000,一般系統來說夠用了。當然,如果系統並發事務非常高,而且涉及到索引的操作也非常多,自然也就需要提高這個參數值的設置了;
TransactionBufferMemory:這個buffer值得設置主要是指定用於跟蹤索引操作而使用的。主要是用來存儲索引操作中涉及到的索引key值和column的實際信息。這個參數的值一般來說也很少需要調整,因為實際系統中需要的這部分buffer量非常小,雖然默認值只是1M,但是對於一般應用也已經足夠了;
下面要介紹到的參數主要是在系統處理中做table scan或者range scan的時候使用的一些buffer的相關設置,設置的恰當可以既節省內存又達到足夠的性能要求。
MaxNoOfConcurrentScans:這個參數主要控制在Cluster環境中並發的table scan和range scan的總數量平均分配到每一個節點后的平均值。一般來說,每一個scan都是通過並行的掃描所有的partition來完成的,每一個partition的掃描都會在該partition 所在的節點上面使用一個scan record。所以,這個參數值得大小應該是“scan record” 數目 * 節點數目。參數默認大小為256,最大只能設置為500;
MaxNoOfLocalScans:和上面的這個參數相對應,只不過設置的是在本節點上面的並發table scan和range scan數量。如果在系統中有大量的並發而且一般都不使用並行的話,需要注意此參數的設置。默認為MaxNoOfConcurrentScans * node數目;
BatchSizePerLocalScan:該參用於計算在Localscan(並發)過程中被鎖住的記錄數,文檔上說明默認為64;
LongMessageBuffer:這個參數定義的是消息傳遞時候的buffer大小,而這里的消息傳遞主要是內部信息傳遞以及節點與節點之間的信息傳遞。這個參數一般很少需要調整,默認大小為1MB大小;
下面介紹一下與log相關的參數配置說明,包括log level。這里的log level有多種,從0到15,也就是共16種。如果設定為0,則表示不記錄任何log。如果設置為最高level,也就是15,則表示所有的信息都會通過標准輸出來記錄log。由於這里的所有信息實際上都會傳遞到管理節點的cluster log中,所以,一般來說,除了啟動時候的log級別需要設置為1之外,其他所有的log level都只需要設置為0就可以了。
NoOfFragmentLogFiles:這個參數實際上和Oracle的redo log的group一樣的。
其實就是ndb的redo log group數目,這些redo log用於存放ndb引擎所做的所有需要變更數據的事情,以及各種checkpoint信息等。默認值為8;
MaxNoOfSavedMessages:這個參數設定了可以保留的trace文件(在節點crash的時候參數)的最大個數,文檔上面說此參數默認值為25。
LogLevelStartup:設定啟動ndb節點時候需要記錄的信息的級別(不同級別所記錄的信息的詳細程度不一樣),默認級別為1;
LogLevelShutdown:設定關閉ndb節點時候記錄日志的信息的級別,默認為0;
LogLevelStatistic:這個參數是針對於統計相關的日志的,就像更新數量,插入數量,buffer使用情況,主鍵數量等等統計信息。默認日志級別為0;
LogLevelCheckpoint:checkpoint日志記錄級別(包括local和global的),默認為0;
LogLevelNodeRestart:ndb節點重啟過程日志級別,默認為0;
LogLevelConnection:各節點之間連接相關日志記錄的級別,默認0;
LogLevelError:在整個Cluster中錯誤或者警告信息的日志記錄級別,默認0;
LogLevelInfo:普通信息的日志記錄級別,默認為0。
這里再介紹幾個用來作為log記錄時候需要用到的Buffer相關參數,這些參數對於性能都有一定的影響。當然,如果節點運行在無盤模式下的話,則影響不大。
UndoIndexBuffer:undo index buffer主要是用於存儲主鍵hash索引在變更之后產生的undo信息的緩沖區。默認值為2M大小,最小可以設置為1M,對於大多數應用來說, 2M的默認值是夠的。當然,在更新非常頻繁的應用里面,適當的調大此參數值對性能還是有一定幫助的。如果此參數太小,會報出677錯誤:Index UNDO buffers overloaded;
UndoDataBuffer:和undo index buffer類似,undo data buffer主要是在數據發生變更的時候所需要的undo信息的緩沖區。默認大小為16M,最小同樣為1M。當這個參數值太小的時候,系統會報出如下的錯誤:Data UNDO buffers overloaded,錯誤號為891;
RedoBuffer:Redo buffer是用redo log信息的緩沖區,默認大小為8M,最小為1M。
如果此buffer太小,會報1221錯誤:REDO log buffers overloaded。
此外,NDB節點還有一些和metadata以及內部控制相關的參數,但大部分參數都基本上不需要任何調整,所以就不做進一步介紹。如果有興趣希望詳細了解,可以根據MySQL 官方的相關參考手冊,手冊上面都有較為詳細的介紹。
3、SQL節點相關配置說明
1) 和其他節點一樣,先介紹一些適用於所有節點的[MySQLD DEFAULT]參數ArbitrationRank:這個參數在介紹管理節點的參數時候已經介紹過了,用於設定節點級別(主要是在多個節點在處理相關操作時候出現分歧時候設定裁定者)的。一般來說,所有的SQL節點都應該設定為2;
ArbitrationDelay:默認為0,裁定者在開始裁定之前需要被delay多久,單位為毫秒。一般不需要更改默認值。
BatchByteSize:在做全表掃描或者索引范圍掃描的時候,每一次fatch的數據量,默認為32KB;
BatchSize:類似BatchByteSize參數,只不過BatchSize所設定的是每一次fetch的record數量,而不是物理總量,默認為64,最大為992(暫時還不知道這個值是基於什么理論而設定的)。在實際運行query的過程中,fetch的量受到BatchByteSize和BatchSize兩個參數的共同制約,二者取最小值;
MaxScanBatchSize:在Cluster環境中,進行並行處理的情況下,所有節點的BatchSize總和的最大值。默認值為256KB,最大值為16MB。
2) 每個節點獨有的[MySQLD]參數組,僅有id和hostname參數需要配置,在之前各類節點均有介紹了,這里就不再累述。
16.4 MySQL Cluster基本管理與維護
MySQL Cluster的管理和普通的MySQL Server管理區別較大,基本上大部分管理工作都是在管理節點上面完成,僅有少數管理內容需要在其他節點實施。
1、各節點啟動與關閉
要想Cluster環境能夠正常工作,只好要啟動一個NDB節點和一個SQL節點,另外為了完成管理,也至少要啟動一個管理節點。各類節點的啟動順序也有要求,首先是管理節點,然后是NDB節點,最后才是SQL節點。
1) 按順序啟動各節點:
a、 啟動管理節點:
[root@localhost MySQL-cluster]# ndb_mgmd -f /var/lib/MySQL- cluster/config.ini
這里執行的ndb_mgmd命令實際上就是MySQL Cluster管理服務器,可以通過-f config_file_name或者--config=config_filename來指定MySQL Cluster集群的參數文件。
如果想了解更多關於ndb_mgmd的參數信息,可以通過運行ndb_mgmd --help來獲取更詳細的信息。
b、 啟動用於存儲數據的ndb節點要啟動存儲節點,必須在每一台ndb節點主機上面都執行ndbd程序,如果是第一
次啟動,則需要添加--initial參數,以便進行ndb節點的初始化工作。但是,在以后的啟動過程中,是不能添加該參數的,否則ndbd程序會清除在之前建立的所有用於恢復的數據文件和日志文件。啟動命令如下
root@ndb1:/root>ndbd --initial
c、 啟動SQL節點
SQL節點的啟動和普通MySQL Server的啟動沒有太多明顯的差別,不過有一個前提就是需要在MySQL Server的配置文件my.cnf設置好[MySQL_cluster]配置組中的ndb-connectstring參數和[MySQLd]配置組中的ndbcluster參數。
root@mysql1:/root>MySQLd_safe --user=MySQL
2) 節點狀態檢查:
在各節點都啟動完成后,回到管理節點,可以通過ndb_mgm來查看各節點狀態:
[root@localhost MySQL-cluster]# ndb_mgm -e SHOW Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.3 (Version: 5.0.51, Nodegroup: 0, Master) id=3 @192.168.0.4 (Version: 5.0.51, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.5 (Version: 5.0.51) [MySQLd(API)] 2 node(s) id=4 @192.168.0.1 (Version: 5.0.51) id=5 @10.0.65.203 (Version: 5.0.51)
這里顯示出整個集群有5個幾點,其中各節點信息如下:
a) 2個NDBD節點:
[ndbd(NDB)] 2 node(s) id=2 @192.168.0.3 (Version: 5.0.51, Nodegroup: 0, Master) id=3 @192.168.0.4 (Version: 5.0.51, Nodegroup: 0) b) 兩個SQL節點: [MySQLd(API)] 2 node(s) id=4 @192.168.0.1 (Version: 5.0.51) id=5 @10.0.65.203 (Version: 5.0.51) c) 1個管理節點: [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.5 (Version: 5.0.51)
3) 節點的關閉操作:
在MySQL Cluster環境中,NDB節點和管理節點的關閉都可以在管理節點的管理程序中完成,但是SQL節點卻沒辦法。所以,在關閉整個MySQL Cluster環境或者關閉某個SQL節點的時候,首先必須到SQL節點主機上來關閉SQL節點程序。關閉方法和MySQL Server的關閉一樣,就不累述。而NDB節點和管理節點則都可以在管理節點通過管理程序來完成:
ndb_mgm> shutdown Connected to Management Server at: localhost:1186 Node 3: Cluster shutdown initiated Node 2: Cluster shutdown initiated Node 2: Node shutdown completed. Node 3: Node shutdown completed. 2 NDB Cluster node(s) have shutdown. Disconnecting to allow management server to shutdown.
2、基本管理維護
前面運行的命令ndb_mgm如果不帶任何參數,實際上是進入MySQL Cluster的命令行管理界面。在命令行管理界面里面可以做大量的維護工作,如下:
[root@localhost MySQL-cluster]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm>
然后同樣執行show命令:
ndb_mgm>show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.0.3) id=3 @192.168.0.4 (Version: 5.0.51, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.5 (Version: 5.0.51) [MySQLd(API)] 2 node(s) id=4 @192.168.0.1 (Version: 5.0.51) id=5 @10.0.65.203 (Version: 5.0.51)
我們可以看到結果和上面的完全一樣。可以通過在ndb控制界面下執行help命令查看可以查看很多基本的維護管理命令:
ndb_mgm> help --------------------------------------------------------------------------- NDB Cluster -- Management Client -- Help --------------------------------------------------------------------------- HELP Print help text HELP COMMAND Print detailed help for COMMAND(e.g. SHOW) SHOW Print information about cluster START BACKUP [NOWAIT | WAIT STARTED | WAIT COMPLETED] Start backup (default WAIT COMPLETED) ABORT BACKUP <backup id> Abort backup SHUTDOWN Shutdown all processes in cluster CLUSTERLOG ON [<severity>] ... Enable Cluster logging CLUSTERLOG OFF [<severity>] ... Disable Cluster logging CLUSTERLOG TOGGLE [<severity>] ... Toggle severity filter on/off CLUSTERLOG INFO Print cluster log information <id> START Start data node (started with -n) <id> RESTART [-n] [-i] Restart data or management server node <id> STOP Stop data or management server node ENTER SINGLE USER MODE <id> Enter single user mode EXIT SINGLE USER MODE Exit single user mode <id> STATUS Print status <id> CLUSTERLOG {<category>=<level>}+ Set log level for cluster log PURGE STALE SESSIONS Reset reserved nodeid's in the mgmt server CONNECT [<connectstring>] Connect to management server (reconnect if already connected) QUIT Quit management client <severity> = ALERT | CRITICAL | ERROR | WARNING | INFO | DEBUG <category> = STARTUP | SHUTDOWN | STATISTICS | CHECKPOINT | NODERESTART | CONNECTION | INFO | ERROR | CONGESTION | DEBUG | BACKUP <level> = 0 - 15 <id> = ALL | Any database node id For detailed help on COMMAND, use HELP COMMAND.
也可以通過執行help后面跟命令名稱而獲取各種命令的操作說明幫助信息:
ndb_mgm> help start --------------------------------------------------------------------------- NDB Cluster -- Management Client -- Help for START command --------------------------------------------------------------------------- START Start data node (started with -n) <id> START Start the data node identified by <id>. Only starts data nodes that have not yet joined the cluster. These are nodes launched or restarted with the -n(--nostart) option. It does not launch the ndbd process on a remote machine. ndb_mgm> help shutdown --------------------------------------------------------------------------- NDB Cluster -- Management Client -- Help for SHUTDOWN command --------------------------------------------------------------------------- SHUTDOWN Shutdown the cluster SHUTDOWN Shutdown the data nodes and management nodes. MySQL Servers and NDBAPI nodes are currently not shut down by issuing this command. ndb_mgm> help PURGE STALE SESSIONS --------------------------------------------------------------------------- NDB Cluster -- Management Client -- Help for PURGE STALE SESSIONS command --------------------------------------------------------------------------- PURGE STALE SESSIONS Reset reserved nodeid's in the mgmt server PURGE STALE SESSIONS Running this statement forces all reserved node IDs to be checked; any that are not being used by nodes acutally connected to the cluster are then freed. This command is not normally needed, but may be required in some situations where failed nodes cannot rejoin the cluster due to failing to allocate a node id.
通過上面的幾個幫助命令所獲取的信息得知,我們可以通過在管理節點上面通過執行restart,stop,shutdown等基本的命令來重啟某個節點,關閉某個節點,還可以同時一次性關閉所有節點。
此外,還可以通過執行備份相關的命令在管理節點對整個Cluster環境進行備份,以及通過日志相關命令實施對日志的相關管理。
16.5 基本優化思路
MySQL Cluster 雖然是一個分布式的數據庫系統,但是在大部分地方的優化思路和方法還是和普通的 MySQL Server 一樣。和常規 MySQL Server 在優化方面的區別主要提現在各節點之間的協作配置以及網絡環境相關的優化。
由於 MySQL Cluster 是一個分布式的環境,而且所有訪問都是需要經過超過一個節點(至少有一個 SQL 節點和一個 NDB 節點)才能完成,所以各個節點之間的協作配合就顯得尤為重要。
首先,由於各個節點之間存在大量的數據通訊,所以節點之間的內部互聯網絡帶寬一定要保證足夠使用。為了適應不同的網絡環境和性能需求,MySQL Cluster 支持了多種內部網絡互聯的協議和方式。最為常用的自然是通過 TCP/IP 來進行互聯。此外還可以有 SCI Socket 方式來進行互聯,還支持 Myrinet,Infiniband,VIA 接口等等。
其次,SQL 節點和 NDB 節點的主機性能配比應該合適,而不應該出現某一類節點過早出現瓶頸的時候,另外一類節點卻還處於非常空閑的狀態。如果在我們遇到的環境中出現這樣的情況,那么我們就該重新評估兩類節點的硬件設備配比了。否則,有一類節點的硬件資源就相當處於浪費狀態了。
最后,就是 SQL 節點 和 NDB 節點兩者軟件配置方面的優化了。對於 SQL 節點的配置,和普通的 MySQL 區別不是太大。各類參數的配置原則也和普通 MySQL 基本相同。NDB Cluster 存儲引擎的主要配置參數在前面的配置介紹中也基本都進行了性能相關的說明,這里就不再累述了。
16.6 小結
MySQL Cluster 的核心在於 NDB Cluster 存儲引擎,他不僅對數據進行了水平切分,還對數據進行了跨節點冗余。既解決了數據庫的擴展問題,同時也在很大程度上提高了數據庫整體可用性。
雖然目前 MySQL Cluster 的應用還不如普通的 MySQL Server 應用那么廣泛,但是我想隨着他的不斷成熟和改善,將會被越來越廣泛的使用。這種 Share Nothing 的 Cluster架構也很可能會成為未來的趨勢,就讓我們共同期待越來越成熟穩定高效的 MySQL Cluster吧。