21.5.10.1 NDB 群集磁盘数据对象

NDB 群集磁盘数据存储是使用许多磁盘数据对象实现的。其中包括:

  • table 空间充当其他“磁盘数据”对象的容器。

  • 撤消日志文件撤消回滚事务所需的信息。

  • 将一个或多个撤消日志文件分配给一个日志文件组,然后将其分配给一个 table 空间。

  • 数据文件存储磁盘数据 table 数据。数据文件直接分配给 table 空间。

撤消日志文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下,它们放置在 NDB 群集config.ini文件中指定的DataDir *中的ndb_node_id_fs中,其中node_id *是数据节点的节点 ID。创建撤消日志或数据文件时,可以通过将绝对路径或相对路径指定为文件名的一部分来将它们放置在其他位置。创建这些文件的语句将在本节后面显示。

NDB 群集 table 空间和日志文件组未实现为文件。

Important

尽管并非所有磁盘数据对象都实现为文件,但是它们都共享相同的名称空间。这意味着“每个磁盘数据对象”必须被唯一命名(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能同时具有名为dd1的 table 空间和日志文件组。

假设您已经设置了包含所有节点(包括 Management 和 SQL 节点)的 NDB 群集,则在磁盘上创建 NDB 群集 table 的基本步骤如下:

  • 创建一个日志文件组,并为其分配一个或多个撤消日志文件(撤消日志文件有时也称为撤消文件)。

Note

仅对于磁盘数据 table,才需要撤消日志文件;它们不用于仅存储在内存中的NDBCLUSTERtable。

  • 创建一个 table 空间;将日志文件组以及一个或多个数据文件分配给 table 空间。

  • 创建一个使用该 table 空间进行数据存储的磁盘数据 table。

每个任务都可以使用mysqlClient 端或其他 MySQLClient 端应用程序中的 SQL 语句来完成,如下例所示。

  • 我们使用创建日志文件组创建名为lg_1的日志文件组。该日志文件组由两个撤消日志文件组成,它们分别称为undo_1.logundo_2.log,其初始大小分别为 16 MB 和 12 MB。 (撤消日志文件的默认初始大小为 128 MB.)(可选)您还可以为日志文件组的撤消缓冲区指定大小,或允许其采用默认值 8 MB。在此示例中,我们将 UNDO 缓冲区的大小设置为 2 MB。必须使用撤消日志文件创建日志文件组;因此,我们在此创建日志文件组语句中将undo_1.log添加到lg_1
CREATE LOGFILE GROUP lg_1
    ADD UNDOFILE 'undo_1.log'
    INITIAL_SIZE 16M
    UNDO_BUFFER_SIZE 2M
    ENGINE NDBCLUSTER;

要将undo_2.log添加到日志文件组,请使用以下更改日志文件组语句:

ALTER LOGFILE GROUP lg_1
    ADD UNDOFILE 'undo_2.log'
    INITIAL_SIZE 12M
    ENGINE NDBCLUSTER;

注意事项:

Important

在任何给定时间,同一 NDB 群集中最多可以存在一个日志文件组。

  • 使用ADD UNDOFILE 'filename'将撤消日志文件添加到日志文件组时,将在集群中每个数据节点DataDirndb_node_id_fs目录中创建一个名称为* filename 的文件,其中 node_id *是该节点的节点 ID。数据节点。每个撤消日志文件具有 SQL 语句中指定的大小。例如,如果 NDB 群集具有 4 个数据节点,则刚刚显示的更改日志文件组语句将创建 4 个撤消日志文件,每个在 4 个数据节点的数据目录中分别存在 1 个;这些文件中的每个文件都名为undo_2.log,每个文件的大小为 12 MB。

  • UNDO_BUFFER_SIZE受可用系统内存量的限制。

  • 有关创建日志文件组语句的更多信息,请参见第 13.1.15 节“ CREATE LOGFILE GROUP 语句”。有关更改日志文件组的更多信息,请参见第 13.1.5 节“ ALTER LOGFILE GROUP 语句”

  • 现在,我们可以创建一个 table 空间,其中包含 NDB 群集磁盘数据 table 用于存储其数据的文件。table 空间还与特定的日志文件组关联。创建新 table 空间时,必须指定用于撤消日志记录的日志文件组;您还必须指定一个数据文件。创建 table 空间后,可以将更多数据文件添加到 table 空间中。还可以从 table 空间删除数据文件(本节后面提供删除数据文件的示例)。

假设我们希望创建一个名为ts_1的 table 空间,该 table 空间使用lg_1作为其日志文件组。该 table 空间将包含两个名为data_1.datdata_2.dat的数据文件,其初始大小分别为 32 MB 和 48 MB。 (INITIAL_SIZE的默认值为 128 MB.)我们可以使用两个 SQL 语句执行此操作,如下所示:

CREATE TABLESPACE ts_1
    ADD DATAFILE 'data_1.dat'
    USE LOGFILE GROUP lg_1
    INITIAL_SIZE 32M
    ENGINE NDBCLUSTER;

ALTER TABLESPACE ts_1
    ADD DATAFILE 'data_2.dat'
    INITIAL_SIZE 48M
    ENGINE NDBCLUSTER;

CREATE TABLESPACE语句使用数据文件data_1.dat创建 table 空间ts_1,并将ts_1与日志文件组lg_1关联。 ALTER TABLESPACE添加第二个数据文件(data_2.dat)。

注意事项:

  • 与本示例中用于撤消日志文件的.log文件 extensions 一样,对于.dat文件 extensions 没有特殊意义。它仅用于轻松识别数据文件。

  • 使用ADD DATAFILE 'filename'将数据文件添加到 table 空间时,将在集群中每个数据节点的DataDir内的ndb_node_id_fs目录中创建一个名称为* filename 的文件,其中 node_id *是数据节点的节点 ID。每个数据文件的大小在 SQL 语句中指定。例如,如果 NDB 群集具有 4 个数据节点,则刚刚显示的ALTER TABLESPACE语句将创建 4 个数据文件,在 4 个数据节点的每一个的数据目录中各 1 个;这些文件中的每个文件都名为data_2.dat,每个文件的大小为 48 MB。

  • NDB 7.6(及更高版本)保留每个 table 空间的 4%以便在数据节点重新启动期间使用。该空间不可用于存储数据。

  • 所有CREATE TABLESPACEALTER TABLESPACE语句必须包含ENGINE子句;在 table 空间中只能创建使用与 table 空间相同的存储引擎的 table。对于 NDB 群集 table 空间,此选项唯一允许的值为NDBCLUSTERNDB

  • 有关CREATE TABLESPACEALTER TABLESPACE语句的更多信息,请参见第 13.1.19 节“ CREATE TABLESPACE 语句”第 13.1.9 节“ ALTER TABLESPACE 语句”

  • 现在可以创建一个 table,该 table 的未索引列存储在 table 空间ts_1的磁盘上:

CREATE TABLE dt_1 (
    member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    dob DATE NOT NULL,
    joined DATE NOT NULL,
    INDEX(last_name, first_name)
    )
    TABLESPACE ts_1 STORAGE DISK
    ENGINE NDBCLUSTER;

TABLESPACE ... STORAGE DISK选项告诉NDBCLUSTER存储引擎将 table 空间ts_1用于磁盘数据存储。

如图所示创建 tablets_1后,就可以像对其他任何 MySQLtable 一样在其上执行INSERTSELECTUPDATEDELETE语句。

也可以通过使用STORAGE子句作为CREATE TABLEALTER TABLE语句中列定义的一部分来指定是将单个列存储在磁盘上还是存储在内存中。 STORAGE DISK导致将列存储在磁盘上,STORAGE MEMORY导致使用内存中存储。有关更多信息,请参见第 13.1.18 节“ CREATE TABLE 语句”

隐式存储在磁盘上的列的索引. 对于如上所示示例中定义的 tabledt_1,仅dobjoined列存储在磁盘上。这是因为idlast_namefirst_name列上有索引,因此属于这些列的数据存储在 RAM 中。只有未索引的列可以保留在磁盘上。索引和索引列数据 continue 存储在内存中。在设计磁盘数据 table 时,必须牢记在索引使用和 RAM 保留之间进行权衡。

您必须先将其存储类型更改为MEMORY,才能将索引添加到已明确声明为STORAGE DISK的列中;任何尝试都会失败并显示错误。可以间接使用磁盘存储的列可以构建索引;完成此操作后,列的存储类型将自动更改为MEMORY。 “隐式”是指未声明其存储类型但从父 table 继承的列。在以下 CREATE TABLE 语句(使用先前定义的 table 空间ts_1)中,列c2c3隐式使用磁盘存储:

mysql> CREATE TABLE ti (
    ->     c1 INT PRIMARY KEY,
    ->     c2 INT,
    ->     c3 INT,
    ->     c4 INT
    -> )
    ->     STORAGE DISK
    ->     TABLESPACE ts_1
    ->     ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.31 sec)

