Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

本节中,我们提供了一个详细的示例,展示如何在线添加新的 NDB 集群数据节点,从一个具有两个数据节点、单个节点组的 NDB 集群开始,并最终到达一个具有四个数据节点、两个节点组的集群。

起始配置.  为了便于演示,我们假设一个最小的配置,并且该集群使用名为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 (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 行插入到该表中后生成的。

Note

在这个示例中,我们展示了单线程的ndbd用于数据节点进程。你也可以将这个示例应用于使用多线程的ndbmtd,只需在后续步骤中将ndbmtd替换ndbd

步骤1:更新配置文件。 打开集群全局配置文件在文本编辑器中,并添加对两个新的数据节点的[ndbd]部分。 (我们将这些数据节点标识为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.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)

Step 3: Perform a rolling restart of the existing data nodes.  这一步可以完全在集群管理客户端中完成,使用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)
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 (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个分区(在输出的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表上执行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
Note

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

更多信息,请见第15.1.9节,“ALTER TABLE 语句”

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

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

无论使用哪个CREATE TABLE语句(或ALTER TABLE语句将现有表从不同存储引擎转换为)是否使用NDBNDBCLUSTER在其ENGINE选项中,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)
Note

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

不需要为ALTER TABLE ... REORGANIZE PARTITION语句对NDBCLUSTER表进行操作,因为在添加新数据节点后,添加到这些表中的数据将自动分布于所有数据节点。但是,对NDBCLUSTER表进行操作,这些表在添加新节点之前已经存在,既新的也旧的数据直到使用ALTER TABLE ... REORGANIZE PARTITION语句对这些表进行重新组织后才会分布于新节点。

不需要rolling restart的alternative procedure 可以通过在第一次启动集群时配置额外数据节点,但不是启动它们来避免rolling restart。我们假设,像之前一样,您想从两个数据节点(节点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毫秒)。

Note

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 集群表直到执行了这些操作后才能使用新节点进行数据分布。)