目錄
MySQL叢集是MySQL適合於分佈式計算環境的高實用、高冗余版本。它採用了NDB叢集儲存引擎,允許在1個叢集中運行多個MySQL伺服器。在MySQL 5.1二進製版本中、以及與最新的Linux版本兼容的RPM中提供了該儲存引擎。(注意,要想獲得MySQL叢集的功能,必須安裝mysql-server和mysql-max RPM)。
目前能夠運行MySQL叢集的作業系統有Linux、Mac OS X和Solaris。(一些用戶通報成功地在FreeBSD上運行了MySQL叢集,但MySQL AB公司尚未正式支援該特性)。我們正在努力,以便使MySQL叢集能運行在MySQL支援的所有作業系統上,包括Windows,而且當支援新的平台時,將更新該頁面。
本章介紹了正在進行的工作,其內容將隨著MySQL叢集的不斷演化而變化。關於MySQL叢集的更多訊息,請訪問MySQL AB公司的網站http://www.mysql.com/products/cluster/。
或許您也希望使用MySQL AB提供的兩種額外資源:
· MySQL叢集郵件列資料表。
· MySQL用戶論壇上的叢集主題區。
關於叢集的一些常見問題,請參見17.10節,「MySQL叢集常見問題解答」。如果您是MySQL叢集的新手,請閱讀我方開發人員區的文章如何為兩個伺服器設置MySQL叢集,這會有所幫助。
MySQL叢集是一種技術,該技術允許在無共享的系統中部署「內存中」資料庫的叢集。通過無共享體系結構,系統能夠使用廉價的硬件,而且對軟硬件無特殊要求。此外,由於每個組件有自己的內存和磁盤,不存在單點故障。
MySQL叢集將標準的MySQL伺服器與名為NDB的「內存中」叢集式儲存引擎集成了起來。在我們的文檔中,術語NDB指的是與儲存引擎相關的設置部分,而術語「MySQL叢集」指的是MySQL和NDB儲存引擎的組合。
MySQL叢集由一組計算機構成,每台計算機上均運行著多種程序,包括MySQL伺服器,NDB叢集的數據節點,管理伺服器,以及(可能)專門的數據訪問程式。關於叢集中這些組件的關係,請參見下圖:

所有這些程式一起構成了MySQL叢集。將數據保存到NDB叢集儲存引擎中時,資料表將保存在數據節點內。能夠從叢集中所有其他MySQL伺服器直接訪問這些資料表。因此,在將數據保存在叢集內的工資資料表應用程式中,如果某一應用程式更新了1位僱員的工資,所有查詢該數據的其他MySQL伺服器能立刻發現這種變化。
對於MySQL叢集,保存在數據節點內的數據可被映射,叢集能夠處理單獨數據節點的故障,除了少數事務將因事務狀態丟失而被放棄外,不會產生其他影響。由於事務性應用程式能夠處理事務失敗事宜,因而它不是問題源。
通過將MySQL叢集引入開放原始碼世界,MySQL為所有需要它的人員提供了具有高可用性、高性能和可縮放性的叢集數據管理。
NDB是一種「內存中」儲存引擎,它具有可用性高和數據一致性好的特點。
能夠使用多種故障切換和負載平衡選項配置NDB儲存引擎,但以叢集層面上的儲存引擎開始最簡單。MySQL叢集的NDB儲存引擎包含完整的數據集,僅取決於叢集本身內的其他數據。
下面,我們介紹了設置由NDB儲存引擎和一些MySQL伺服器構成的MySQL叢集的設置方法。
目前,MySQL叢集的叢集部分可獨立於MySQL伺服器進行配置。在MySQL叢集中,叢集的每個部分被視為1個節點。
註釋:在很多情況下,術語「節點」用於指計算機,但在討論MySQL叢集時,它資料表示的是程序。在單台計算機上可以有任意數目的節點,為此,我們採用術語叢集主機。
有三類叢集節點,在最低的MySQL叢集配置中,至少有三個節點,這三類節點分別是:
· 管理(MGM)節點:這類節點的作用是管理MySQL叢集內的其他節點,如提供配置數據、啟動並停止節點、運行備份等。由於這類節點負責管理其他節點的配置,應在啟動其他節點之前首先啟動這類節點。MGM節點是用命令ndb_mgmd啟動的。
· 數據節點:這類節點用於保存叢集的數據。數據節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4個數據節點。沒有必要有一個以上的副本。數據節點是用命令ndbd啟動的。
· SQL節點:這是用來訪問叢集數據的節點。對於MySQL叢集,客戶端節點是使用NDB叢集儲存引擎的傳統MySQL伺服器。典型情況下,SQL節點是使用命令mysqld –ndbcluster啟動的,或將ndbcluster新增到my.cnf後使用mysqld啟動。
叢集配置包括對叢集中單獨節點的配置,以及設置節點之間的單獨通信鏈路。對於目前設計的MySQL叢集,其意圖在於,從處理器的能力、內存空間和帶寬來講,儲存節點是同質的,此外,為了提供單一的配置點,作為整體,叢集的所有配置數據均位於1個配置檔案中。
管理伺服器(MGM節點)負責管理叢集配置檔案和叢集日誌。叢集中的每個節點從管理伺服器檢索配置數據,並請求確定管理伺服器所在位置的方式。當數據節點內出現有趣的事件時,節點將關於這類事件的訊息傳輸到管理伺服器,然後,將這類訊息寫入叢集日誌。
此外,可以有任意數目的叢集客戶端程序或應用程式。它們分為兩種類型:
· 標準MySQL客戶端:對於MySQL叢集,它們與標準的(非叢集類)MySQL沒有區別。換句話講,能夠從用PHP、Perl、C、C++、Java、Python、Ruby等編寫的現有MySQL應用程式訪問MySQL叢集。
· 管理客戶端:這類客戶端與管理伺服器相連,並提供了優雅地啟動和停止節點、啟動和停止消息跟蹤(僅對調試版本)、顯示節點版本和狀態、啟動和停止備份等的命令。
本節介紹了如何規劃、安裝、配置和運行MySQL叢集的基本知識。與17.4節,「MySQL叢集的配置」中給出的示範不同,按照下面介紹的步驟和指南,所得的結果應是有用的MySQL叢集,它滿足對數據可用性和安全防護的最低要求。
在本節中,我們介紹了下述內容:硬件和軟件要求,聯網事宜,MySQL叢集的安裝,配置事宜,叢集的啟動、停止和重啟,加載樣本資料庫,以及執行查詢的方法。
基本假定
本節作了如下假定:
1. 我們將建立具有4個節點的叢集,每個節點位於不同的主機上,而且在典型的以太網中具有固定的網絡地址,如下所述:
|
節點 |
IP地址 |
|
管理(MGM)節點 |
192.168.0.10 |
|
MySQL伺服器(SQL)節點 |
192.168.0.20 |
|
數據(NDBD)節點"A" |
192.168.0.30 |
|
數據(NDBD)節點"B" |
192.168.0.40 |
2. 通過下圖可更清楚的表明這點:

