在线添加NDB群集数据节点:详细示例
在本节中,我们提供一个详细的示例,说明如何在线添加新的NDB群集数据节点,首先是在单个节点组中具有2个数据节点的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
注意我们在数据节点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.20-ndb-8.0.20, Nodegroup: 0, *) id=2 @198.51.100.2 (8.0.20-ndb-8.0.20, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=10 @198.51.100.10 (8.0.20-ndb-8.0.20) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (8.0.20-ndb-8.0.20) id=21 @198.51.100.21 (8.0.20-ndb-8.0.20)
最后,我们假设集群包含一个NDBCLUSTER
创建的表,如下所示:
USE n;CREATE TABLE ips ( id BIGINT NOT NULLAUTO_INCREMENT PRIMARY KEY , country_code CHAR(2) NOT NULL,type CHAR(4) NOT NULL, ip_address VARCHAR(15) NOT NULL, addresses BIGINTUNSIGNED DEFAULT NULL, date BIGINTUNSIGNED DEFAULT NULL )ENGINE NDBCLUSTER ;
本节后面显示的内存使用情况和相关信息是在该表中插入大约50000行之后生成的。
注意在此示例中,我们显示了用于数据节点进程的单线程ndbd。您也可以套用这个例子中,如果您使用的是多线程ndbmtd代ndbmtd为NDBD各处出现的后续步骤。
步骤1:更新配置文件。在文本编辑器中打开集群全局配置文件,并添加[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:重新启动管理服务器。重新启动集群管理服务器要求您发出单独的命令来停止管理服务器,然后再次启动它,如下所示:
使用管理客户端
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.0.20-ndb-8.0.20 2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'
如果SHOW
在重新启动ndb_mgm进程后在管理客户端中检查输出,则现在应该看到类似以下内容:
-- 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.20-ndb-8.0.20, Nodegroup: 0, *) id=2 @198.51.100.2 (8.0.20-ndb-8.0.20, 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.20-ndb-8.0.20) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (8.0.20-ndb-8.0.20) id=21 @198.51.100.21 (8.0.20-ndb-8.0.20)
步骤3:对现有数据节点执行滚动重启。可以使用以下RESTART
命令在群集管理客户端中完全完成此步骤,如下所示:
ndb_mgm> 1RESTART 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.20) Node 1: Started (version 8.0.20) ndb_mgm> 2RESTART 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.20) ndb_mgm> Node 2: Started (version 8.0.20)
重要发出每个
X RESTART
命令后,请等到管理客户端报告后再继续操作。Node X: Started(version ...)
您可以通过检查mysql客户端中的ndbinfo.nodes
表来验证是否使用更新后的配置重新启动了所有现有数据节点。
步骤4:对所有群集API节点执行滚动重启。使用mysqladmin shutdown和mysqld_safe(或另一个启动脚本)关闭并重新启动群集中充当SQL节点的每个MySQL服务器。这应该类似于此处显示的内容,其中给定MySQL服务器实例password
的MySQL root
密码是:
shell>mysqladmin -uroot -ppassword shutdown 081208 20:19:56 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended shell>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
选项启动数据节点,如下所示:
shell>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.20-ndb-8.0.20, Nodegroup: 0, *) id=2 @198.51.100.2 (8.0.20-ndb-8.0.20, Nodegroup: 0) id=3 @198.51.100.3 (8.0.20-ndb-8.0.20, no nodegroup) id=4 @198.51.100.4 (8.0.20-ndb-8.0.20, no nodegroup) [ndb_mgmd(MGM)] 1 node(s) id=10 @198.51.100.10 (8.0.20-ndb-8.0.20) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (8.0.20-ndb-8.0.20) id=21 @198.51.100.21 (8.0.20-ndb-8.0.20)
步骤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.20-ndb-8.0.20, Nodegroup: 0, *) id=2 @198.51.100.2 (8.0.20-ndb-8.0.20, Nodegroup: 0) id=3 @198.51.100.3 (8.0.20-ndb-8.0.20, Nodegroup: 1) id=4 @198.51.100.4 (8.0.20-ndb-8.0.20, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=10 @198.51.100.10 (8.0.20-ndb-8.0.20) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (8.0.20-ndb-8.0.20) id=21 @198.51.100.21 (8.0.20-ndb-8.0.20)
步骤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
输出部分中,此处以粗体显示):
shell>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客户端中执行一条语句,使数据在所有数据节点之间重新分配。
重要
ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION
在使用该MAX_ROWS
选项创建的表上不起作用。而是,用于ALTER TABLE ... ALGORITHM=INPLACE, MAX_ROWS=...
重新组织此类表。请记住,不建议使用
MAX_ROWS
用于设置每个表的分区数,而应使用PARTITION_BALANCE
;有关更多信息,请参见“设置NDB_TABLE选项”。
发出该语句之后ALTER TABLE ips ALGORITHM=INPLACE, REORGANIZE PARTITION
,您可以使用ndb_desc看到该表的数据现在使用4个分区存储,如下所示(输出的相关部分以粗体显示):
shell>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群集节点组上,这是一个例外。当以这种方式使用时,没有其他关键字或标识符跟随。
ALTER TABLE table_name[ALGORITHM=INPLACE,] REORGANIZE PARTITION
REORGANIZE PARTITION
有关更多信息,请参见“ ALTER TABLE语句”。
此外,对于每个表,该ALTER TABLE
语句后都应带有一个,OPTIMIZE TABLE
以收回浪费的空间。您可以对NDBCLUSTER
表使用以下查询来获取所有表的INFORMATION_SCHEMA.TABLES
列表:
SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'NDBCLUSTER';
注意在
INFORMATION_SCHEMA.TABLES.ENGINE
一个NDB簇表值始终NDBCLUSTER
,无论是否CREATE TABLE
语句用于创建表(或ALTER TABLE
用语句中使用现有的表从不同的存储引擎转换),NDB
或NDBCLUSTER
在其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)
注意由于一次只能对
NDBCLUSTER
表执行一个DDL操作,因此您必须等待每条ALTER TABLE ... REORGANIZE PARTITION
语句完成后才能发出下一条。
添加新数据节点后,不必ALTER TABLE ... REORGANIZE PARTITION
为NDBCLUSTER
创建的表发出语句;添加到此类表的数据会自动在所有数据节点之间分配。但是,在添加新节点之前已存在的表中,使用新节点不会使用新节点分发现有数据或新数据,直到使用重组了这些表。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可以分别启动,如下所示:
shell>ndbd -c 198.51.100.10 --initial
在等待了由数据节点配置参数的设置所确定的一段时间之后NodeGroup = 65536
,管理服务器将配置为使用该数据节点的数据节点视为已启动了节点1和2 。默认情况下,这是15秒(15000毫秒)。--nowait-nodes=3,4
StartNoNodeGroupTimeout
注意
StartNoNodegroupTimeout
集群中的所有数据节点必须相同;因此,您应该始终[ndbd default]
在config.ini
文件的部分中进行设置,而不是针对单个数据节点进行设置。
准备添加第二个节点组时,只需执行以下附加步骤:
启动数据节点3和4,为每个新节点调用一次数据节点过程:
shell>
ndbd -c 198.51.100.10 --initialCREATE NODEGROUP
在管理客户端中发出适当的命令:ndb_mgm>
CREATE NODEGROUP 3,4- 在mysql客户端中,为每个现有表发布
ALTER TABLE ... REORGANIZE PARTITION
和OPTIMIZE TABLE
声明NDBCLUSTER
。(如本节其他地方所述,在完成此操作之前,现有的NDB群集表无法使用新节点进行数据分发。)