文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  線上新增 NDB Cluster 資料節點:詳細範例

25.6.7.3 線上新增 NDB Cluster 資料節點:詳細範例

在本節中,我們提供詳細範例,說明如何線上新增 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  (9.0.0-ndb-9.0.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (9.0.0-ndb-9.0.0, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (9.0.0-ndb-9.0.0)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (9.0.0-ndb-9.0.0)
id=21   @198.51.100.21  (9.0.0-ndb-9.0.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 列插入此表格後產生的。

注意

在此範例中,我們顯示單執行緒的 ndbd 用於資料節點程序。如果您使用多執行緒的 ndbmtd,也可以套用此範例,只要在後續步驟中出現 ndbd 的地方,都將其替換為 ndbmtd

步驟 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:重新啟動管理伺服器。重新啟動叢集管理伺服器需要您發出個別命令來停止管理伺服器,然後再次啟動它,如下所示

  1. 使用管理用戶端 STOP 命令停止管理伺服器,如下所示

    ndb_mgm> 10 STOP
    Node 10 has shut down.
    Disconnecting to allow Management Server to shutdown
    
    $>
  2. 因為關閉管理伺服器會導致管理用戶端終止,您必須從系統殼層啟動管理伺服器。為了簡單起見,我們假設 config.ini 與管理伺服器二進位檔位於相同的目錄中,但在實務上,您必須提供組態檔的正確路徑。您也必須提供 --reload--initial 選項,讓管理伺服器從檔案而不是其設定快取中讀取新設定。如果您的殼層目前目錄也與管理伺服器二進位檔所在的目錄相同,您就可以如下所示叫用管理伺服器

    $> ndb_mgmd -f config.ini --reload
    2008-12-08 17:29:23 [MgmSrvr] INFO     -- NDB Cluster Management Server. 9.0.0-ndb-9.0.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  (9.0.0-ndb-9.0.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (9.0.0-ndb-9.0.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  (9.0.0-ndb-9.0.0)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (9.0.0-ndb-9.0.0)
id=21   @198.51.100.21  (9.0.0-ndb-9.0.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 9.0.0)
Node 1: Started (version 9.0.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 9.0.0)

ndb_mgm> Node 2: Started (version 9.0.0)
重要事項

在發出每個 X RESTART 命令後,請等待到管理用戶端報告 Node X: Started (version ...) 之後,再繼續進行任何後續步驟。

您可以透過檢查 ndbinfo.nodes 表格,來驗證是否已使用更新的設定重新啟動所有現有的資料節點。此表格位於 mysql 用戶端中。

步驟 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:初始啟動新的資料節點。從新資料節點的每個主機上的系統殼層,如下所示啟動資料節點,並使用 --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  (9.0.0-ndb-9.0.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (9.0.0-ndb-9.0.0, Nodegroup: 0)
id=3    @198.51.100.3  (9.0.0-ndb-9.0.0, no nodegroup)
id=4    @198.51.100.4  (9.0.0-ndb-9.0.0, no nodegroup)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (9.0.0-ndb-9.0.0)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (9.0.0-ndb-9.0.0)
id=21   @198.51.100.21  (9.0.0-ndb-9.0.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  (9.0.0-ndb-9.0.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (9.0.0-ndb-9.0.0, Nodegroup: 0)
id=3    @198.51.100.3  (9.0.0-ndb-9.0.0, Nodegroup: 1)
id=4    @198.51.100.4  (9.0.0-ndb-9.0.0, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (9.0.0-ndb-9.0.0)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (9.0.0-ndb-9.0.0)
id=21   @198.51.100.21  (9.0.0-ndb-9.0.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)

透過使用帶有 -p 選項的 ndb_desc,此選項會讓輸出包含分割資訊,您可以看到此表格仍然僅使用 2 個分割區(在輸出的 Per partition info 區段中,這裡以粗體文字顯示)

$> 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

您可以針對每個 NDB 表格,在 mysql 用戶端中執行 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 table_name [ALGORITHM=INPLACE,] REORGANIZE PARTITION 會搭配分割區識別符號列表和一組分割區定義,為已明確分割的表格建立新的分割方案。這裡使用它將資料重新分配到新的 NDB Cluster 節點群組是個例外;以這種方式使用時,REORGANIZE 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 選項中使用 NDBNDBCLUSTER,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] 區段中設定它,而不是針對個別資料節點。

當您準備好新增第二個節點群組時,您只需要執行下列額外步驟

  1. 啟動資料節點 3 和 4,為每個新節點調用一次資料節點程序

    $> ndbd -c 198.51.100.10 --initial
  2. 在管理用戶端中發出適當的 CREATE NODEGROUP 命令

    ndb_mgm> CREATE NODEGROUP 3,4
  3. mysql 用戶端中,為每個現有的 NDBCLUSTER 表格發出 ALTER TABLE ... REORGANIZE PARTITIONOPTIMIZE TABLE 陳述式。(如本節其他地方所述,在執行此操作之前,現有的 NDB Cluster 表格無法使用新的節點進行資料分配。)