Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Adding NDB Cluster Data Nodes Online: Detailed Example

25.6.7.3 在线添加 NDB 集群数据节点:详细示例

在本节中,我们提供了一个详细的示例,说明如何在线添加新的 NDB 集群数据节点,从一个只有 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
Note

我们在数据节点 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.1.0-ndb-8.1.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.1.0-ndb-8.1.0, Nodegroup: 0)

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

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.1.0-ndb-8.1.0)
id=21   @198.51.100.21  (8.1.0-ndb-8.1.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 行插入到该表后生成的。

Note

在这个示例中,我们使用单线程的 ndbd 进行数据节点进程。如果您使用多线程的 ndbmtd,可以将 ndbmtd 替换为 ndbd 在以下步骤中。

步骤 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. 因为停止管理服务器会导致管理客户端终止,因此您必须从系统 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.1.0-ndb-8.1.0
    2008-12-08 17:29:23 [MgmSrvr] INFO     -- Reading cluster configuration from 'config.ini'

如果您在重新启动管理服务器后在管理客户端中检查 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.1.0-ndb-8.1.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.1.0-ndb-8.1.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.1.0-ndb-8.1.0)

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

ndb_mgm> Node 2: Started (version 8.1.0)
Important

在发出每个 X RESTART 命令后,请等待管理客户端报告 Node X: Started (version ...) before 进一步操作。

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

步骤 4:执行所有集群 API 节点的滚动重新启动。 使用 mysqladmin shutdown 后跟 mysqld_safe(或其他启动脚本)关闭并重新启动每个 MySQL 服务器,作为集群中的 SQL 节点。这应该类似于以下所示,其中 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
Note

与重新启动现有数据节点不同,您可以并发启动新数据节点;您不需要等待一个完成启动之前启动另一个。

等待两个新数据节点都启动完成后再进行下一步。一旦新数据节点启动,您可以在管理客户端 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.1.0-ndb-8.1.0, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.1.0-ndb-8.1.0, Nodegroup: 0)
id=3    @198.51.100.3  (8.1.0-ndb-8.1.0, no nodegroup)
id=4    @198.51.100.4  (8.1.0-ndb-8.1.0, no nodegroup)

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

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

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

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.1.0-ndb-8.1.0)
id=21   @198.51.100.21  (8.1.0-ndb-8.1.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 个分区(在输出的 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

您可以通过对每个 NDB 表执行 ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION 语句在 mysql 客户端中来重新分布数据。

Important

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

NDBT_ProgramExit: 0 - OK
Note

通常,ALTER TABLE 表名 [ALGORITHM=INPLACE,] REORGANIZE PARTITION 用于与分区标识符列表和分区定义一起创建已经显式分区的表的新分区方案。这里使用它来将数据重新分布到新的 NDB 集群节点组是一个例外;在这种情况下,不会跟随 REORGANIZE PARTITION 的其他关键字或标识符。

有关更多信息,请参阅 第 15.1.9 节,“ALTER TABLE 语句”

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

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

对于 NDB 集群表,INFORMATION_SCHEMA.TABLES.ENGINE 的值始终是 NDBCLUSTER,无论用于创建表的 CREATE TABLE 语句(或用于将现有表从其他存储引擎转换的 ALTER TABLE 语句)是否使用 NDBNDBCLUSTER 在其 ENGINE 选项中。

执行这些语句后,您可以在 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)
Note

由于只能在 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

可以使用 NodeGroup = 65536 配置将来在线的数据节点(节点 3 和 4),在这种情况下,节点 1 和 2 可以像这样启动:

$> ndbd -c 198.51.100.10 --initial

使用 NodeGroup = 65536 配置的数据节点将被管理服务器视为您使用 --nowait-nodes=3,4 启动节点 1 和 2 之后,等待一段时间,该时间由 StartNoNodeGroupTimeout 数据节点配置参数设置,默认为 15 秒(15000 毫秒)。

Note

启动无节点组超时 必须对集群中的所有数据节点相同;因此,您应该总是在 [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 PARTITIONOPTIMIZE TABLE 语句,以便每个现有的 NDBCLUSTER 表。(如本节其他地方所述,现有的 NDB Cluster 表不能使用新节点进行数据分布,直到执行了这些语句。)