### 第17章:MySQL簇
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/](http://www.mysql.com/products/cluster/)。
或許你也希望使用MySQL AB提供的兩種額外資源:
·???????? MySQL簇[郵件列表](http://lists.mysql.com/cluster)。
·???????? MySQL用戶論壇上的[簇主題區](http://forums.mysql.com/list.php?25)。
關于簇的一些常見問題,請參見[17.10節,“MySQL簇常見問題解答”](# "17.10.?MySQL Cluster FAQ")。如果你是MySQL簇的新手,請閱讀我方開發人員區的文章[如何為兩個服務器設置MySQL簇](http://dev.mysql.com/tech-resources/articles/mysql-cluster-for-two-servers.html),這會有所幫助。
### 17.1.?MySQL簇概述
_MySQL簇_是一種技術,該技術允許在無共享的系統中部署“內存中”數據庫的簇。通過無共享體系結構,系統能夠使用廉價的硬件,而且對軟硬件無特殊要求。此外,由于每個組件有自己的內存和磁盤,不存在單點故障。
MySQL簇將標準的MySQL服務器與名為NDB的“內存中”簇式存儲引擎集成了起來。在我們的文檔中,術語NDB指的是與存儲引擎相關的設置部分,而術語“MySQL簇”指的是MySQL和NDB存儲引擎的組合。
MySQL簇由一組計算機構成,每臺計算機上均運行著多種進程,包括MySQL服務器,NDB簇的數據節點,管理服務器,以及(可能)專門的數據訪問程序。關于簇中這些組件的關系,請參見下圖:

所有這些程序一起構成了MySQL簇。將數據保存到NDB簇存儲引擎中時,表將保存在數據節點內。能夠從簇中所有其他MySQL服務器直接訪問這些表。因此,在將數據保存在簇內的工資表應用程序中,如果某一應用程序更新了1位雇員的工資,所有查詢該數據的其他MySQL服務器能立刻發現這種變化。
對于MySQL簇,保存在數據節點內的數據可被映射,簇能夠處理單獨數據節點的故障,除了少數事務將因事務狀態丟失而被放棄外,不會產生其他影響。由于事務性應用程序能夠處理事務失敗事宜,因而它不是問題源。
通過將MySQL簇引入開放源碼世界,MySQL為所有需要它的人員提供了具有高可用性、高性能和可縮放性的簇數據管理。
### 17.2.?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簇。
·???????? **管理客戶端**:這類客戶端與管理服務器相連,并提供了優雅地啟動和停止節點、啟動和停止消息跟蹤(僅對調試版本)、顯示節點版本和狀態、啟動和停止備份等的命令。
### 17.3.?多計算機的簡單基礎知識
[ 17.3.1. 硬件、軟件和聯網](#)[ 17.3.2. 安裝](#)[ 17.3.3. 配置](#)[ 17.3.4. 首次啟動](#)[ 17.3.5. 加載示例數據并執行查詢](#)[ 17.3.6. 安全關閉和重啟](#)
本節介紹了如何規劃、安裝、配置和運行MySQL簇的基本知識。與[17.4節,“MySQL簇的配置”](# "17.4.?MySQL Cluster Configuration")中給出的示例不同,按照下面介紹的步驟和指南,所得的結果應是有用的MySQL簇,它滿足對數據可用性和安全防護的最低要求。
在本節中,我們介紹了下述內容:硬件和軟件要求,聯網事宜,MySQL簇的安裝,配置事宜,簇的啟動、停止和重啟,加載樣本數據庫,以及執行查詢的方法。
**基本假定**
本節作了如下假定:
1.??? 我們將建立具有4個節點的簇,每個節點位于不同的主機上,而且在典型的以太網中具有固定的網絡地址,如下所述:
<table border="1" cellpadding="0" id="table1"><tr><td> <p><strong><span>節點</span></strong></p></td> <td> <p><strong> <span>IP</span><span>地址</span></strong></p></td> </tr><tr><td> <p>管理<span>(MGM)</span>節點</p></td> <td> <p><span>192.168.0.10</span></p></td> </tr><tr><td> <p><span>MySQL</span>服務器<span>(SQL)</span>節點</p></td> <td> <p><span>192.168.0.20</span></p></td> </tr><tr><td> <p>數據<span>(NDBD)</span>節點<span>"A"</span></p></td> <td> <p><span>192.168.0.30</span></p></td> </tr><tr><td> <p>數據<span>(NDBD)</span>節點<span>"B"</span></p></td> <td> <p><span>192.168.0.40</span></p></td> </tr></table>
2.??? 通過下圖可更清楚的表明這點:
1. 
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節,“硬件、軟件和聯網”](# "17.3.1.?Hardware, Software, and Networking"))。
### 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/](http://dev.mysql.com/downloads/)。
對于節點之間的通信,簇支持采用標準拓撲方案的TCP/IP聯網,對于每臺主機的預期最低要求是1塊標準的100 Mbps以太網卡,對于作為整體的簇,還需加上交換器、網絡集線器或路由器以提供網絡連通性。我們強烈建議,應在其自己的子網內運行MySQL簇,不與非簇機器共享該子網,原因如下:
·???????? **安全性:**簇節點之間的通信未采用任何特殊加密或防護。對MySQL簇內傳輸的唯一保護方法是,在受保護的網絡上運行簇。如果打算將MySQL簇用于Web應用,簇應明確地位于防火墻后面,而且不應位于網絡的非軍事區([DMZ](http://compnetworking.about.com/cs/networksecurity/g/bldef_dmz.htm))或其他地方。
·???????? **效率:**在專有的或受保護的網絡上設置MySQL簇,這樣,簇就能獨享簇主機之間的帶寬。為MySQL簇使用單獨的交換器不僅能防止對簇數據的非法訪問,而且還能確保簇節點不受網絡上其他計算機之間信息傳輸的干擾。為了增強可靠性,可以使用雙交換器和雙卡,以防止網絡出現單點故障,對于這類通信鏈路,很多設備驅動均支持故障切換功能。
也能與MySQL簇一起使用高速SCI(規模可擴展的計算機接口),但這不是要求的。關于該協議的更多信息,以及它與MySQL簇的用法,請參見[17.7節,“使用與MySQL簇的高速互連”](# "17.7.?Using High-Speed Interconnects with MySQL Cluster")
### 17.3.2.?安裝
對于每臺運行存儲或SQL節點的MySQL簇主機計算機,必須在其上安裝MySQL-max二進制版本。對于管理節點,沒有必要安裝MySQL服務器二進制版本,但應安裝MGM服務器端口監督程序和客戶端二進制版本(分別是**ndb_mgmd**和**ndb_mgm**)。在本節中,我們介紹了為每種簇節點安裝正確的二進制版本所需的步驟。
MySQL AB提供了預編譯的二進制文件,它們支持簇,你不需要自己編譯這些文件(如果你確實需要定制的二進制文件,請參見[2.8.3節,“從開發源碼樹安裝”](# "2.8.3.?Installing from the Development Source Tree"))。因此,對于每臺簇主機,安裝進程的第一步是從[MySQL下載區](http://dev.mysql.com/downloads/)下載文件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”](# "2.4.?Installing MySQL on Linux"))。使用RPM完成安裝后,仍需對簇進行配置,請參見[17.3.3節,“配置”](# "17.3.3.?Configuration")。
**注釋:**完成安裝后,不啟動任何二進制文件。配置完所有節點后,我們將向你介紹執行這類操作的方法。
**存儲節點和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節,“配置”](# "17.3.3.?Configuration"))。
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節,“配置”](# "17.3.3.?Configuration")中,我們將為示例簇中的所有節點創建和編寫配置文件。
### 17.3.3.?配置
對于我們的4節點、4主機MySQL簇,需要編寫4個配置文件,每個節點/主機1個。
·???????? 每個數據節點或SQl節點需要1個my.cnf文件,該文件提供了兩類信息:**connectstring**(連接字符串),用于通知節點到哪里找到MGM節點;以及一行,用于通知該主機(容納數據節點的機器)上的MySQL服務器運行在NDB模式下。
關于連接字符串的更多信息,請參見[17.4.4.2節,“MySQL簇連接字符串``”](# "17.4.4.2.?The MySQL Cluster connectstring")。
·???????? 管理節點需要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/](http://dev.mysql.com/doc/)下載,它列在“示例”欄目下)。
一旦創建了所有的配置文件并指定了這些最低選項,可啟動簇,并驗證所有進程均能正常運行。關于這方面的討論,請參見[17.3.4節,“首次啟動”](# "17.3.4.?Initial Startup")。
關于可用MySQL簇配置參數以及其用法的更多信息,請參見[17.4.4節,“配置文件”](# "17.4.4.?Configuration File")和[17.4節,“MySQL簇的配置”](# "17.4.?MySQL Cluster Configuration")。關于與進行備份有關的MySQL簇配置,請參見[17.6.5.4節,“簇備份的配置”](# "17.6.5.4.?Configuration for Cluster Backup")。
**注釋:**簇管理節點的默認端口是1186,數據節點的默認端口2202。從MySQL 5.0.3開始,該限制已被放寬,簇能夠根據空閑的端口自動地為數據節點分配端口。
### 17.3.4.?首次啟動
完成配置后,啟動簇并不很困難。必須在數據節點所在的主機上分別啟動每個簇節點進程。盡管能夠按任何順序啟動節點,但我們建議,應首先啟動管理節點,然后啟動存儲節點,最后啟動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**,“管理服務器”進程”](# "17.5.3.?ndb_mgmd, the Management Server Process"))。
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節,“加載示例數據并執行查詢”](# "17.3.5.?Loading Sample Data and Performing Queries")。
### 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簇的已知限制”](# "17.8.?Known Limitations of MySQL Cluster"))。這意味著,一旦在一個數據節點上創建了世界(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訪問權限系統”](# "5.7.?The MySQL Access Privilege System")。
需要關注的是,當簇節點彼此訪問時不使用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簇存儲引擎將自動生成隱含的主鍵。(**注釋:**該隱含 鍵也將占用空間,就像任何其他的表索引一樣。由于沒有足夠的內存來容納這些自動創建的鍵,出現問題并不罕見)。
### 17.3.6.?安全關閉和重啟
要想關閉簇,可在MGM節點所在的機器上,在Shell中簡單地輸入下述命令:
shell> ndb_mgm -e shutdown
該命令將恰當地中止**ndb_mgm**、**ndb_mgmd**以及任何**ndbd**進程。使用**mysqladmin shutdown**或其他方法,可中止SQL節點。注意,這里的“-e”選項用于將命令從shell傳遞到**ndb_mgm**客戶端。請參見[4.3.1節,“在命令行上使用選項”](# "4.3.1.?Using Options on the Command Line")。
要想重啟簇,可簡單地運行下述命令:
·???????? 在管理主機上(本設置中為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節,“使用管理服務器創建備份”](# "17.6.5.2.?Using The Management Server to Create a Backup")。
要想從備份中恢復簇,需要使用**ndb_restore**命令。請參見[17.6.5.3節,“如何恢復簇備份”](# "17.6.5.3.?How to Restore a Cluster Backup")。
關于配置MySQL簇的更多信息,請參見[17.4節,“MySQL簇的配置”](# "17.4.?MySQL Cluster Configuration")。
### 17.4.?MySQL簇的配置
[ 17.4.1. 從源碼創建MySQL簇](#)[ 17.4.2. 安裝軟件](#)[ 17.4.3. MySQL簇的快速測試設置](#)[17.4.4. 配置文件](#)
作為MySQL簇組成部份的MySQL服務器僅在一個方面上與正常的(非簇式)MySQL服務器不同,它采用了NDB簇存儲引擎。該引擎也簡單地稱為NDB,這兩個術語是同義詞。
為了避免不必要的資源分配,默認情況下,在服務器的配置中將禁止NDB存儲引擎。要想啟用NDB,需要更改服務器的my.cnf配置文件,或使用“—ndbcluster”選項啟動服務器。
由于MySQL服務器是簇的一部分,它也需要知道如何訪問MGM節點,以便獲得簇配置數據。默認行為是查找本地主機上MGM節點。但是,如果需要另外指定它的位置,可在my.cnf文件或MySQL服務器命令行上進行。能夠使用NDB存儲引擎之前,至少應有一個MGM節點是可操作的,而且還應有所需的數據節點。
### 17.4.1.?從源碼創建MySQL簇
對于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節,“從開發源碼樹安裝”](# "2.8.3.?Installing from the Development Source Tree")。
### 17.4.2.?安裝軟件
在下面的數節內,假定你已熟悉了MySQL的安裝方法,在此,我們僅介紹了MySQL簇配置與不具備簇功能的MySQL配置之間的差別。如果希望了解關于后者的更多信息,請參見[第2章:安裝MySQL](# "Chapter?2.?Installing MySQL")。
如果首先運行了所有的管理和數據節點,你將發現簇配置最簡單,這或許是最花時間的配置部分。編輯my.cnf文件相對直接,在本節中,僅討論與不具備簇功能的MySQL配置不同的部分。
### 17.4.3.?MySQL簇的快速測試設置
為了幫助你熟悉基本概念,我們將介紹功能性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創建的表,將數據保存到簇中。
### 17.4.4.?配置文件
[ 17.4.4.1. MySQL簇的配置示例](#)[ 17.4.4.2. MySQL簇連接字符串``](#)[ 17.4.4.3. 定義構成MySQL簇的計算機](#)[ 17.4.4.4. 定義MySQL簇管理服務器](#)[ 17.4.4.5. 定義MySQL簇數據節點](#)[ 17.4.4.6. 定義MySQL簇內的SQL節點](#)[ 17.4.4.7. MySQL簇TCP/IP連接](#)[17.4.4.8. 使用直接連接的MySQL簇TCP/IP連接](#)[ 17.4.4.9. MySQL簇共享內存連接](#)[ 17.4.4.10. MySQL簇SCI傳輸連接](#)
配置MySQL簇需要與兩個文件打交道:
·???????? my.cnf:為所有的MySQL簇可執行文件指定了選項。你應熟悉了前面介紹的使用MySQL的方式,通過運行在簇中的每個可執行文件,必須能夠訪問該文件。
·???????? config.ini:該文件僅由MySQL簇管理服務器讀取,隨后管理服務器會將包含該文件的信息分配給簇中的所有進程。config.ini文件包含對簇中各節點的描述。包括數據節點的配置參數,以及簇中所有節點間連接的配置參數。
我們正在不斷改進簇配置,并努力簡化該進程。盡管我們將盡量維護向后兼容性,但在某些時候,可能也需要引入不兼容的變動。在這種情況下,我們將盡量讓簇用戶事先了解該變動是否是向后兼容的。如果你發現了尚未記錄在文檔中的這類變動,請使用我們的[缺陷數據庫](http://bugs.mysql.com/)通報它。
#### 17.4.4.1.?MySQL簇的配置示例
為了支持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簇連接字符串``”](# "17.4.4.2.?The MySQL Cluster connectstring"))。
# 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值。所有的簇參數名稱均區分大小寫。
#### 17.4.4.2.?MySQL簇連接字符串``
除了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](http://www.iana.org/assignments/port-numbers))。
通過列出多個<host-specification>值,能夠指定數個冗余管理服務器。簇節點將按照指定的順序嘗試連接到每臺主機上的連續管理服務器,直至成功建立起連接為止。
有多種指定連接字符串的不同方法:
·???????? 每個可執行文件有自己的命令行選項,使用它,能夠在啟動時指定管理服務器(關于各可執行程序的介紹,請參見相應的文檔)。
·???????? 也能一次性地為簇中的所有節點設置連接字符串,方法是將其放在管理服務器的my.cnf文件的[mysql_cluster]部分。
·???????? 為了向后兼容性,還提供了兩種其他選項,其使用的語法相同:
1.??? 設置NDB_CONNECTSTRING環境變量,使之包含connectstring(連接字符串)。
2.??? 將針對各可執行文件的connectstring(連接字符串)寫入名為Ndb.cfg的文本文件,并將該文件放在可執行文件的啟動目錄下。
但是,這些方法目前已不再受重視,對于新安裝,不應使用它們。
指定連接字符串時,推薦的方法是在命令行上設置它,或為每個可執行文件在my.cnf文件中設置它。
#### 17.4.4.3.?定義構成MySQL簇的計算機
除了用于避免為系統中的每個節點定義主機名外,[COMPUTER]部分沒有實際的重要意義。這里所提到的所有參數都是需要的。
·???????? [COMPUTER]Id
這是整數值,用于引用位于配置文件中別處的主機計算機。
·???????? [COMPUTER]HostName
這是計算機的主機名或IP地址。
#### 17.4.4.4.?定義MySQL簇管理服務器
[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參數覆蓋它,請參見本節前面的討論)。
#### 17.4.4.5.?定義MySQL簇數據節點
[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。
**事務參數**
下面討論的三個參數十分重要,這是因為,它們
- 前言
- 1. 一般信息
- 2. 安裝MySQL
- 3. 教程
- 4. MySQL程序概述
- 5. 數據庫管理
- 6. MySQL中的復制
- 7. 優化
- 8. 客戶端和實用工具程序
- 9. 語言結構
- 10. 字符集支持
- 11. 列類型
- 12. 函數和操作符
- 13. SQL語句語法
- 14. 插件式存儲引擎體系結構
- 15. 存儲引擎和表類型
- 16. 編寫自定義存儲引擎
- 17. MySQL簇
- 18. 分區
- 19. MySQL中的空間擴展
- 20. 存儲程序和函數
- 21. 觸發程序
- 22. 視圖
- 23. INFORMATION_SCHEMA信息數據庫
- 24. 精度數學
- 25. API和庫
- 26. 連接器
- 27. 擴展MySQL
- A. 問題和常見錯誤
- B. 錯誤代碼和消息
- C. 感謝
- D. MySQL變更史
- E. 移植到其他系統
- F. 環境變量
- G. MySQL正則表達式
- H. MySQL中的限制
- I. 特性限制
- J. GNU通用公共許可
- K. MySQL FLOSS許可例外
- 索引