4. 註釋:出於簡單性(以及可靠性)方面的考慮,在本基本知識介紹中我們僅使用數值IP地址。但是,如果在您的網絡中具備DNS解析功能,在配置叢集的過程中,可使用主機名代替IP地址。作為可選方式,也能使用/etc/hosts檔案,或能提供主機查詢的作業系統的等效物(如果可用的話)。
5. 在我們的場景中,每台主機均是基於Intel的桌面PC,PC上運行的是常見的一般性Linux版本,作業系統以標準配置安裝在磁盤上,未運行任何不必要的服務。具備標準TCP/IP聯網客戶端的核心作業系統應足以符合我們的要求。此外,為了簡單性,我們還假定所有主機上的檔案系統是等同的。如果這些主機上的檔案系統不同,就需對這些說明作相應的調整。
6. 在每台機器上安裝了標準的100 Mbps或1吉比特以太網卡,為每塊網卡安裝了恰當的驅動程式,並用標準的以太網聯網裝置(如交換器等)將4台主機連接起來(所有機器應使用具有相同容量的網卡,也就是說,叢集中的所有4台機器應全部使用100M網卡,或全部使用1G網卡)。MySQL叢集將工作在100 Mbps網絡中,但吉比特以太網能提供更好的性能。
注意,MySQL叢集不適合於連通性低於100 Mbps的網絡。出於該原因(尤其是),在公共網絡如Internet上運行MySQL叢集很難成功,也不推薦這樣做。
7. 對於樣本數據,我們將使用世界資料庫,該資料庫可從MySQL AB公司的網站上下載。由於該資料庫佔用的空間相對較小,我們假定每台機器有256 MB RAM,這足以運行作業系統、主機NDB程序、以及儲存資料庫(對於數據節點)。
儘管在本基本介紹中採用的是Linux作業系統,但對這裡給出的說明和步驟來說,僅過簡單的修改,也能適用於Solaris或Mac OS X。此外,我們還假定您已掌握了安裝和配置具備聯網功能的作業系統的基本知識,或能夠在需要的時候獲得幫助。
下一節,我們更詳細地討論了MySQL叢集的硬件、軟件和聯網要求。(請參見17.3.1節,「硬件、軟件和聯網」)。
MySQL叢集的一個強大優點在於,它能運行在普通硬件上,除了需要較大的RAM外在這點上沒有特殊要求,這是因為實際的數據儲存均是在內存中進行的。(注意,未來這點會改變,我們打算在未來的MySQL叢集版本中實現基於磁盤的儲存)。顯然,多個CPU和更快的CPU能增強性能。對於叢集程序來說,對內存的要求相對較少。
叢集的軟件要求程度適中。主機作業系統不需要任何特殊模塊、服務、應用程式、或配置就能支援MySQL叢集。對於Mac OS X或Solaris,標準安裝就已足夠。對於Linux,標準的「即開即用」安裝應是所需的全部。MySQL軟件要求很簡單:MySQL-max 5.1的生產版就是所需的全部,要想獲得叢集支援,必須使用MySQL的-max版本。無需自己編譯MySQL就能使用叢集。在本節中,我們假定您使用了與Linux相適應的-max二進製版本。對於Solaris或Mac OS X作業系統,相應的部分可通過MySQL軟件下載頁面獲得,http://dev.mysql.com/downloads/。
對於節點之間的通信,叢集支援採用標準拓撲方案的TCP/IP聯網,對於每台主機的預期最低要求是1塊標準的100 Mbps以太網卡,對於作為整體的叢集,還需加上交換器、網絡集線器或路由器以提供網絡連通性。我們強烈建議,應在其自己的子網內運行MySQL叢集,不與非叢集機器共享該子網,原因如下:
· 安全性:叢集節點之間的通信未採用任何特殊加密或防護。對MySQL叢集內傳輸的唯一保護方法是,在受保護的網絡上運行叢集。如果打算將MySQL叢集用於Web應用,叢集應明確地位於防火牆後面,而且不應位於網絡的非軍事區(DMZ)或其他地方。
· 效率:在專有的或受保護的網絡上設置MySQL叢集,這樣,叢集就能獨享叢集主機之間的帶寬。為MySQL叢集使用單獨的交換器不僅能防止對叢集數據的非法訪問,而且還能確保叢集節點不受網絡上其他計算機之間訊息傳輸的干擾。為了增強可靠性,可以使用雙交換器和雙卡,以防止網絡出現單點故障,對於這類通信鏈路,很多設備驅動均支援故障切換功能。
也能與MySQL叢集一起使用高速SCI(規模可延伸的計算機接口),但這不是要求的。關於該協議的更多訊息,以及它與MySQL叢集的用法,請參見17.7節,「使用與MySQL叢集的高速互連」對於每台運行儲存或SQL節點的MySQL叢集主機計算機,必須在其上安裝MySQL-max二進製版本。對於管理節點,沒有必要安裝MySQL伺服器二進製版本,但應安裝MGM伺服器端口監督程式和客戶端二進製版本(分別是ndb_mgmd和ndb_mgm)。在本節中,我們介紹了為每種叢集節點安裝正確的二進製版本所需的步驟。
MySQL AB提供了預編譯的二進制檔案,它們支援叢集,您不需要自己編譯這些檔案(如果您確實需要定制的二進制檔案,請參見2.8.3節,「從開發原始碼樹安裝」)。因此,對於每台叢集主機,安裝程序的第一步是從MySQL下載區下載檔案mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz。我們假定您將該檔案放在各機器的/var/tmp目錄下。
對於32位和64位Linux平台,均有相應的RPM,RPM安裝的-max二進制檔案支援NDB叢集儲存引擎。如果您選擇使用它們而不是二進制檔案,務必在運行叢集節點的所有機器上安裝-server和-max軟件包(關於使用RPM安裝MySQL的更多訊息,請參見2.4節,「在Linux下安裝MySQL」)。使用RPM完成安裝後,仍需對叢集進行配置,請參見17.3.3節,「配置」。
註釋:完成安裝後,不啟動任何二進制檔案。配置完所有節點後,我們將向您介紹執行這類操作的方法。
儲存節點和SQL節點安裝
在設計為運行儲存節點或SQL節點的三台機器的每一台上,以系統根用戶身份執行下述步驟:
1. 檢查您的/etc/passwd和/etc/group檔案(或使用作業系統提供的用於管理用戶和組的工具),查看在系統上是否已存在mysql組和mysql用戶,這是因為某些作業系統會將其作為安裝程序的一部分予以建立。如果它們不存在,建立新的mysql用戶組,然後為該組新增1個mysql用戶。
2. groupadd mysql
3. useradd -g mysql mysql
4. 進入包含下載檔案的目錄,解包檔案檔案,並建立與mysql-max可執行檔案的symlink。注意,根據MySQL的版本號,實際的檔案名和目錄名會有所不同。
5. cd /var/tmp
6. tar -xzvf -C /usr/local/bin mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz
7. ln -s /usr/local/bin/mysql-max-5.1.2-alpha-pc-linux-gnu-i686 mysql
8. 進入mysql目錄,運行所提供的用於建立系統資料庫的指令:
9. cd mysql
10. scripts/mysql_install_db --user=mysql
11.為MySQL伺服器和數據目錄設置必要的權限:
12. chown -R root .
13. chown -R mysql data
14. chgrp -R mysql .
注意,在每台運行數據節點的機器上,數據目錄是/usr/local/mysql/data。配置管理節點時將用到這類訊息(請參見17.3.3節,「配置」)。
15.將MySQL啟動指令拷貝到恰當的目錄下,使之成為可執行的指令,並設置它以便在啟動作業系統時啟動:
16. cp support-files/mysql.server /etc/rc.d/init.d/
17. chmod +x /etc/rc.d/init.d/mysql.server
18. chkconfig --add mysql.server
在此,我們使用Red Hat的chkconfig來建立與啟動指令的連結,請在您的作業系統上使用恰當的用於該目的的方式,如Debian上的update-rc.d。
請記住,對於儲存節點或SQL節點所在的每台機器,必須分別指向上述步驟。
管理節點安裝
對於MGM(管理)節點,不需要安裝mysqld可執行檔案,僅需安裝用於MGM伺服器和客戶端的二進制檔案,這類檔案可在下載的-max檔案中找到。再次假定您將該檔案放在了/var/tmp目錄下,引導系統時(也就是說使用sudo, su root或系統的等效命令後,假定具有系統管理員帳號的權限),執行下述步驟,在叢集管理節點主機上安裝ndb_mgmd和ndb_mgm:
1. 即如/var/tmp目錄,從檔案檔案中將ndb_mgm和ndb_mgmd提取到恰當的目錄下,如/usr/local/bin:
2. cd /var/tmp
3. tar -zxvf mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz /usr/local/bin '*/bin/ndb_mgm*'
4. 進入解包檔案所在的目錄,然後使這兩個檔案成為可執行的:
5. cd /usr/local/bin
6. chmod +x ndb_mgm*
在17.3.3節,「配置」中,我們將為示範叢集中的所有節點建立和編寫配置檔案。
對於我們的4節點、4主機MySQL叢集,需要編寫4個配置檔案,每個節點/主機1個。
· 每個數據節點或SQl節點需要1個my.cnf檔案,該檔案提供了兩類訊息:connectstring(連接字串),用於通知節點到哪裡找到MGM節點;以及一行,用於通知該主機(容納數據節點的機器)上的MySQL伺服器運行在NDB模式下。
關於連接字串的更多訊息,請參見17.4.4.2節,「MySQL叢集連接字串」。
· 管理節點需要config.ini檔案,該檔案通知節點有多少需要維護的副本,需要在每個數據節點上為數據和索引分配多少內存,數據節點的位置,在每個數據節點上保存數據的磁盤位置,以及SQL節點的位置。
配置儲存節點和SQL節點
數據節點所需的my.cnf檔案相當簡單。配置檔案應位於/etc目錄下,並能用任何文本編輯器進行編輯(如有必要,建立該檔案),例如:
vi /etc/my.cnf
對於本示範中的每個數據節點和SQL節點,my.cnf檔案類似於:
# Options for mysqld process:
[MYSQLD]
ndbcluster # run NDB engine
ndb-connectstring=192.168.0.10 # location of MGM node
# Options for ndbd process:
[MYSQL_CLUSTER]
ndb-connectstring=192.168.0.10 # location of MGM node
輸入上述內容後,保存檔案並退出文本編輯器。在容納數據節點「A」、數據節點「B」和SQL節點的機器上分別執行上述操作。
配置管理節點
配置MGM節點的第一步是建立目錄,該目錄用於存放配置檔案,然後建立配置檔案本身。例如(以根用戶身份運行):
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
在此使用了vi來建立檔案,不過,任何文本編輯器均應能勝任。
對於我們的典型設置,config.ini檔案應類似於:
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202 # This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: It is recommended beginning with MySQL 5.0 that
# you do not specify the portnumber at all and simply allow
# the default value to be used instead
# Management process options:
[NDB_MGMD]
hostname=192.168.0.10 # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster # Directory for MGM node logfiles
# Options for data node "A":
[NDBD]
# (one [NDBD] section per data node)
hostname=192.168.0.30 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# Options for data node "B":
[NDBD]
hostname=192.168.0.40 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# SQL node options:
[MYSQLD]
hostname=192.168.0.20 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
(註釋:"world"資料庫可從站點http://dev.mysql.com/doc/下載,它列在「示範」欄目下)。
一旦建立了所有的配置檔案並指定了這些最低選項,可啟動叢集,並驗證所有程序均能正常運行。關於這方面的討論,請參見17.3.4節,「首次啟動」。
關於可用MySQL叢集配置參數以及其用法的更多訊息,請參見17.4.4節,「配置檔案」和17.4節,「MySQL叢集的配置」。關於與進行備份有關的MySQL叢集配置,請參見17.6.5.4節,「叢集備份的配置」。
註釋:叢集管理節點的預設端口是1186,數據節點的預設端口2202。從MySQL 5.0.3開始,該限制已被放寬,叢集能夠根據空閒的端口自動地為數據節點分配端口。
完成配置後,啟動叢集並不很困難。必須在數據節點所在的主機上分別啟動每個叢集節點程序。儘管能夠按任何順序啟動節點,但我們建議,應首先啟動管理節點,然後啟動儲存節點,最後啟動SQL節點:
1. 在管理主機上,從系統shell發出下述命令以啟動MGM節點程序:
2. shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini
注意,必須用「-f」或「--config-file」選項,告訴ndb_mgmd到哪裡找到配置檔案(詳情請參見17.5.3節,「ndb_mgmd,「管理伺服器」程序」)。
3. 在每台數據節點主機上,對於首次啟動,運行下述命令啟動NDBD程序:
4. shell> ndbd --initial
注意,僅應在首次啟動ndbd時,或在備份/恢復或配置變化後重啟ndbd時使用「--initial」參數,這很重要。原因在於,該參數會使節點刪除由早期ndbd實例建立的、用於恢復的任何檔案,包括恢復用日誌檔案。
5. 如果使用RPM在SQL節點所在的叢集主機上安裝了MySQL,能夠(也應當)使用安裝在/etc/init.d下的啟動指令在SQL節點上啟動MySQL伺服器程序。注意,要想運行「-max」伺服器二進制檔案,除了標準的RPM外,還需要安裝-max伺服器RPM。
如果一切順利,並已正確設置了叢集,那麼叢集現在應能運行。通過使用ndb_mgm管理節點客戶端,可對其進行測試。其輸出應類似於:
shell> ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.30 (Version: 5.1.2-alpha, Nodegroup: 0, Master)
id=3 @192.168.0.40 (Version: 5.1.2-alpha, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.10 (Version: 5.1.2-alpha)
[mysqld(SQL)] 1 node(s)
id=4 (Version: 5.1.2-alpha)
具體的輸出內容可能會略有不同,這取決於您所使用的MySQL版本。
註釋:如果您正在使用較早的MySQL版本,您或許會看到引用為『[mysqld(API)]』的SQL節點。這是一種早期的用法,現已放棄。
現在,應能在MySQL叢集中處理資料庫,資料表和數據。關於這方面的簡要討論,請參見17.3.5節,「加載示範數據並執行查詢」。
與沒有使用叢集的MySQL相比,在MySQL叢集內操作數據的方式沒有太大的區別。執行這類操作時應記住兩點:
· 資料表必須用ENGINE=NDB或ENGINE=NDBCLUSTER選項建立,或用ALTER TABLE選項更改,以使用NDB叢集儲存引擎在叢集內複製它們。如果使用mysqldump的輸出從已有資料庫導入資料表,可在文本編輯器中打開SQL指令,並將該選項新增到任何資料表建立語句,或用這類選項之一替換任何已有的ENGINE(或TYPE)選項。例如,假定在另一個MySQL伺服器(不支援MySQL叢集)上有樣本世界資料庫,而且您打算導出城市資料表的定義:
· shell> mysqldump --add-drop-table world City > city_table.sql
在所得的city_table.sql檔案中,將包含這條資料表建立語句(以及導入資料表數據所需的INSERT語句):
DROP TABLE IF EXISTS City;
CREATE TABLE City (
ID int(11) NOT NULL auto_increment,
Name char(35) NOT NULL default '',
CountryCode char(3) NOT NULL default '',
District char(20) NOT NULL default '',
Population int(11) NOT NULL default '0',
PRIMARY KEY (ID)
) ENGINE=MyISAM;
INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000);
INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500);
INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800);
# (remaining INSERT statements omitted)
需要確認MySQL為該資料表使用了NDB儲存引擎。有兩種完成該任務的方法。其中一種方法是,在將資料表導入叢集資料庫之前更改其定義,使其類似於(仍使用「城市」作為示範):
DROP TABLE IF EXISTS City;
CREATE TABLE City (
ID int(11) NOT NULL auto_increment,
Name char(35) NOT NULL default '',
CountryCode char(3) NOT NULL default '',
District char(20) NOT NULL default '',
Population int(11) NOT NULL default '0',
PRIMARY KEY (ID)
) ENGINE=NDBCLUSTER;
INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000);
INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500);
INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800);
# (etc.)
對於將成為叢集資料庫組成部份的每個資料表,均需要為其定義執行上述操作。完成該任務的最簡單方法是,簡單地在world.sql檔案上執行「搜尋-替換」,並用ENGINE=NDBCLUSTER替換所有的TYPE=MyISAM實例。如果您不打算更改該檔案,也可使用ALTER TABLE。詳情請參見下面的介紹。
假定您已在叢集的SQL節點上建立了名為「world」的資料庫,隨後可使用mysql命令行客戶端讀取city_table.sql,並按通常方式建立和填充對應的資料表:
shell> mysql world < city_table.sql
請記住,上述命令必須在運行SQL節點的主機上執行,這點十分重要。對於本例,應在IP地址為192.168.0.20的機器上執行。
要想在SQL節點上建立世界資料庫的副本,請將檔案保存到/usr/local/mysql/data,然後運行:
shell> cd /usr/local/mysql/data
shell> mysql world < world.sql
當然,SQL指令必須能被mysql系統用戶讀取。如果將檔案保存到了不同的目錄下,請作相應的調整。
注意,在MySQL 5.1中,NDB叢集不支援自動發現資料庫的功能,這點很重要(請參見17.8節,「MySQL叢集的已知限制」)。這意味著,一旦在一個數據節點上建立了世界(world)資料庫和它的資料表,在叢集中的每個SQL節點上還需要發出命令CREATE DATABASE world(從MySQL 5.0.2開始,可以使用CREATE SCHEMA world取而代之),後跟FLUSH TABLES。這樣,節點就能識別資料庫並讀取其資料表定義。
在SQL節點上運行SELECT查詢與在MySQL伺服器的任何其他實例上運行查詢沒有區別。要想從命令行運行查詢,首先應按照通常方式登錄到MySQL監視器:
shell> mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.1.2-alpha
鍵入』help;』或』\h』獲取幫助。鍵入』\c』清空緩衝區。
mysql>
如果在導入MySQL指令之前未更改資料表定義中的ENGINE=子句,應在此時運行下述命令:
mysql> USE world;
mysql> ALTER TABLE City ENGINE=NDBCLUSTER;
mysql> ALTER TABLE Country ENGINE=NDBCLUSTER;
mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
注意,在這裡我們簡單地使用了MySQL伺服器密碼為空的預設根用戶帳號。當然,在生產設置下,安裝MySQL伺服器時,總應遵守標準的安全方法措施,包括設置牢靠的根用戶密碼,並為用戶建立具有完成任務所需的權限的用戶帳號。關於這方面的更多訊息,請參見5.7節,「MySQL訪問權限系統」。
需要關注的是,當叢集節點彼此訪問時不使用MySQL的權限系統,設置或更改MySQL用戶帳號(包括根用戶帳號)不影響節點之間的交互,它們僅對訪問SQL節點的應用程式有效。
能夠以通常的方式選擇資料庫,並對資料表執行SELECT查詢,就像退出MySQL監視器一樣:
mysql> USE world;
mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5;
+-----------+------------+
| 名稱 | 人口 |
+-----------+------------+
| 孟買 | 10500000 |
| 漢城 | 9981619 |
| 聖保羅 | 9968485 |
| 上海 | 9696300 |
| 雅加達 | 9604900 |
+-----------+------------+
5 rows in set (0.34 sec)
mysql> \q
Bye
shell>
使用MySQL的應用程式能夠使用標準的API。重要的是應記住,您的應用程式必須訪問SQL節點,而不是MGM或儲存節點。在下面的簡單示範中,介紹了使用PHP 5的mysqli延伸(運行在位於網絡中其他位置的Web伺服器上)執行相同查詢的方法:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<title>SIMPLE mysqli SELECT</title>
</head>
<body>
<?php
# connect to SQL node:
$link = new mysqli('192.168.0.20', 'root', '', 'world');
# parameters for mysqli constructor are:
# host, user, password, database
if( mysqli_connect_errno() )
die("Connect failed: " . mysqli_connect_error());
$query = "SELECT Name, Population
FROM City
ORDER BY Population DESC
LIMIT 5";
# if no errors...
if( $result = $link->query($query) )
{
?>
<table border="1" width="40%" cellpadding="4" cellspacing ="1">
<tbody>
<tr>
<th width="10%">City</th>
<th>Population</th>
</tr>
<?
# then display the results...
while($row = $result->fetch_object())
printf(<tr>\n <td align=\"center\">%s</td><td>%d</td>\n</tr>\n",
$row->Name, $row->Population);
?>
</tbody
</table>
<?
# ...and verify the number of rows that were retrieved
printf("<p>Affected rows: %d</p>\n", $link->affected_rows);
}
else
# otherwise, tell us what went wrong
echo mysqli_error();
# free the result set and the mysqli connection object
$result->close();
$link->close();
?>
</body>
</html>
我們假定運行在Web伺服器上的程序能夠訪問SQL節點的IP地址。
採用類似的風格,可以使用MySQL C API、Perl-DBI、Python-mysql、或MySQL AB自己的連接器來執行數據定義和操控任務,就像正常使用MySQL那樣。
· 另外還請記住,每個NDB資料表必須有一個主鍵。如果在建立資料表時用戶未定義主鍵,NDB叢集儲存引擎將自動生成隱含的主鍵。(註釋:該隱含 鍵也將佔用空間,就像任何其他的資料表索引一樣。由於沒有足夠的內存來容納這些自動建立的鍵,出現問題並不罕見)。
要想關閉叢集,可在MGM節點所在的機器上,在Shell中簡單地輸入下述命令:
shell> ndb_mgm -e shutdown
該命令將恰當地中止ndb_mgm、ndb_mgmd以及任何ndbd程序。使用mysqladmin shutdown或其他方法,可中止SQL節點。注意,這裡的「-e」選項用於將命令從shell傳遞到ndb_mgm客戶端。請參見4.3.1節,「在命令行上使用選項」。
要想重啟叢集,可簡單地運行下述命令:
· 在管理主機上(本設置中為192.168.0.10):
· shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini
· 在每台數據節點主機上(192.168.0.30和192.168.0.40):
· shell> ndbd
請記住,正常重啟NDBD節點時,不要用「--initial」選項使用該命令。
· 在SQL主機上(192.168.0.20):
· shell> mysqld &
關於建立叢集備份的更多訊息,請參見17.6.5.2節,「使用管理伺服器建立備份」。
要想從備份中恢復叢集,需要使用ndb_restore命令。請參見17.6.5.3節,「如何恢復叢集備份」。
關於配置MySQL叢集的更多訊息,請參見17.4節,「MySQL叢集的配置」。
為了避免不必要的資源分配,預設情況下,在伺服器的配置中將禁止NDB儲存引擎。要想啟用NDB,需要更改伺服器的my.cnf配置檔案,或使用「—ndbcluster」選項啟動伺服器。
由於MySQL伺服器是叢集的一部分,它也需要知道如何訪問MGM節點,以便獲得叢集配置數據。預設行為是搜尋本地主機上MGM節點。但是,如果需要另外指定它的位置,可在my.cnf檔案或MySQL伺服器命令行上進行。能夠使用NDB儲存引擎之前,至少應有一個MGM節點是可操作的,而且還應有所需的數據節點。
對於Linux、Mac OS X和Solaris,在其二進制分發版中均提供了NDB叢集儲存引擎。在Windows平台上尚不支援它,但我們打算在不遠的將來使其能用於win32和其他平台。
如果選擇從原始碼tarball或MySQL 5.1 BitKeeper樹建立它,運行configure時,務必使用「--with-ndbcluster」選項。也可以使用BUILD/compile-pentium-max建立指令。注意,該指令包含OpenSSL,因此,要想成功建立,必須有或獲得OpenSSL,如不然,需要更改「compile-pentium-max」以便將該要求排除在外,當然,也能採用標準步驟來編譯您自己的二進制檔案,然後執行常規測試和安裝步驟。請參見2.8.3節,「從開發原始碼樹安裝」。
在下面的數節內,假定您已熟悉了MySQL的安裝方法,在此,我們僅介紹了MySQL叢集配置與不具備叢集功能的MySQL配置之間的差別。如果希望瞭解關於後者的更多訊息,請參見第2章:安裝MySQL。
如果首先運行了所有的管理和數據節點,您將發現叢集配置最簡單,這或許是最花時間的配置部分。編輯my.cnf檔案相對直接,在本節中,僅討論與不具備叢集功能的MySQL配置不同的部分。
首先,應以系統根用戶身份通過執行下述命令建立配置目錄,如/var/lib/mysql-cluster:
shell> mkdir /var/lib/mysql-cluster
在該目錄下,使用下述訊息建立名為config.ini的檔案,針對系統的情況,用恰當的值替換HostName和DataDir。
# file "config.ini" - showing minimal setup consisting of 1 data node,
# 1 management server, and 3 MySQL servers.
# The empty default sections are not required, and are shown only for
# the sake of completeness.
# Data nodes must provide a hostname but MySQL Servers are not required
# to do so.
# If you don't know the hostname for your machine, use localhost.
# The DataDir parameter also has a default value, but it is recommended to
# set it explicitly.
# Note: DB, API, and MGM are aliases for NDBD, MYSQLD, and NDB_MGMD
# respectively. DB and API are deprecated and should not be used in new
# installations.
[NDBD DEFAULT]
NoOfReplicas= 1
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
[NDB_MGMD]
HostName= myhost.example.com
[NDBD]
HostName= myhost.example.com
DataDir= /var/lib/mysql-cluster
[MYSQLD]
[MYSQLD]
[MYSQLD]
現在,能夠按下述方式啟動管理伺服器:
shell> cd /var/lib/mysql-cluster
shell> ndb_mgmd
接下來,通過運行ndbd啟動單個DB節點。首次為給定的DB節點啟動ndbd時,應使用「—initial」選項,如下所示:
shell> ndbd --initial
對於後續的ndbd啟動,通常不需要使用該選項:
shell> ndbd
這是因為,--initial選項將刪除該數據節點的所有已有數據和日誌檔案(以及所有的資料表元數據),並建立新的數據和日誌檔案。該規則的一項例外是:新增了新數據節點後重啟叢集並從備份進行恢復之時。
預設情況下,ndbd將在端口1186上搜尋本地主機上的管理伺服器。
註釋:如果從二進制tarball安裝了MySQL,需要明確指定ndb_mgmd和ndbd伺服器的路徑。(正常情況下,它們位於/usr/local/mysql/bin目錄下)。
最後,進入MySQL數據目錄(通常是/var/lib/mysql或/usr/local/mysql/data),並確保my.cnf檔案包含啟用NDB儲存引擎所需的選項:
[mysqld]
ndbcluster
現在,您能按通常方式啟動MySQL伺服器:
shell> mysqld_safe --user=mysql &
等待一段時間,確認MySQL伺服器正在恰當運行。如果發現通知用mysql停止,請檢查伺服器的.err檔案,找出錯誤。
如果到目前為止一切正常,可使用叢集啟動它:
shell> mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.1.2-alpha-Max
鍵入』help;』或』\h』獲取幫助。鍵入』\c』清空緩衝區。
mysql> SHOW ENGINES\G
...
*************************** 12. row ***************************
Engine: NDBCLUSTER
Support: YES
Comment: Clustered, fault-tolerant, memory-based tables
*************************** 13. row ***************************
Engine: NDB
Support: YES
Comment: Alias for NDBCLUSTER
...
(注意,上例輸出中顯示的行號可能與您的系統上顯示的不同,具體情況取決於使用的MySQL版本,以及配置它的方式)。
shell> mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.1.2-alpha-Max
鍵入』help;』或』\h』獲取幫助。鍵入』\c』清空緩衝區。
mysql> USE test;
Database changed
mysql> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (0.09 sec)
mysql> SHOW CREATE TABLE ctest \G
*************************** 1. row ***************************
Table: ctest
Create Table: CREATE TABLE `ctest` (
`i` int(11) default NULL
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
要想檢查是否恰當設置了節點,可啟動管理客戶端:
shell> ndb_mgm
隨後,為了獲得關於叢集狀態的報告,可從管理客戶端內使用SHOW命令:
NDB> SHOW
Cluster Configuration
---------------------
[ndbd(NDB)] 1 node(s)
id=2 @127.0.0.1 (Version: 3.5.3, Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @127.0.0.1 (Version: 3.5.3)
[mysqld(API)] 3 node(s)
id=3 @127.0.0.1 (Version: 3.5.3)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)
此時,您成功地設置了工作的MySQL叢集。現在,您能使用由ENGINE=NDBCLUSTER或其別名ENGINE=NDB建立的資料表,將數據保存到叢集中。
配置MySQL叢集需要與兩個檔案打交道:
· my.cnf:為所有的MySQL叢集可執行檔案指定了選項。您應熟悉了前面介紹的使用MySQL的方式,通過運行在叢集中的每個可執行檔案,必須能夠訪問該檔案。
· config.ini:該檔案僅由MySQL叢集管理伺服器讀取,隨後管理伺服器會將包含該檔案的訊息分配給叢集中的所有程序。config.ini檔案包含對叢集中各節點的描述。包括數據節點的配置參數,以及叢集中所有節點間連接的配置參數。
我們正在不斷改進叢集配置,並努力簡化該程序。儘管我們將盡量維護向後相容性,但在某些時候,可能也需要引入不兼容的變動。在這種情況下,我們將盡量讓叢集用戶事先瞭解該變動是否是向後兼容的。如果您發現了尚未記錄在文檔中的這類變動,請使用我們的問題資料庫通報它。
為了支援MySQL叢集,需要更新檔案my.cnf,如下例所示。注意,不應將這裡給出的選項與config.ini檔案中出現的選項混淆起來。此外,從命令行使用可執行檔案時,或許也應指定這些參數。
# my.cnf
# example additions to my.cnf for MySQL Cluster
# (valid in MySQL 5.1)
# enable ndbcluster storage engine, and provide connectstring for
# management server host (default port is 1186)
[mysqld]
ndbcluster
ndb-connectstring=ndb_mgmd.mysql.com
# provide connectstring for management server host (default port: 1186)
[ndbd]
connect-string=ndb_mgmd.mysql.com
# provide connectstring for management server host (default port: 1186)
[ndb_mgm]
connect-string=ndb_mgmd.mysql.com
# provide location of cluster configuration file
[ndb_mgmd]
config-file=/etc/config.ini
(關於連接字元的更多訊息,請參見17.4.4.2節,「MySQL叢集連接字串」)。
# my.cnf
# example additions to my.cnf for MySQL Cluster
# (will work on all versions)
# enable ndbcluster storage engine, and provide connectstring for management
# server host to the default port 1186
[mysqld]
ndbcluster
ndb-connectstring=ndb_mgmd.mysql.com:1186
或許,您也可以使用叢集my.cnf中單獨的[mysql_cluster]部分,設置可被所有可執行檔案讀取的設置,並影響所有的可執行檔案:
# cluster-specific settings
[mysql_cluster]
ndb-connectstring=ndb_mgmd.mysql.com:1186
目前,配置檔案採用的是INI格式,預設情況下被命名為config.ini。該檔案在啟動時由ndb_mgmd讀取,並能被置於任何地方。在命令行上與ndb_mgmd一起使用--config-file=[<path>]<filename>,可指定其位置和名稱。如果未指定配置檔案,預設情況下,ndb_mgmd將嘗試讀取位於當前工作目錄下的檔案config.ini。
對於大多數參數,均定義了預設值,也能在config.ini檔案中指定預設值。要想建立預設值部分,可簡單地將單詞DEFAULT新增到該部分的名稱上。例如,數據節點是使用[NDBD]部分配置的。如果所有的數據節點使用相同大小的數據內存,而且該內存大小不同於預設的大小,應建立包含DataMemory行的[NDBD DEFAULT]部分,為所有數據節點指定預設的數據內存大小。
INI格式包含多個部分,每一部分以該部分的標題(用方括號括住)開始,後跟恰當的參數名和值。與標準格式的不同之處在於,不能用冒號「:」和等號「=」隔開參數名和值;另一處不同是,這些部分並不是用名稱唯一標識的。其唯一性條目(如具有相同類型的兩個不同節點)是由唯一ID標識的。
作為最低要求,配置檔案必須定義叢集中的計算機和節點,以及這些節點所在的計算機。下面給出了一個簡單的叢集配置檔案示範,該叢集包含1個管理伺服器,2個數據節點和2個MySQL伺服器:
# file "config.ini" - 2 data nodes and 2 SQL nodes
# This file is placed in the startup directory of ndb_mgmd (the management
# server)
# The first MySQL Server can be started from any host. The second can be started
# only on the host mysqld_5.mysql.com
[NDBD DEFAULT]
NoOfReplicas= 2
DataDir= /var/lib/mysql-cluster
[NDB_MGMD]
Hostname= ndb_mgmd.mysql.com
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName= ndbd_2.mysql.com
[NDBD]
HostName= ndbd_3.mysql.com
[MYSQLD]
[MYSQLD]
HostName= mysqld_5.mysql.com
在該配置檔案中,有6個不同部分:
· [COMPUTER]:定義了叢集主機。
· [NDBD]:定義了叢集的數據節點。
· [MYSQLD]:定義了叢集的MySQL伺服器節點。
· [MGM]或[NDB_MGMD]:定義了叢集的管理伺服器節點。
· [TCP]:定義了叢集中節點間的TCP/IP連接,TCP/IP是預設的連接協議。
· [SHM]:定義了節點間的共享內存連接。以前,這類連接僅能在使用「--with-ndb-shm」選項建立的二進制檔案中使用。在MySQL 5.1-Max中,預設情況下它是允許的,但仍應將其視為試驗性的。
注意,每個節點在config.ini檔案中有自己的部分。例如,由於該叢集有兩個數據節點,在配置檔案中,也包含定義這些節點的部分。
可以為每個部分定義DEFAULT值。所有的叢集參數名稱均區分大小寫。
除了MySQL叢集管理伺服器(ndb_mgmd),構成MySQL叢集的每個節點均需要1個連接字串,該連接字串指向管理伺服器所在的位置。它用於建立與管理伺服器的連接,並執行其他任務,這類其他任務取決於節點在叢集內扮演的角色。連接字串的語法如下:
<connectstring> :=
[<nodeid-specification>,]<host-specification>[,<host-specification>]
<nodeid-specification> := node_id
<host-specification> := host[:port]
node_id是大於1的整數,用於確定config.ini中的節點。port是引用正常Unix端口的整數。host是代資料表有效Internet地址的字串。
example 1 (long): "nodeid=2,myhost1:1100,myhost2:1100,192.168.0.3:1200"
example 2 (short): "myhost1"
如果未提供,所有節點均將使用localhost:1186作為預設的連接字串值。如果在連接字串中省略了<port>,預設端口為1186。該端口在網絡上總應是可用的,這是因為它是由IANA為該目的而指定的(詳情請參見http://www.iana.org/assignments/port-numbers)。
通過列出多個<host-specification>值,能夠指定數個冗余管理伺服器。叢集節點將按照指定的順序嘗試連接到每台主機上的連續管理伺服器,直至成功建立起連接為止。
有多種指定連接字串的不同方法:
· 每個可執行檔案有自己的命令行選項,使用它,能夠在啟動時指定管理伺服器(關於各可執行程式的介紹,請參見相應的文檔)。
· 也能一次性地為叢集中的所有節點設置連接字串,方法是將其放在管理伺服器的my.cnf檔案的[mysql_cluster]部分。
· 為了向後相容性,還提供了兩種其他選項,其使用的語法相同:
1. 設置NDB_CONNECTSTRING環境變數,使之包含connectstring(連接字串)。
2. 將針對各可執行檔案的connectstring(連接字串)寫入名為Ndb.cfg的文本檔案,並將該檔案放在可執行檔案的啟動目錄下。
但是,這些方法目前已不再受重視,對於新安裝,不應使用它們。
指定連接字串時,推薦的方法是在命令行上設置它,或為每個可執行檔案在my.cnf檔案中設置它。
除了用於避免為系統中的每個節點定義主機名外,[COMPUTER]部分沒有實際的重要意義。這裡所提到的所有參數都是需要的。
· [COMPUTER]Id
這是整數值,用於引用位於配置檔案中別處的主機計算機。
· [COMPUTER]HostName
這是計算機的主機名或IP地址。
[NDB_MGMD]部分(或其別名[MGM])用於配置管理伺服器的行為。下面列出的所有參數均能被忽略,如果是這樣,將使用其預設值。註釋:如果ExecuteOnComputer和HostName參數均未出現,會為它們指定預設值localhost。
· [NDB_MGMD]Id
叢集中的每個節點都有唯一的標識,由從1到63的整數資料表示。所有的內部叢集消息使用該ID來定址結點。
· [NDB_MGMD]ExecuteOnComputer
它引用在[COMPUTER]部分中定義的計算機之一。
· [NDB_MGMD]PortNumber
這是管理伺服器用於監聽配置請求和管理命令的端口號。
· [NDB_MGMD]LogDestination
該參數指定了將叢集登錄訊息發送到哪裡。有三種選項,CONSOLE、SYSLOG和FILE:
o CONSOLE,將日誌輸出到標準輸出設備(stdout):
o CONSOLE
o SYSLOG,將日誌發送到syslog(系統日誌)軟設備,可能的值包括:auth、authpriv、cron、daemon、ftp、kern、lpr、mail、news、syslog、user、uucp、local0、local1、local2、local3、local4、local5、local6或local7。
註釋:並非所有的作業系統均支援所有的軟設備。
SYSLOG:facility=syslog
o FILE,將叢集日誌輸出導向相同機器上的正規檔案。可指定下述值:
§ filename:日誌檔案的名稱。
§ maxsize:日誌記錄切換到新檔案之前,檔案能增長到的最大尺寸。出現該情況時,將通過在檔案名上新增.x,重命名日誌檔案,其中,x是該名稱尚未使用的下一個數字。
§ maxfiles:日誌檔案的最大數目。
o FILE:filename=cluster.log,maxsize=1000000,maxfiles=6
使用由分號分隔的字串,可以指定多個日誌目標,如下所示:
CONSOLE;SYSLOG:facility=local0;FILE:filename=/var/log/mgmd
FILE參數的預設值是FILE:filename=ndb_node_id_cluster.log,maxsize=1000000,maxfiles=6,其中,node_id是節點的ID。
· [NDB_MGMD]ArbitrationRank
該參數用於定義哪個節點將扮演仲裁程式的角色。只有MGM節點和SQL節點能扮演仲裁程式的角色。ArbitrationRank可以取下述值之一:
o 0:該節點永遠不會用作仲裁程式。
o 1:該節點具有高的優先級,也就是說,與低優先級節點相比,它更容易成為仲裁程式。
o 2:表明節點具有低的優先級,僅當具有高優先級的節點無法用於該目的時,才能成為仲裁程式。
通常情況下,應將ArbitrationRank設置為1(預設值),並將所有的SQL節點設置為0,將管理伺服器配置為仲裁程式。
· [NDB_MGMD]ArbitrationDelay
整數值,以毫秒為單位規定了管理伺服器對仲裁請求的延遲時間。預設情況下,該值為0,通常不需要改變它。
· [NDB_MGMD]DataDir
它用於設置保存管理伺服器輸出檔案的位置。這些檔案包括叢集日誌檔案、程序輸出檔案、以及端口監督程式的pid檔案(對於日誌檔案,可通過設置[NDB_MGMD]LogDestination的FILE參數覆蓋它,請參見本節前面的討論)。
[NDBD]部分用於配置叢集數據節點的行為。有很多可用於控制緩衝區大小、池大小、超時等的參數。強制性參數包括:
· ExecuteOnComputer或HostName.
· 參數NoOfReplicas
這些參數需要在[NDBD DEFAULT]部分中定義。
大多數數據節點參數是在[NDBD DEFAULT]部分中設置的。只有那些明確聲明為能設置本地值的參數才能在[NDBD]部分中被更改。HostName、Id以及ExecuteOnComputer必須在本地[NDBD]部分中定義。
識別數據節點
啟動節點時,可在命令行上分配Id值(即數據節點ID),也能在配置檔案中分配Id值。
對於各參數,能夠使用後綴k、M或G用於指明單位,分別資料表示1024、1024*1024或1024*1024*1024(例如,100k資料表示100 * 1024 = 102400)。目前,參數和值區分大小寫。
· [NBDB]Id
這是用作節點地址的節點ID,供有的叢集內部消息使用。這是介於1~63之間的整數。叢集中的每個節點均有唯一的ID。
· [NDBD]ExecuteOnComputer
用於引用在COMPUTER部分中定義的計算機(主機)。
· [NDBD]HostName
指定該參數的效果類似於指定ExecuteOnComputer。它定義了儲存節點所在計算機的主機名。指定除localhost之外的其他主機名時,需要該參數或ExecuteOnComputer。
· (OBSOLETE) [NDBD]ServerPort
叢集中的各節點使用端口來與其他節點相連。該端口也用於連接建立階段中的非TCP傳輸器。由於預設端口是動態分配的,同一台計算機上的兩個節點具有不同的端口號,正常情況下不需要為該參數指定值。
· [NDBD]NoOfReplicas
該全局參數僅能在[NDBD DEFAULT]中設置,它定義了叢集中每個資料表保存的副本數。該參數還指定了節點組的大小。節點組指的是保存相同訊息的節點集合。
節點組是以隱式方式構成的。第1個節點組由具有最低節點ID的數據節點集合構成,下一個節點組由具有次低節點ID的數據節點集合構成,依此類推。作為示範,截頂我們有4個數據節點,並將NoOfReplicas設置為2。這四個數據節點的ID分別是2、3、4、5。那麼第1個節點組由節點2和3構成,第2個節點組由節點4和5構成。重要的是對叢集進行相應的配置,使得同一節點組中的節點位於不同的計算機上,這是因為,如果位於相同的計算機上,單個硬件故障會導致整個叢集崩潰。
如果未提供節點ID,那麼數據節點的順序將是節點組的決定因素。無論是否進行了明確的分配,可在管理客戶端SHOW命令的輸出中查看它們。
NoOfReplicas沒有預設值,最大的可能值為4。
· [NDBD]DataDir
該參數指定了存放跟蹤檔案、日誌檔案、pid檔案以及錯誤日誌的目錄。
· [NDBD]FileSystemPath
該參數指定了存放為元數據建立的所有檔案、REDO日誌、UNDO日誌和數據檔案的目錄。預設目錄是由DataDir指定的。注意,啟動ndbd程序之前,該目錄必須已存在。
為MySQl叢集推薦的目錄層次包括/var/lib/mysql-cluster,在其下為節點的檔案系統建立1個為目錄。該子目錄包含節點ID。例如,如果節點ID為2,該子目錄的名稱為ndb_2_fs。
· [NDBD]BackupDataDir
也能指定存放備份的目錄。預設情況下,該目錄是FileSystemPath/BACKUP(請參見前面的介紹)。
數據內存和索引內存
參數DataMemory和IndexMemory指定了存放實際記錄及其索引的內存段的大小。這是它們的值時,重要的是應掌握使用DataMemory和IndexMemory的方式,這是因為,為了反映叢集的實際使用情況,常常需要更新它們:
· [NDBD]DataMemory
該參數定義了用於保存資料庫記錄的空間大小。全部空間均是分配在內存中的,因此,機器應具有足夠的物理內存來容納該值,這點極其重要。
由DataMemory分配的內存用於保存實際記錄和索引。目前,每條記錄具有固定的大小(甚至VARCHAR列也保存為固定寬度列)。每條記錄的開銷為16字節,此外,每條記錄還需要額外的空間,這是因為,這類記錄保存在具有128字節頁面開銷的32KB頁中(請參見下面的介紹)。由於每條記錄僅保存在1個頁中,因而每頁有少量的浪費。目前,最大記錄大小為8052字節。
由DataMemory定義的內存空間也用於保存有序索引,對於每條記錄,索引約使用10字節。在有序索引中,資料表示了每個資料表行。用戶常犯的一個錯誤是,想當然地認為所有的索引均保存在由IndexMemory分配的內存中,但情況並非如此:只有主鍵和唯一性混編索引使用該內存,有序索引使用的是由DataMemory分配的內存。然而,建立主鍵或唯一性混編索引時,也會在相同的 鍵上建立有序索引,除非在索引建立語句中指定了USING HASH。通過在管理客戶端中運行ndb_desc -d db_name table_name,可對其進行驗證。
DataMemory分配的內存空間由多個32KB頁構成,它們是為資料表片段分配的。通常情況下,為每一資料表劃分的資料表片段數目與叢集中的節點數目相同。因此,對於每一節點,片段數目與在NoOfReplicas中設置的相同。一旦分配了1頁,目前無法將其返回到自由頁池中,除非刪除資料表。執行節點恢復也將壓縮分區,這是因為,所有記錄均會被插入到其他活動節點的空分區中。
DataMemory內存空間也包含UNDO訊息:對於每一更新,未改變記錄的副本將被分配到DataMemory中。在有序資料表索引中,還有對每一副本的引用。僅當更新唯一性索引列時,才會更新唯一性混編索引,在該情況下,將在索引資料表中插入新的條目,並在提交時刪除舊的條目。因此,也有必要分配足夠的內存,以便處理由使用叢集的應用程式執行的最大事務。在任何情況下,執行少量大的事務並不比使用眾多小的事務佔優,原因如下:
o 大事務的速度沒有較小事務的速度快。
o 大的事務會增加丟失操作的數目,一旦事務失敗,必須重複執行。
o 大的事務使用更多的內存。
DataMemory的預設值是80MB,最小為1MB。沒有最大尺寸限制,但在實際使用過程中,最大限制應恰當,以便當達到最大限制時,程序不會啟動交換功能。該限制由機器上可用的物理RAM量、以及作業系統能提交給任何程序的內存量決定。對於32位作業系統,該限制值為每程序2~4GB,對於64位作業系統,該限制值更大。對於大的資料庫,出於該原因,最好使用64位作業系統。此外,在每台機器上也能運行一個以上的ndbd程序,在使用多CPU的機器上,該特性頗具優勢。
· [NDBD]IndexMemory
該參數用於控制MySQL叢集中哈希(混編)索引所使用的儲存量。哈希(混編)索引總用於主鍵索引、唯一性索引、以及唯一性約束。注意,定義主鍵和唯一性索引時,將建立兩條索引,其中一條是用於所有tuple訪問和鎖定處理的哈希(混編)索引。此外,它還能用於增強唯一性約束。
哈希(混編)索引的大小是每記錄25字節,再加上主鍵的大小。對大於32字節的主鍵,還需加上8字節。
考慮下例定義的資料表:
CREATE TABLE example (
a INT NOT NULL,
b INT NOT NULL,
c INT NOT NULL,
PRIMARY KEY(a),
UNIQUE(b)
) ENGINE=NDBCLUSTER;
有12字節的開銷(無可空列將節省4字節的開銷)加上每記錄12字節的數據。此外,在列a和b上有兩個有序索引,假定每記錄分別耗用約10字節的空間。在每記錄約使用29字節的基資料表上有1條主鍵哈希索引。唯一性約束由以b作為主鍵以及a作為列的單獨資料表實現。對於該資料表,每記錄將耗用額外的29字節索引內存,在示範資料表中,還包括12字節的開銷再加上8字節的記錄數據。
因此,對於100萬條記錄,需要58MB的索引內存來處理用於主鍵和唯一性約束的哈希索引。還需要64 MB來處理基資料表和唯一索引資料表、以及兩個有序索引資料表的記錄。
由此可見,哈希索引佔用了相當大的內存空間,但作為回報,它們提供了對數據的極快訪問。在MySQl叢集中,它們也用於處理唯一性約束。
目前僅有的分區算法是散列法,有序索引對每個節點來說都是局部性的。因此,有序索引不能用於處理一般情況下的唯一性約束。
對於IndexMemory和DataMemory,重要的是,總的資料庫大小是各節點組的所有數據內存和所有索引內存之和。每個節點組用於保存複製訊息,因此,如果有4個節點和2個副本,將有2個節點組。對於每個數據節點,可用的總數據內存是2*DataMemory。
強烈建議為所有的節點設置相同的DataMemory值和IndexMemory值。由於數據是平均分佈在叢集中的所有節點上,任何節點可用的最大空間不超過叢集中最小節點的可用空間。
DataMemory和IndexMemory可被更改,但降低任何一個的值均會導致危險,如果這樣做,很容易使某一節點甚至整個叢集因缺少足夠的內存空間而無法重啟。增加它們的值應是可接受的,但建議採用與軟件升級相同的方式升級它,首先更新配置檔案,然後重啟管理伺服器,最後依次重啟每個數據節點。
更新不會增加所用的索引內存。插入將立刻生效,但是,在提交事務之前並不會實際刪除行。
IndexMemory的預設值是18MB。最小值為1MB。
事務參數
下面討論的三個參數十分重要,這是因為,它們會影響並發事務的數目,以及系統能夠處理的事務的大小。MaxNoOfConcurrentTransactions用於設置節點內可能的並發事務數目。MaxNoOfConcurrentOperations用於設置能同時出現在更新階段或同時鎖定的記錄數目。
對於打算設定特定值、不使用預設值的用戶,這兩個參數可能正是他們所需的(尤其是MaxNoOfConcurrentOperations)。預設值是為使用小型事務的系統而設置的,為的是確保這類事務不會使用過多的內存。
· [NDBD]MaxNoOfConcurrentTransactions
對於叢集中的每個活動事務,必須在叢集節點之一中有1條記錄。對事務的協調任務是在各節點間進行的:在叢集中,事務記錄的總數等於任意給定節點中的事務數乘以叢集中的節點數。
事務記錄被分配給單獨的MySQL伺服器。正常情況下,對於使用叢集中任何資料表的每個連接,必須為其分配至少1條事務記錄。出於該原因,應確保叢集中的事務記錄數大於叢集中所有MySQL伺服器的並發連接數。
對於所有的叢集節點,必須將該參數設置為相同的值。
更改該參數不安全,如果這樣做,會導致叢集崩潰。當某一節點崩潰時,叢集中的一個節點(實際上是生存時間最久的節點)將為崩潰之時正在崩潰節點中運行的所有事務建立事務狀態。因此,重要的是,該節點的事務記錄數不低於失效節點中的事務記錄數。
該參數的預設值為4096.
· [NDBD]MaxNoOfConcurrentOperations
根據事務的大小和數目調整該參數的值,這個想法不錯。執行僅包含少量操作且不涉及很多記錄的事務時,不需要將該參數設置得很高。但在執行涉及大量記錄的大事務時,需要將該參數設置得較高。
對於每次事務更新的叢集數據,均會保存記錄,並會將它們保存在事務協調器中以及執行實際更新的節點中。這些記錄包含所需的狀態訊息,這類訊息可用於為回滾操作找到UNDO記錄,用於鎖定查詢或其他目的。
該參數應被設置為:事務中同時更新的記錄數除以叢集數據節點的數目。例如,在包含4個數據節點的叢集中,如果預期處理的、使用事務的並發更新數為1000000,就應將該值設置為1000000 / 4 = 250000。
設置鎖定的讀請求也會導致操作記錄的建立。在單獨節點內也會分配一些額外的空間,以便處理在節點間分配不完美的問題。
當查詢使用唯一性哈希索引時,對於事務中的每條記錄,實際上將使用兩條操作記錄。第1條記錄代資料表在索引資料表中的讀,第2條記錄負責處理基資料表上的操作。
該參數的預設值為32768.
該參數實際上處理的是能分別配置的兩個值。第1個值指定了將多少操作記錄放到事務協調器中,第2個值指定了多少操作記錄是資料庫的本地記錄。
對於在8節點叢集上執行的特大事務,它要求事務協調器中的操作記錄數不少於事務中涉及的讀取、更新和刪除次數。然而,叢集中的操作記錄分佈在所有的8個節點上。因此,如果有必要為特大事務配置系統,良好的方法是分別配置該參數的兩個部分。MaxNoOfConcurrentOperations總會被用於計算節點的事務協調器部分中的操作記錄數。
應瞭解操作記錄對內存的要求,這點也很重要。每記錄約消耗1KB。
· [NDBD]MaxNoOfLocalOperations
預設情況下,將按照1.1 * MaxNoOfConcurrentOperations計算該參數,它適合於具有很多並發事務但不存在特大事務的系統。如果需要在某一時間處理特大事務而且有很多節點,最好通過明確指定該參數以覆蓋預設值。
事務臨時儲存
下一組參數用於決定執行作為叢集事務組成部分的查詢時所需的臨時儲存空間。查詢完成後將釋放所有記錄,叢集將等待提交或回滾事件。
對於大多數情況,這些參數的預設值是恰當的。但是,如果需要支援涉及大量行或操作的事務,用戶或許應增大這些參數的值,以便在系統中獲得更好的平行性。對於需要相對較少事務的應用程式,用戶可降低這些參數的值,以便節省內存。
· [NDBD]MaxNoOfConcurrentIndexOperations
對於使用唯一性哈希索引的查詢,在查詢執行期間,將使用操作記錄的另一個臨時集合。該參數用於設置記錄池的大小。因此,僅當執行查詢的某一部分時才會分配該記錄,一旦該部分執行完成,將釋放記錄。對於處理放棄和提交所需的狀態,它是由正常的操作記錄負責處理的,這類記錄的池大小由參數MaxNoOfConcurrentOperations設置。
該參數的預設值為8192。只有在極其罕見的情況下,需要使用唯一性哈希索引執行極高的並行操作時,才有必要增大該值。如果DBA(資料庫管理員)確信該叢集不需要高的並行操作,可以使用較小的值並節省內存。
· [NDBD]MaxNoOfFiredTriggers
MaxNoOfFiredTriggers的預設值是4000,它足以應付大多數情況。在某些情況下,如果DBA認為在叢集中對並行操作的要求並不高,甚至還能降低它。
執行會影響唯一哈希索引的操作時,將建立記錄。在具有哈希索引的資料表中插入或刪除記錄時,或更新作為唯一哈希索引組成部分的列時,均會觸發索引資料表中的插入或刪除操作。所獲得的記錄用於代資料表該索引資料表操作,同時等待促使其完成的初始操作。該操作的時間很短,但對於在基資料表(包含唯一哈希索引)上有很多並發寫操作的情形,仍需要在記錄池中有大量的記錄。
· [NDBD]TransactionBufferMemory
該參數影響的內存用於跟蹤更新索引資料表和讀取唯一索引時執行的操作。該內存用於保存關於這類操作的鍵和列訊息。幾乎不需要更改該參數的預設值。
正常的讀和寫操作使用類似的緩衝區,其使用時間甚至更短。編譯時間參數ZATTRBUF_FILESIZE(在ndb/src/kernel/blocks/Dbtc/Dbtc.hpp中)被設為4000*128字節(500KB)。用於 鍵訊息的類似緩衝區,ZDATABUF_FILESIZE(也在Dbtc.hpp中)包含4000 * 16 = 62.5KB的緩衝空間。Dbtc是用於處理事務協調的模塊。
掃瞄和緩衝
在Dblqh模塊中(在ndb/src/kernel/blocks/Dblqh/Dblqh.hpp內)有很多附加參數,這些參數會影響讀和寫操作。這些參數包括:ZATTRINBUF_FILESIZE,預設值為10000*128字節(1250KB);以及ZDATABUF_FILE_SIZE,預設的緩衝空間大小為10000*16字節(約156KB)。到目前為止,沒有任何跡象表明應增加這類編譯時間限制參數的值,無論是用戶報告還是我們自己的大量測試。
TransactionBufferMemory的預設值是1MB。
· [NDBD]MaxNoOfConcurrentScans
該參數用於控制可在叢集中執行的並行掃瞄的數目。每個事務協調程式均能處理為該參數定義的並行掃瞄。對於每次執行的掃瞄查詢,將以並行方式掃瞄所有分區。每次分區掃瞄將使用分區所在節點內的掃瞄記錄,記錄數等於該參數的值乘以節點數。叢集應能支援從叢集內所有節點同時執行的MaxNoOfConcurrentScans掃瞄。
掃瞄實際上是在兩種情況下執行的。第1種情況是,處理查詢時不存在哈希或有序索引,在該情況下,查詢是通過執行全資料表掃瞄進行的。第2種情況是,沒有支援查詢的哈希索引,但存在有序索引。使用有序索引意味著將執行並發範圍掃瞄。由於順序僅保存在本地分區上,需要在所有分區上執行索引掃瞄。
MaxNoOfConcurrentScans的預設值是256。最大值為500。
該參數指定了事務協調器中的可能掃瞄數。如果未提供本地掃瞄記錄的數目,會對其進行計算,等於MaxNoOfConcurrentScans乘以系統中數據節點的數目。
· [NDBD]MaxNoOfLocalScans
如果很多掃瞄不是完全並行化的,指定本地掃瞄記錄的數目。
· [NDBD]BatchSizePerLocalScan
該參數用於計算鎖定記錄的數目,要想處理很多並發掃瞄操作,需要這類記錄。
預設值是64,該值與SQL節點中定義的ScanBatchSize關係密切。
· [NDBD]LongMessageBuffer
這是用於在單獨節點內和節點之間傳遞消息的內部緩衝。儘管幾乎不需要改變它,但它仍是可配置的。預設情況下,它被設置為1MB。
日誌和Checkpointing
· [NDBD]NoOfFragmentLogFiles
該參數用於設置節點的REDO日誌檔案的大小。REDO日誌檔案是按循環方式組織的。第1個和最後1個日誌檔案(有時也分別稱為「頭」日誌檔案和「尾」日誌檔案)不應相遇,這點極其重要,當它們彼此過於接近時,由於缺少新日誌記錄的空間,節點將開始放棄所有事務,包括更新。
自插入日誌記錄開始,在三個本地檢查點完成之前,不會刪除REDO日誌記錄。檢查點的頻率由其自己的配置參數集決定,請參見本章的相應部分。
預設的參數值為8,它資料表示有8個集合,每個集合有4個16MB檔案,總容量為512MB。換句話講,REDO日誌空間必須按64MB的塊大小分配。在需要大量更新的情況下,可能需要將NoOfFragmentLogFiles的值增加到300或更高,以便為REDO日誌提供足夠的空間。
如果checkpointing很慢,並有很多對資料庫的寫操作以至於日誌檔案已滿,而且在沒有jeapo rdising恢復功能的情況下無法截斷日誌尾部,那麼所有的更新日誌均將被放棄,並給出錯誤代碼410或缺少臨時日誌空間。該狀況將一直持續,直至完成了檢查點操作並能將日誌尾部向前移動為止。
· [NDBD]MaxNoOfSavedMessages
該參數用於設置跟蹤檔案的最大數目,在覆蓋舊檔案之前,將保留這些跟蹤檔案。無論出於何種原因,當節點崩潰時將建立跟蹤檔案。
預設為25個跟蹤檔案。
元數據對像
下一組參數為元數據對像定義了池的大小,可用於定義最大屬性數,資料表,索引,索引使用的觸發程式對象,事件,以及叢集之間的複製。注意,這些參數僅是對叢集的「建議」,任何未指定的參數均將採用其預設值。
· [NDBD]MaxNoOfAttributes
定義了可在叢集中定義的屬性數目。
該參數的預設值為1000,最小的可能值為32。沒有最大值限制。對於每一屬性,每節點約需200字節的儲存空間,這是應為,所有的元數據將完整地複製到伺服器上。
設置MaxNoOfAttributes時,應實現準備好打算在將來執行的任何ALTER TABLE命令,這點很重要。這是因為下述事實,在叢集資料表上執行ALTER TABLE的過程中,所使用的屬性數目是原始資料表中的3倍。例如,如果某一資料表需要100個屬性,而且您打算在以後更改它,那麼就需要將MaxNoOfAttributes的值設為300。有一個良好的經驗規則,如果您能在不出現問題的情況下建立所有所需的資料表,請將最大資料表中屬性數目的兩倍加到MaxNoOfAttributes上。完成該設置後,應通過執行實際的ALTER TABLE操作,驗證該數目是足夠的。如果失敗,將原始值的倍數加到MaxNoOfAttributes上,並再次測試。
· [NDBD]MaxNoOfTables
資料表對象是為每個資料表、唯一哈希索引和有序索引分配的。該參數為作為整體的叢集設置了最大資料表對像數目。
對於具有BLOB數據類型的每個屬性,將使用額外的資料表來保存大部分BLOB數據。定義資料表的總數時,必須將這些資料表考慮在內。
該參數的預設值為128。最小值為8,最大值為1600。每個資料表對像每節點約需20KB的空間。
· [NDBD]MaxNoOfOrderedIndexes
對於叢集中的每個有序索引,將分配1個對象,該對像描述了編入索引的是什麼以及其儲存段。預設情況下,每個這