在本節中,我們提供一個詳細範例,說明如何線上新增 NDB Cluster 資料節點,從一個單一節點群組中具有 2 個資料節點的 NDB Cluster 開始,最後得到一個在 2 個節點群組中具有 4 個資料節點的叢集。
起始組態。為了說明起見,我們假設一個最小的組態,並且叢集使用僅包含以下資訊的 config.ini
檔案
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
我們在資料節點 ID 和其他節點之間的序列中留下了間隙。這使得稍後更容易將尚未使用的節點 ID 指派給新加入的資料節點。
我們還假設您已經使用適當的命令列或 my.cnf
選項啟動了叢集,並且在管理客戶端中執行 SHOW
會產生類似於此處顯示的輸出
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (8.4.0-ndb-8.4.0, Nodegroup: 0, *)
id=2 @198.51.100.2 (8.4.0-ndb-8.4.0, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (8.4.0-ndb-8.4.0)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (8.4.0-ndb-8.4.0)
id=21 @198.51.100.21 (8.4.0-ndb-8.4.0)
最後,我們假設叢集包含一個 NDBCLUSTER
表格,其建立方式如下
USE n;
CREATE TABLE ips (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
country_code CHAR(2) NOT NULL,
type CHAR(4) NOT NULL,
ip_address VARCHAR(15) NOT NULL,
addresses BIGINT UNSIGNED DEFAULT NULL,
date BIGINT UNSIGNED DEFAULT NULL
) ENGINE NDBCLUSTER;
本節稍後顯示的記憶體使用量和相關資訊是在將約 50000 列插入此表格後產生的。
步驟 1:更新組態檔。在文字編輯器中開啟叢集全域組態檔,並新增對應於 2 個新資料節點的 [ndbd]
區段。(我們為這些資料節點提供 ID 3 和 4,並假設它們將在位址為 198.51.100.3 和 198.51.100.4 的主機上執行。)新增新的區段後,config.ini
檔案的內容應如下所示,其中以粗體顯示新增至檔案的內容
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[ndbd]
Id = 3
HostName = 198.51.100.3
[ndbd]
Id = 4
HostName = 198.51.100.4
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
進行必要的變更後,儲存檔案。
步驟 2:重新啟動管理伺服器。重新啟動叢集管理伺服器需要您發出個別命令來停止管理伺服器,然後再次啟動它,如下所示
使用管理客戶端
STOP
命令停止管理伺服器,如下所示ndb_mgm> 10 STOP Node 10 has shut down. Disconnecting to allow Management Server to shutdown $>
由於關閉管理伺服器會導致管理客戶端終止,您必須從系統 Shell 啟動管理伺服器。為簡單起見,我們假設
config.ini
與管理伺服器二進制檔案位於同一目錄中,但在實際情況中,您必須提供組態檔案的正確路徑。您還必須提供--reload
或--initial
選項,以便管理伺服器從檔案而非其組態快取中讀取新組態。如果您的 Shell 目前目錄也與管理伺服器二進制檔案所在的目錄相同,則您可以如下所示叫用管理伺服器$> ndb_mgmd -f config.ini --reload 2008-12-08 17:29:23 [MgmSrvr] INFO -- NDB Cluster Management Server. 8.4.0-ndb-8.4.0 2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'
如果您在重新啟動 ndb_mgm 程序後在管理客戶端中檢查 SHOW
的輸出,您現在應該會看到類似如下的內容
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (8.4.0-ndb-8.4.0, Nodegroup: 0, *)
id=2 @198.51.100.2 (8.4.0-ndb-8.4.0, Nodegroup: 0)
id=3 (not connected, accepting connect from 198.51.100.3)
id=4 (not connected, accepting connect from 198.51.100.4)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (8.4.0-ndb-8.4.0)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (8.4.0-ndb-8.4.0)
id=21 @198.51.100.21 (8.4.0-ndb-8.4.0)
步驟 3:執行現有資料節點的滾動重新啟動。此步驟可以在叢集管理客戶端中完全使用 RESTART
命令完成,如下所示
ndb_mgm> 1 RESTART
Node 1: Node shutdown initiated
Node 1: Node shutdown completed, restarting, no start.
Node 1 is being restarted
ndb_mgm> Node 1: Start initiated (version 8.4.0)
Node 1: Started (version 8.4.0)
ndb_mgm> 2 RESTART
Node 2: Node shutdown initiated
Node 2: Node shutdown completed, restarting, no start.
Node 2 is being restarted
ndb_mgm> Node 2: Start initiated (version 8.4.0)
ndb_mgm> Node 2: Started (version 8.4.0)
在發出每個
命令後,請等待管理客戶端報告 X
RESTART節點
,然後再繼續進行任何操作。X
:已啟動(版本 ...)
您可以藉由檢查 mysql 客戶端中的 ndbinfo.nodes
表格來驗證是否已使用更新的組態重新啟動所有現有的資料節點。
步驟 4:執行所有叢集 API 節點的滾動重新啟動。使用 mysqladmin shutdown,然後使用 mysqld_safe(或其他啟動指令碼)關閉並重新啟動叢集中作為 SQL 節點的每個 MySQL 伺服器。這應該與此處顯示的內容類似,其中 password
是給定 MySQL 伺服器執行個體的 MySQL root
密碼
$> mysqladmin -uroot -ppassword shutdown
081208 20:19:56 mysqld_safe mysqld from pid file
/usr/local/mysql/var/tonfisk.pid ended
$> mysqld_safe --ndbcluster --ndb-connectstring=198.51.100.10 &
081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
081208 20:20:06 mysqld_safe Starting mysqld daemon with databases
from /usr/local/mysql/var
當然,確切的輸入和輸出取決於 MySQL 安裝在系統上的方式和位置,以及您選擇啟動它的選項(以及是否在 my.cnf
檔案中指定某些或所有這些選項)。
步驟 5:執行新資料節點的初始啟動。從新資料節點的主機上的系統 Shell 中,使用 --initial
選項,如下所示啟動資料節點
$> ndbd -c 198.51.100.10 --initial
與重新啟動現有資料節點的情況不同,您可以同時啟動新的資料節點;您不需要等待一個完成啟動,然後再啟動另一個。
請等待兩個新的資料節點都啟動後再繼續執行下一步。新資料節點啟動後,您可以在管理客戶端 SHOW
命令的輸出中看到它們尚未屬於任何節點群組(此處以粗體顯示)
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (8.4.0-ndb-8.4.0, Nodegroup: 0, *)
id=2 @198.51.100.2 (8.4.0-ndb-8.4.0, Nodegroup: 0)
id=3 @198.51.100.3 (8.4.0-ndb-8.4.0, no nodegroup)
id=4 @198.51.100.4 (8.4.0-ndb-8.4.0, no nodegroup)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (8.4.0-ndb-8.4.0)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (8.4.0-ndb-8.4.0)
id=21 @198.51.100.21 (8.4.0-ndb-8.4.0)
步驟 6:建立新的節點群組。您可以在叢集管理客戶端中發出 CREATE NODEGROUP
命令來執行此操作。此命令將要包含在新節點群組中的資料節點的節點 ID 以逗號分隔清單作為引數,如下所示
ndb_mgm> CREATE NODEGROUP 3,4
Nodegroup 1 created
再次發出 SHOW
,您可以驗證資料節點 3 和 4 已加入新的節點群組(再次以粗體顯示)
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (8.4.0-ndb-8.4.0, Nodegroup: 0, *)
id=2 @198.51.100.2 (8.4.0-ndb-8.4.0, Nodegroup: 0)
id=3 @198.51.100.3 (8.4.0-ndb-8.4.0, Nodegroup: 1)
id=4 @198.51.100.4 (8.4.0-ndb-8.4.0, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (8.4.0-ndb-8.4.0)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (8.4.0-ndb-8.4.0)
id=21 @198.51.100.21 (8.4.0-ndb-8.4.0)
步驟 7:重新分配叢集資料。建立節點群組時,現有的資料和索引不會自動分配到新節點群組的資料節點,您可以藉由在管理客戶端中發出適當的 REPORT
命令來看到
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(177 32K pages of total 3200)
Node 1: Index usage is 0%(108 8K pages of total 12832)
Node 2: Data usage is 5%(177 32K pages of total 3200)
Node 2: Index usage is 0%(108 8K pages of total 12832)
Node 3: Data usage is 0%(0 32K pages of total 3200)
Node 3: Index usage is 0%(0 8K pages of total 12832)
Node 4: Data usage is 0%(0 32K pages of total 3200)
Node 4: Index usage is 0%(0 8K pages of total 12832)
藉由使用 ndb_desc 和 -p
選項(這會使輸出包含分割資訊),您可以看到表格仍然僅使用 2 個分割區(在輸出的 每個分割區資訊
區段中,此處以粗體顯示)
$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 1
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 340
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 26086 26086 1572864 557056
1 26329 26329 1605632 557056
您可以藉由在 mysql 客戶端中為每個 NDB
表格執行 ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION
陳述式,來使資料在所有資料節點之間重新分配。
ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION
不適用於使用 MAX_ROWS
選項建立的表格。請改用 ALTER TABLE ... ALGORITHM=INPLACE, MAX_ROWS=...
來重新組織此類表格。
請記住,使用 MAX_ROWS
設定每個表格的分割區數量已過時,您應該改用 PARTITION_BALANCE
;如需更多資訊,請參閱 章節 15.1.20.12,「設定 NDB 註解選項」。
在發出 ALTER TABLE ips ALGORITHM=INPLACE, REORGANIZE PARTITION
陳述式後,您可以使用 ndb_desc 看到此表格的資料現在使用 4 個分割區儲存,如下所示(輸出中的相關部分以粗體顯示)
$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 16777217
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 341
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 4
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 12981 52296 1572864 557056
1 13236 52515 1605632 557056
2 13105 13105 819200 294912
3 13093 13093 819200 294912
通常,ALTER TABLE
會與分割區識別碼列表和一組分割區定義一起使用,以便為已明確分割的表格建立新的分割方案。在此處使用它是為了將資料重新分配到新的 NDB Cluster 節點群組,這是一個例外;當以這種方式使用時,table_name
[ALGORITHM=INPLACE,] REORGANIZE PARTITIONREORGANIZE PARTITION
後面不會有其他關鍵字或識別碼。
更多資訊,請參閱第 15.1.9 節「ALTER TABLE 陳述式」。
此外,對於每個表格,ALTER TABLE
陳述式之後應接著 OPTIMIZE TABLE
以回收浪費的空間。您可以使用以下針對 Information Schema TABLES
表格的查詢,取得所有 NDBCLUSTER
表格的列表
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'NDBCLUSTER';
無論用於建立表格的 CREATE TABLE
陳述式(或用於將現有表格從不同的儲存引擎轉換的 ALTER TABLE
陳述式)在其 ENGINE
選項中是否使用 NDB
或 NDBCLUSTER
,NDB Cluster 表格的 INFORMATION_SCHEMA.TABLES.ENGINE
值始終為 NDBCLUSTER
。
您可以在執行這些陳述式後,於 ALL REPORT MEMORY
的輸出中看到資料和索引現在已在所有叢集資料節點之間重新分配,如下所示
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(176 32K pages of total 3200)
Node 1: Index usage is 0%(76 8K pages of total 12832)
Node 2: Data usage is 5%(176 32K pages of total 3200)
Node 2: Index usage is 0%(76 8K pages of total 12832)
Node 3: Data usage is 2%(80 32K pages of total 3200)
Node 3: Index usage is 0%(51 8K pages of total 12832)
Node 4: Data usage is 2%(80 32K pages of total 3200)
Node 4: Index usage is 0%(50 8K pages of total 12832)
由於一次只能在 NDBCLUSTER
表格上執行一個 DDL 操作,因此您必須等待每個 ALTER TABLE ... REORGANIZE PARTITION
陳述式完成,才能發出下一個。
對於在新增新的資料節點後建立的 NDBCLUSTER
表格,沒有必要發出 ALTER TABLE ... REORGANIZE PARTITION
陳述式;新增至這些表格的資料會自動分散到所有資料節點之間。然而,在新增新節點之前存在的 NDBCLUSTER
表格中,在這些表格使用 ALTER TABLE ... REORGANIZE PARTITION
重新組織之前,無論是現有還是新的資料都不會使用新的節點進行分散。
替代程序,無需滾動重新啟動。 可以透過設定額外的資料節點,但在首次啟動叢集時不啟動它們,來避免滾動重新啟動的需求。我們假設,如同之前一樣,您希望從一個節點群組中的兩個資料節點(節點 1 和 2)開始,然後透過新增由節點 3 和 4 組成的第二個節點群組,將叢集擴展到四個資料節點。
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[ndbd]
Id = 3
HostName = 198.51.100.3
Nodegroup = 65536
[ndbd]
Id = 4
HostName = 198.51.100.4
Nodegroup = 65536
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
稍後要上線的資料節點(節點 3 和 4)可以使用 NodeGroup = 65536
進行設定,在這種情況下,節點 1 和 2 可以像這樣啟動
$> ndbd -c 198.51.100.10 --initial
管理伺服器會將以 NodeGroup = 65536
設定的資料節點視為您已在使用 --nowait-nodes=3,4
啟動節點 1 和 2 之後,等待一段由 StartNoNodeGroupTimeout
資料節點組態參數的設定所決定的時間。預設情況下,此值為 15 秒(15000 毫秒)。
StartNoNodegroupTimeout
對於叢集中的所有資料節點必須相同;因此,您應該始終在 config.ini
檔案的 [ndbd default]
區段中設定它,而不是針對個別資料節點。
當您準備好新增第二個節點群組時,您只需要執行以下額外步驟
啟動資料節點 3 和 4,針對每個新節點呼叫一次資料節點程序
$> ndbd -c 198.51.100.10 --initial
在管理用戶端中發出適當的
CREATE NODEGROUP
命令ndb_mgm> CREATE NODEGROUP 3,4
在 mysql 用戶端中,針對每個現有的
NDBCLUSTER
表格發出ALTER TABLE ... REORGANIZE PARTITION
和OPTIMIZE TABLE
陳述式。(如本節其他地方所述,在完成此操作之前,現有的 NDB Cluster 表格無法使用新節點進行資料分散。)