10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 从本手册中摘录

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

在本节中,我们提供了一个详细的示例,说明如何在线添加新的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选择,然后运行显示在管理客户端产生的输出如下所示:

——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 (5.7.33-ndb-7.5.22, Nodegroup: 0, *) id=2 @198.51.100.2 (5.7.33-ndb-7.5.22, Nodegroup:0) [ndb_mgmd(MGM)] 1 node(s) id=10 @198.51.100.10 (5.7.33-ndb-7.5.22) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (5.7.33-ndb-7.5.22) id=21 @198.51.100.21 (5.7.33-ndb-7.5.22)

最后,我们假设群集包含单个NDBCLUSTER创建的表如下所示:

使用n;创建表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在接下来的步骤中。

第1步:更新配置文件。在文本编辑器中打开群集全局配置文件并添加(ndbd)对应于2个新数据节点的部分。(我们提供这些数据节点ID 3和4,并假设它们分别在Addresses 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主机名= 198.51.100.21

完成必要的更改后,保存文件。

步骤2:重启管理服务器。重启集群管理服务器需要分别发出命令来停止管理服务器,然后再重新启动它,如下所示:

  1. 通过管理客户端停止管理服务器停止命令,如下所示:

    ndb_mgm> 10 stop节点10已关闭。断开连接以允许管理服务器关闭shell>
  2. 因为关闭管理服务器会导致管理客户端终止,所以必须从系统shell启动管理服务器。为简单起见,我们假设config.ini与管理服务器二进制文件在同一个目录中,但在实践中,您必须提供配置文件的正确路径。还必须提供——重新加载- 最初的选项使管理服务器从文件读取新配置而不是其配置缓存。如果shell的当前目录也与管理服务器二进制文件的目录相同,那么您可以调用管理服务器,如下所示:

    ——reload 2008-12-08 17:29:23 [MgmSrvr] INFO——读取集群管理服务器

如果你检查输出显示在管理客户端重启后ndb_mgm.进程,你现在应该看到如下内容:

——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 (5.7.33-ndb-7.5.22, Nodegroup: 0, *) id=2 @198.51.100.2 (5.7.33-ndb-7.5.22, Nodegroup:0) id = 3(未连接,接受连接从198.51.100.3)id = 4(没有连接,接受连接从198.51.100.4)[ndb_mgmd (MGM)] 1节点(s) id = 10 @198.51.100.10 (5.7.33-ndb-7.5.22) (mysqld (API)] 20 (s) 2节点id = @198.51.100.20 (5.7.33-ndb-7.5.22) id = 21 @198.51.100.21 (5.7.33-ndb-7.5.22)

步骤3:对现有数据节点进行滚动重启。此步骤可以完全在集群管理客户机中使用重新启动命令,如下所示:

ndb_mgm> 1重启节点1:节点关闭启动节点1:节点关闭完成,重新启动,无开始。节点1正在重新启动NDB_MGM>节点1:开始启动(版本7.5.22)节点1:启动(版本7.5.22)ndb_mgm> 2重启节点2:节点关闭启动节点2:节点关闭完成,重新启动,没有开始。节点2正在重新启动ndb_mgm>节点2:开始启动(版本7.5.22)ndb_mgm>节点2:启动(版本7.5.22)
重要的

之后,每X重新启动命令,等待管理客户端报告节点X启动(版本…)进行任何进一步的。

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

步骤4:对所有集群API节点执行滚动重启。关闭并重新启动作为集群中的SQL节点的每个MySQL服务器mysqladmin关闭紧随其后的是mysqld_safe.(或另一个启动脚本)。这应该类似于这里显示的密码是MySQL给定MySQL Server实例的密码:

Shell > mysqladmin -uroot -p密码mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.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从/usr/local/mysql/var启动mysqld守护进程

当然,确切的输入和输出取决于MySQL在系统上安装的方式以及位置,以及您选择启动它的选项(以及是否在其中指定了这些选项中的某些选项my.cnf文件)。

步骤5:初始启动新数据节点。在每个新数据节点的主机上的系统shell中,使用- 最初的选项:

Shell > NDBD -c 198.51.100.10——initial
请注意

与重新启动现有数据节点的情况不同,您可以同时启动新的数据节点;您不需要在开始另一个之前等待其中一个完成启动。

等待两个新数据节点都启动之后,再进行下一步。启动新数据节点后,可以在管理客户机的输出中看到显示命令使它们不属于任何节点组(如此处粗体所示):

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 (5.7.33-ndb-7.5.22, Nodegroup: 0, *) id=2 @198.51.100.2 (5.7.33-ndb-7.5.22, Nodegroup:0) id = 3 @198.51.100.3 (5.7.33-ndb-7.5.22,没有节点组)id = 4 @198.51.100.4 (5.7.33-ndb-7.5.22,没有节点组)[ndb_mgmd (MGM)] 1节点(s) id = 10 @198.51.100.10 (5.7.33-ndb-7.5.22) (mysqld (API)] 2节点(s) id = 20 @198.51.100.20 (5.7.33-ndb-7.5.22) id = 21 @198.51.100.21 (5.7.33-ndb-7.5.22)

步骤6:创建一个新的节点组。你可以通过发行a创建nodegroup.群集管理客户端中的命令。此命令作为其参数将要包含在新节点组中的数据节点的节点ID的逗号分隔列表,如下所示:

ndb_mgm> CREATE NODEGROUP 3,4创建NODEGROUP 1

通过发行显示同样,您可以验证数据节点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 (5.7.33-ndb-7.5.22, Nodegroup: 0, *) id=2 @198.51.100.2 (5.7.33-ndb-7.5.22, Nodegroup:0) id=3 @198.51.100.3 (5.7.33-ndb-7.5.22, Nodegroup: 1) id=4 @198.51.100.4 (5.7.33-ndb-7.5.22, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=10 @198.51.100.10 (5.7.33-ndb-7.5.22) [mysqld(API)] 2 node(s) id=20 @198.51.100.20 (5.7.33-ndb-7.5.22) id=21 @198.51.100.21 (5.7.33-ndb-7.5.22)

步骤7:重新分发集群数据。创建节点组时,现有数据和索引不会自动分发给新的节点组的数据节点,因为您可以通过发出适当的方式来查看报告管理客户端命令:

ndb_mgm >所有报告内存节点1:数据使用率是5%(总3200)的177个32 k页面节点1:索引使用是0% (108 8 k页面的总12832)节点2:数据使用的是5%(总3200)的177个32 k页面节点2:索引使用是0% (108 8 k页面的总12832)节点3:数据使用的是0% (0 32 k页面总数的3200)节点3:索引使用率为0%(0 8K页总数12832)节点4:数据使用率为0%(0 32K页总数3200)节点4:索引使用率为0%(0 8K页总数12832)

通过使用ndb_desc- p选项导致输出包含分区信息,您可以看到该表仍然只使用2个分区(在每个分区信息输出的部分,以粗体显示在此处):

壳> ndb_desc - c 198.51.100.10 - d n ips - p - ips -版本:1片段类型:9 K值:6分钟负载因素:78年最大负荷系数:80临时表:没有数量的属性:6主键的数量:1纳数据长度:340行校验和:1行GCI: 1 SingleUserMode: 0 ForceVarPart: 1 FragmentCount: 2 TableStatus:检索——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=内存地址Bigunsigned NULL AT=FIXED ST=内存日期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 varsize MEMORY 0 26086 26086 1572864 557056 1 26329 26329 1605632 557056 NDBT_ProgramExit: 0 - OK

您可以通过为每个执行所有数据节点来导致数据重新分配数据NDB表,一个ALTER TABLE……算法=原地,重组分区陈述mysql客户端。

重要的

ALTER TABLE……算法=原地,重组分区属性创建的表不能工作max_rows.选择。相反,使用ALTER TABLE ... algorithm = inplace,max_rows = ...重组这些表格。

记住使用max_rows.在NDB 7.5.4及以后版本中不建议设置每个表的分区数partition_balance.反而;看第13.1.18.9节“设置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
请注意

通常情况下,ALTER TABLEtable_name[algorithm = inplace,]重新组织分区与分区标识符列表和一组分区定义一起使用,用于为已经显式分区的表创建新的分区方案。在这方面,它用于将数据重新分发到一个新的NDB Cluster节点组是一个例外;当以这种方式使用时,没有其他关键字或标识符跟随重组分区

有关更多信息,请参阅Section 13.1.8, " ALTER TABLE Statement "

此外,对于每个表,ALTER TABLE语句后应接一个优化表回收浪费的空间。你可以获得所有的列表NDBCLUSTER表中使用以下查询INFORMATION_SCHEMA。表表:

从information_schema中选择table_schema, table_name。表引擎= ' ndbcluster ';
请注意

Information_Schema.Tables.Engine.NDB Cluster表的值总是NDBCLUSTER,无论是否创建表语句,用于创建表(或ALTER TABLE用于将现有表从不同存储引擎转换的语句)使用NDBNDBCLUSTER在其引擎选择。

执行这些语句后,您可以在所有报告记忆数据和索引现在在所有集群数据节点之间重新分布,如下所示:

ndb_mgm >所有报告内存节点1:数据使用率是5%(总3200)的176个32 k页面节点1:索引使用是0% (76 8 k页面的总12832)节点2:数据使用的是5%(总3200)的176个32 k页面节点2:索引使用是0% (76 8 k页面的总12832)节点3:数据使用的是2%(总3200)的80个32 k页面节点3:索引使用率为0%(51 8K页共12832)节点4:数据使用率为2%(80 32K页共3200)节点4:索引使用率为0%(50 8K页共12832)
请注意

因为只有一个DDL操作NDBCLUSTER表可以一次执行一次,必须等待每个表ALTER TABLE ...重新组织分区语句结束后再发出下一个语句。

没有必要发布ALTER TABLE ...重新组织分区语句NDBCLUSTER表创建的表格已添加新数据节点;添加到此类表中的数据自动分布在所有数据节点之间。但是,在NDBCLUSTER表存在之前添加新节点,既不使用新节点分发现有数据,直到这些表已重新组织ALTER TABLE ...重新组织分区

替代程序,没有滚动重启。通过配置额外的数据节点,但在首次启动集群时不启动它们,可以避免滚动重新启动。与前面一样,我们假设您希望从两个数据节点(节点1和2)开始,在一个节点组中,然后通过添加由节点3和4组成的第二个节点组,将集群扩展到四个数据节点:

[ndbd违约]DataMemory = 100 IndexMemory = 100 NoOfReplicas = 2 DataDir = /usr/local/mysql/var/mysql-cluster [ndbd] Id = 1主机名= 198.51.100.1 [ndbd] Id = 2主机名= 198.51.100.2 [ndbd] Id = 3主机名= 198.51.100.3节点组= 65536 (ndbd) Id = 4主机名= 198.51.100.4节点组= 65536 (mgm)主机名= 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使用——nowait-nodes = 3, 4的设置确定一段时间后StartNoNodeGroupTimeout数据节点配置参数。默认情况下,这是15秒(15000毫秒)。

请注意

startnonodegrouptimout.集群中的所有数据节点必须相同;由于这个原因,您应该始终在(ndbd违约)部分的config.ini文件,而不是单个数据节点。

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

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

    Shell > NDBD -c 198.51.100.10——initial
  2. 发出适当的问题创建nodegroup.管理客户端命令:

    ndb_mgm> CREATE NODEGROUP 3,4
  3. mysql客户,问题ALTER TABLE ...重新组织分区优化表对每个现有的NDBCLUSTER表格(正如本节其他地方所指出的,现有的NDB Cluster表不能使用新节点进行数据分发,直到这些新节点已经完成。)