• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在线添加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 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。您也可以套用这个例子中,如果您使用的是多线程ndbmtdndbmtdNDBD各处出现的后续步骤。

    步骤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:重新启动管理服务器。重新启动集群管理服务器要求您发出单独的命令来停止管理服务器,然后再次启动它,如下所示:

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

      ndb_mgm> 10 STOP
      Node 10 has shut down.
      Disconnecting to allow Management Server to shutdown
      
      shell>
      
    2. 由于关闭管理服务器会导致管理客户端终止,因此必须从系统外壳启动管理服务器。为简单起见,我们假定该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> 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.20)
    Node 1: Started (version 8.0.20)
    
    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.20)
    
    ndb_mgm> Node 2: Started (version 8.0.20)
    
    重要

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

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

    步骤4:对所有群集API节点执行滚动重启。使用mysqladmin shutdownmysqld_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
    

    您可以通过对每个NDBALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITIONmysql客户端中执行一条语句,使数据在所有数据节点之间重新分配。

    重要

    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 PARTITIONREORGANIZE 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用语句中使用现有的表从不同的存储引擎转换),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)
    
    注意

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

    添加新数据节点,不必ALTER TABLE ... REORGANIZE PARTITIONNDBCLUSTER创建的表发出语句;添加到此类表的数据会自动在所有数据节点之间分配。但是,在添加新节点之前已存在的表中,使用新节点不会使用新节点分发现有数据或新数据,直到使用重组了这些表。NDBCLUSTERALTER 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,4StartNoNodeGroupTimeout

    注意

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

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

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

      shell>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群集表无法使用新节点进行数据分发。)