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.log
和undo_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;
注意事项:
-
此处不需要使用
.log
文件 extensions。我们仅使用它来使日志文件易于识别。 -
每个创建日志文件组和更改日志文件组语句必须包含
ENGINE
选项。此选项唯一允许的值为NDBCLUSTER和NDB。
Important
在任何给定时间,同一 NDB 群集中最多可以存在一个日志文件组。
-
使用
ADD UNDOFILE 'filename'
将撤消日志文件添加到日志文件组时,将在集群中每个数据节点DataDir的ndb_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.dat
和data_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 TABLESPACE和ALTER TABLESPACE语句必须包含
ENGINE
子句;在 table 空间中只能创建使用与 table 空间相同的存储引擎的 table。对于 NDB 群集 table 空间,此选项唯一允许的值为NDBCLUSTER和NDB。 -
有关CREATE TABLESPACE和ALTER TABLESPACE语句的更多信息,请参见第 13.1.19 节“ CREATE TABLESPACE 语句”和第 13.1.9 节“ ALTER TABLESPACE 语句”。
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 一样在其上执行INSERT,SELECT,UPDATE和DELETE语句。
也可以通过使用STORAGE
子句作为CREATE TABLE或ALTER TABLE语句中列定义的一部分来指定是将单个列存储在磁盘上还是存储在内存中。 STORAGE DISK
导致将列存储在磁盘上,STORAGE MEMORY
导致使用内存中存储。有关更多信息,请参见第 13.1.18 节“ CREATE TABLE 语句”。
隐式存储在磁盘上的列的索引. 对于如上所示示例中定义的 tabledt_1
,仅dob
和joined
列存储在磁盘上。这是因为id
,last_name
和first_name
列上有索引,因此属于这些列的数据存储在 RAM 中。只有未索引的列可以保留在磁盘上。索引和索引列数据 continue 存储在内存中。在设计磁盘数据 table 时,必须牢记在索引使用和 RAM 保留之间进行权衡。
您必须先将其存储类型更改为MEMORY
,才能将索引添加到已明确声明为STORAGE DISK
的列中;任何尝试都会失败并显示错误。可以间接使用磁盘存储的列可以构建索引;完成此操作后,列的存储类型将自动更改为MEMORY
。 “隐式”是指未声明其存储类型但从父 table 继承的列。在以下 CREATE TABLE 语句(使用先前定义的 table 空间ts_1
)中,列c2
和c3
隐式使用磁盘存储:
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)
由于c2
,c3
和c4
本身未使用STORAGE DISK
声明,因此可以对它们进行索引。在这里,我们分别使用CREATE INDEX
和ALTER TABLE
将索引添加到c2
和c3
:
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 UNDOFILE
和ADD 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”。