Documentation Home
MySQL 8.0 参考手册  / 第 23 章 MySQL NDB Cluster 8.0  / 23.6 NDB Cluster的管理  / 23.6.7 在线添加 NDB Cluster 数据节点  /  23.6.7.3 在线添加 NDB Cluster 数据节点:详细示例

23.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
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.32-ndb-8.0.32, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.32-ndb-8.0.32, Nodegroup: 0)

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

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.32-ndb-8.0.32)
id=21   @198.51.100.21  (8.0.32-ndb-8.0.32)

最后,我们假设集群包含一个 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 ,您也可以应用此示例,方法是在接下来的步骤中出现的任何地方用ndbmtd替换 ndbd

第一步:更新配置文件。  在文本编辑器中打开集群全局配置文件并添加[ndbd]与 2 个新数据节点对应的部分。(我们给这些数据节点 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. 因为关闭管理服务器会导致管理客户端终止,所以您必须从系统 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.0.32-ndb-8.0.32
    2008-12-08 17:29:23 [MgmSrvr] INFO     -- Reading cluster configuration from 'config.ini'

如果您 在重新启动ndb_mgmSHOW进程后检查管理客户端中的输出,您现在应该看到如下内容:

-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.32-ndb-8.0.32, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.32-ndb-8.0.32, 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.0.32-ndb-8.0.32)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.32-ndb-8.0.32)
id=21   @198.51.100.21  (8.0.32-ndb-8.0.32)

第 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.0.32)
Node 1: Started (version 8.0.32)

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.0.32)

ndb_mgm> Node 2: Started (version 8.0.32)
重要的

发出每个X RESTART命令后,等待管理客户端报告,然后再继续。 Node X: Started (version ...)

您可以通过检查mysqlndbinfo.nodes客户端中的表 来验证所有现有数据节点是否已使用更新的配置重新启动 。

第 4 步:执行所有集群 API 节点的滚动重启。 使用mysqladmin shutdownmysqld_safe(或其他启动脚本) 关闭并重新启动每个充当集群中 SQL 节点的 MySQL 服务器。这应该类似于此处显示的内容, 给定 MySQL 服务器实例 password的 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
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.32-ndb-8.0.32, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.32-ndb-8.0.32, Nodegroup: 0)
id=3    @198.51.100.3  (8.0.32-ndb-8.0.32, no nodegroup)
id=4    @198.51.100.4  (8.0.32-ndb-8.0.32, no nodegroup)

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

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.32-ndb-8.0.32)
id=21   @198.51.100.21  (8.0.32-ndb-8.0.32)

第 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
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.32-ndb-8.0.32, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.32-ndb-8.0.32, Nodegroup: 0)
id=3    @198.51.100.3  (8.0.32-ndb-8.0.32, Nodegroup: 1)
id=4    @198.51.100.4  (8.0.32-ndb-8.0.32, Nodegroup: 1)

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

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.32-ndb-8.0.32)
id=21   @198.51.100.21  (8.0.32-ndb-8.0.32)

第七步:重新分配集群数据。 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 个分区(在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

NDBT_ProgramExit: 0 - OK

您可以通过在mysqlNDB客户端中为每个 表执行一条ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION 语句, 使数据在所有数据节点之间重新分布。

重要的

ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION不适用于使用该MAX_ROWS选项创建的表。相反,用于 ALTER TABLE ... ALGORITHM=INPLACE, MAX_ROWS=...重组此类表。

请记住,MAX_ROWS不推荐使用 using 来设置每个表的分区数,您应该PARTITION_BALANCE改用;有关详细信息,请参阅 第 13.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

NDBT_ProgramExit: 0 - OK
笔记

通常,与分区标识符列表和一组分区定义一起使用,为已经显式分区的表创建新的分区方案。在这方面,它在这里用于将数据重新分发到新的 NDB Cluster 节点组是一个例外;以这种方式使用时,后面没有其他关键字或标识符。 ALTER TABLE table_name [ALGORITHM=INPLACE,] REORGANIZE PARTITIONREORGANIZE PARTITION

有关详细信息,请参阅第 13.1.9 节,“ALTER TABLE 语句”

此外,对于每个表,该 ALTER TABLE语句后应跟一个 OPTIMIZE TABLE以回收浪费的空间。NDBCLUSTER您可以使用以下针对表的查询 来获取所有 表的INFORMATION_SCHEMA.TABLES列表:

SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE ENGINE = 'NDBCLUSTER';
笔记

NDB Cluster 表的INFORMATION_SCHEMA.TABLES.ENGINE值始终为 NDBCLUSTER,无论是否使用了CREATE TABLE用于创建表的ALTER TABLE 语句(或用于从不同存储引擎转换现有表的语句)或其 NDB选项 。 NDBCLUSTERENGINE

在执行这些语句后,您可以在输出中 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)
笔记

由于一次只能对表执行一个 DDL 操作 NDBCLUSTER,因此您必须等待每个 ALTER TABLE ... REORGANIZE PARTITION语句完成才能发出下一个语句。

新增数据节点创建的表 无需下发 ALTER TABLE ... REORGANIZE PARTITION语句 ;添加到此类表中的数据会自动分布在所有数据节点中。但是,在 添加新节点之前存在的表中 ,现有数据和新数据都不会使用新节点进行分发,直到这些表使用 . NDBCLUSTERNDBCLUSTERALTER 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 在等待 StartNoNodeGroupTimeout 数据节点配置参数的设置确定的一段时间后开始使用节点 1 和 2。默认情况下,这是 15 秒(15000 毫秒)。

笔记

StartNoNodegroupTimeout 对于集群中的所有数据节点必须相同;因此,您应该始终将其设置在文件的[ndbd default]部分中 config.ini,而不是针对单个数据节点。

当您准备好添加第二个节点组时,您只需执行以下附加步骤:

  1. 启动数据节点 3 和 4,为每个新节点调用一次数据节点进程:

    $> ndbd -c 198.51.100.10 --initial
  2. 在管理客户端中发出适当的CREATE NODEGROUP命令:

    ndb_mgm> CREATE NODEGROUP 3,4
  3. mysql客户端中,为每个现有表发出 ALTER TABLE ... REORGANIZE PARTITION和 声明。(如本节其他地方所述,现有的 NDB Cluster 表在完成此操作之前不能使用新节点进行数据分发。) OPTIMIZE TABLENDBCLUSTER