由于c2c3c4本身未使用STORAGE DISK声明,因此可以对它们进行索引。在这里,我们分别使用CREATE INDEXALTER TABLE将索引添加到c2c3

mysql> CREATE INDEX i1 ON ti(c2);
Query OK, 0 rows affected (2.72 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE ti ADD INDEX i2(c3);
Query OK, 0 rows affected (0.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

显示创建 table确认已添加索引。

mysql> SHOW CREATE TABLE ti\G
*************************** 1. row ***************************
       Table: ti
Create Table: CREATE TABLE `ti` (
  `c1` int(11) NOT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  `c4` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  KEY `i1` (`c2`),
  KEY `i2` (`c3`)
) /*!50100 TABLESPACE `ts_1` STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

您可以使用ndb_desc看到索引列(强调文本)现在使用内存而不是磁盘存储:

shell> ./ndb_desc -d test t1
-- t1 --
Version: 33554433
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 4
Number of primary keys: 1
Length of frm data: 317
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 4
FragmentCount: 4
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options:
HashMap: DEFAULT-HASHMAP-3840-4
-- Attributes --
c1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c2 Int NULL AT=FIXED ST=MEMORY
c3 Int NULL AT=FIXED ST=MEMORY
c4 Int NULL AT=FIXED ST=DISK
-- Indexes --
PRIMARY KEY(c1) - UniqueHashIndex
i2(c3) - OrderedIndex
PRIMARY(c1) - OrderedIndex
i1(c2) - OrderedIndex

NDBT_ProgramExit: 0 - OK

性能说明. 如果将磁盘数据文件保存在与数据节点文件系统不同的物理磁盘上,则使用磁盘数据存储的群集的性能将大大提高。必须对集群中的每个数据节点执行此操作,以获取任何明显的好处。

您可以将绝对和相对文件系统路径与ADD UNDOFILEADD DATAFILE一起使用。相对路径是相对于数据节点的数据目录计算的。您也可以使用符号链接。有关更多信息和示例,请参见第 21.5.10.2 节“将符号链接与磁盘数据对象一起使用”

必须以特定 Sequences 创建日志文件组,table 空间以及使用它们的任何磁盘数据 table。对于删除以下任何对象也是如此:

  • 只要任何 table 空间都在使用日志文件组,就不能删除它。

  • 只要 table 空间包含任何数据文件,就不能删除它。

  • 只要剩余任何正在使用该 table 空间的 table,就不能从该 table 空间删除任何数据文件。

  • 与创建 table 所用的 table 空间不同,不能删除与其他 table 空间关联创建的文件。 (缺陷号 20053)

例如,要删除本节到目前为止创建的所有对象,可以使用以下语句:

mysql> DROP TABLE dt_1;

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_2.dat'
    -> ENGINE NDBCLUSTER;

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_1.dat'
    -> ENGINE NDBCLUSTER;

mysql> DROP TABLESPACE ts_1
    -> ENGINE NDBCLUSTER;

mysql> DROP LOGFILE GROUP lg_1
    -> ENGINE NDBCLUSTER;

这些语句必须按所示 Sequences 执行,但两个ALTER TABLESPACE ... DROP DATAFILE语句可以按任一 Sequences 执行。

您可以通过查询INFORMATION_SCHEMA数据库中的FILEStable 来获取有关“磁盘数据”table 使用的数据文件的信息。额外的“ NULL行”提供了有关撤消日志文件的其他信息。有关更多信息和示例,请参见第 24.9 节“ INFORMATION_SCHEMA FILEStable”