25.6.11.1 Объекты данных на диске NDB Cluster
Хранение данных на диске NDB Cluster реализовано с использованием следующих объектов:
Пространство имен: Выступает в качестве контейнера для других объектов данных на диске. Пространство имен содержит один или несколько файлов данных и одну или несколько групп файлов журнала отката.
Файл данных: Хранит данные столбцов. Файл данных напрямую назначается пространству имен.
Файл журнала отката: Содержит информацию отката, необходимую для отмены транзакций. Назначается группе файлов журнала отката.
Группа файлов журнала: Содержит один или несколько файлов журнала отката. Назначается пространству имен.
Файлы журнала отката и файлы данных являются фактическими файлами в файловой системе каждого узла данных; по умолчанию они размещаются в ndb_ в node_id_fsDataDir, указанном в файле конфигурации NDB Cluster config.ini, где node_id — идентификатор узла данных. Размещение этих файлов в других местах возможно, указав абсолютный или относительный путь в имени файла при создании файла журнала отката или файла данных. Команды для создания этих файлов показаны далее в этом разделе.
Файлы журнала отката используются только таблицами данных на диске и не нужны или не используются таблицами NDB, которые хранятся только в памяти.
Пространства имен и группы файлов журнала NDB Cluster не реализованы как файлы.
Хотя не все объекты данных на диске реализованы как файлы, все они используют одно и то же пространство имен. Это означает, что каждый объект данных на диске должен иметь уникальное имя (а не только каждый объект данных данного типа). Например, вы не можете иметь пространство имен и группу файлов журнала, оба с именем dd1.
Предполагая, что вы уже настроили NDB Cluster со всеми узлами (включая управляющие и SQL-узлы), основные шаги по созданию таблицы NDB Cluster на диске следующие:
Создайте группу файлов журнала и назначьте один или несколько файлов журнала отката (файл журнала отката также иногда называется файлом отката).
Создайте пространство имен; назначьте группу файлов журнала, а также один или несколько файлов данных пространству имен.
Создайте таблицу данных на диске, использующую это пространство имен для хранения данных.
Каждая из этих задач может быть выполнена с помощью SQL-запросов в клиенте mysql или другом приложении-клиенте MySQL, как показано в следующем примере.
-
Мы создаём группу файлов журнала с именем
lg_1, используяCREATE LOGFILE GROUP. Эта группа файлов журнала должна состоять из двух файлов журнала отката, которые мы назовёмundo_1.logиundo_2.log, с начальными размерами 16 МБ и 12 МБ соответственно. (По умолчанию начальный размер файла журнала отката составляет 128 МБ.) Необязательно, вы также можете указать размер буфера отката группы файлов журнала или позволить ему принять значение по умолчанию — 8 МБ. В этом примере мы установили размер буфера UNDO в 2 МБ. Группа файлов журнала должна быть создана с файлом журнала отката; поэтому мы добавимundo_1.logкlg_1в этомCREATE LOGFILE GROUPоператоре: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оператор:ALTER LOGFILE GROUP lg_1 ADD UNDOFILE 'undo_2.log' INITIAL_SIZE 12M ENGINE NDBCLUSTER;Некоторые замечания:
Расширение файла
.log, используемое здесь, не является обязательным. Мы используем его только для того, чтобы файлы журнала были легко распознаваемы.-
Каждый
CREATE LOGFILE GROUPиALTER LOGFILE GROUPоператор должен включать опциюENGINE. Разрешённые значения для этой опции —NDBCLUSTERиNDB.ВажноВ одном NDB Cluster может существовать не более одной группы файлов журнала в любой момент времени.
Когда вы добавляете файл журнала отката в группу файлов журнала, используя
ADD UNDOFILE ', в директорииfilename'ndb_внутриnode_id_fsDataDirкаждого узла данных в кластере создаётся файл с именемfilename, гдеnode_id— идентификатор узла данных. Каждый файл журнала отката имеет размер, указанный в операторе SQL. Например, если в NDB Cluster 4 узла данных, то только что показанный операторALTER LOGFILE GROUPсоздаёт 4 файла журнала отката, по одному в директории данных каждого из 4 узлов данных; каждое из этих файлов имеет имяundo_2.log, и каждый файл имеет размер 12 МБ.UNDO_BUFFER_SIZEограничено объёмом доступной оперативной памяти.Дополнительную информацию об этих операторах см. в Разделе 15.1.16, «Оператор CREATE LOGFILE GROUP», и Разделе 15.1.6, «Оператор ALTER LOGFILE GROUP».
-
Теперь мы можем создать табличное пространство — абстрактный контейнер для файлов, используемых таблицами Дисковых данных для хранения данных. Табличное пространство ассоциировано с определённой группой файлов журнала; при создании нового табличного пространства необходимо указать группу файлов журнала, используемую для журналирования отката. Также необходимо указать как минимум один файл данных; после создания табличного пространства можно добавить больше файлов данных. Также можно удалить файлы данных из табличного пространства (см. примеры позже в этом разделе).
Предположим, что мы хотим создать табличное пространство с именем
ts_1, которое используетlg_1в качестве группы файлов журнала. Мы хотим, чтобы табличное пространство содержало два файла данных, названныеdata_1.datиdata_2.dat, с начальными размерами 32 МБ и 48 МБ соответственно. (Значение по умолчанию дляINITIAL_SIZEсоставляет 128 МБ.) Мы можем сделать это, используя два оператора 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;Оператор
CREATE TABLESPACEсоздаёт табличное пространствоts_1с файлом данныхdata_1.datи связываетts_1с группой файлов журналаlg_1. ОператорALTER TABLESPACEдобавляет второй файл данных (data_2.dat).Некоторые замечания:
Как и в случае с расширением файла
.log, используемым в этом примере для файлов журнала отката, расширение файла.datне имеет специального значения; оно используется только для лёгкого распознавания.Когда вы добавляете файл данных в табличное пространство, используя
ADD DATAFILE ', в директорииfilename'ndb_внутриnode_id_fsDataDirкаждого узла данных в кластере создаётся файл с именемfilename, гдеnode_id— идентификатор узла данных. Каждый файл данных имеет размер, указанный в операторе SQL. Например, если в NDB Cluster 4 узла данных, то только что показанный операторALTER TABLESPACEсоздаёт 4 файла данных, по одному в директории данных каждого из 4 узлов данных; каждый из этих файлов имеет имяdata_2.datи размер 48 МБ.NDBрезервирует 4% каждого табличного пространства для использования во время перезапуска узлов данных. Это пространство недоступно для хранения данных.Операторы
CREATE TABLESPACEдолжны содержать предложениеENGINE; только таблицы, использующие тот же движок хранилища, что и табличное пространство, могут быть созданы в этом табличном пространстве. ДляNDBтабличных пространств,ALTER TABLESPACEпринимает предложениеENGINEтолько дляALTER TABLESPACE ... ADD DATAFILE;ENGINEотклоняется для любого другого оператораALTER TABLESPACE. ДляNDBтабличных пространств, разрешённые значения для опцииENGINE—NDBCLUSTERиNDB.Распределение экстентов выполняется в режиме круговой очереди среди всех файлов данных, используемых данным табличным пространством.
Дополнительную информацию об операторах
CREATE TABLESPACEиALTER TABLESPACEсм. в Разделе 15.1.21, «Оператор CREATE TABLESPACE», и Разделе 15.1.10, «Оператор ALTER TABLESPACE».
-
Теперь можно создать таблицу, неиндексированные столбцы которой хранятся на диске, используя файлы в табличном пространстве
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 ts_1 STORAGE DISKсообщает движку хранилищаNDBиспользовать табличное пространствоts_1для хранения данных на диске.После создания таблицы
ts_1, как показано, можно выполнять операторыINSERT,SELECT,UPDATE, иDELETE, как и с любой другой MySQL таблицей.Также можно указать, хранится ли отдельный столбец на диске или в памяти, используя предложение
STORAGEв определении столбца в оператореCREATE TABLEилиALTER TABLE.STORAGE DISKвызывает хранение столбца на диске, аSTORAGE MEMORY— хранение в памяти. См. Раздел 15.1.20, «Оператор CREATE TABLE» для получения дополнительной информации.
Вы можете получить информацию о файлах данных на диске и файлах журнала отката, которые только что были созданы, выполнив запрос к таблице FILES в базе данных INFORMATION_SCHEMA, как показано ниже:
mysql> SELECT
FILE_NAME AS File, FILE_TYPE AS Type,
TABLESPACE_NAME AS Tablespace, TABLE_NAME AS Name,
LOGFILE_GROUP_NAME AS 'File group',
FREE_EXTENTS AS Free, TOTAL_EXTENTS AS Total
FROM INFORMATION_SCHEMA.FILES
WHERE ENGINE='ndbcluster';
+--------------+----------+------------+------+------------+------+---------+
| File | Type | Tablespace | Name | File group | Free | Total |
+--------------+----------+------------+------+------------+------+---------+
| ./undo_1.log | UNDO LOG | lg_1 | NULL | lg_1 | 0 | 4194304 |
| ./undo_2.log | UNDO LOG | lg_1 | NULL | lg_1 | 0 | 3145728 |
| ./data_1.dat | DATAFILE | ts_1 | NULL | lg_1 | 32 | 32 |
| ./data_2.dat | DATAFILE | ts_1 | NULL | lg_1 | 48 | 48 |
+--------------+----------+------------+------+------------+------+---------+
4 rows in set (0.00 sec)
Дополнительную информацию и примеры см. в Разделе 28.3.15, «Таблица INFORMATION_SCHEMA FILES».
Индексирование столбцов, неявно хранящихся на диске. Для таблицы dt_1, как определено в только что показанном примере, только столбцы dob и joined хранятся на диске. Это связано с тем, что есть индексы по столбцам id, last_name и first_name, поэтому данные, принадлежащие этим столбцам, хранятся в ОЗУ. Только неиндексированные столбцы могут храниться на диске; индексы и данные индексированных столбцов по-прежнему хранятся в памяти. Этот компромисс между использованием индексов и сохранением ОЗУ необходимо учитывать при проектировании таблиц Дисковых данных.
Нельзя добавить индекс к столбцу, который был явно объявлен STORAGE DISK, без предварительного изменения его типа хранения на MEMORY; любая попытка сделать это завершится ошибкой. Столбец, который неявно использует хранение на диске, может быть индексирован; при этом тип хранения столбца автоматически изменяется на MEMORY. Под “неявно” мы подразумеваем столбец, тип хранения которого не объявлен, но который унаследован от родительской таблицы. В следующем операторе CREATE 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, их можно индексировать. Здесь мы добавляем индексы к c2 и c3, соответственно, используя CREATE
INDEX и ALTER TABLE:
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
SHOW CREATE 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=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
Вы можете увидеть с помощью ndb_desc, что индексированные столбцы (выделенный текст) теперь используют хранение в памяти, а не на диске:
$> ./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
Примечание по производительности. Производительность кластера, использующего хранение данных на диске, значительно улучшается, если файлы данных на диске хранятся на отдельном физическом диске от файловой системы узла данных. Это необходимо сделать для каждого узла данных в кластере, чтобы получить заметную выгоду.
Вы можете использовать абсолютные и относительные пути к файловой системе с помощью ADD UNDOFILE и ADD
DATAFILE; относительные пути вычисляются относительно каталога данных узла данных.
Группа файлов журнала, табличное пространство и любые таблицы Disk Data, использующие их, должны быть созданы в определённом порядке. Это также верно для удаления этих объектов, с учётом следующих ограничений:
Группу файлов журнала нельзя удалить, пока какие-либо табличные пространства её используют.
Табличное пространство нельзя удалить, пока оно содержит какие-либо файлы данных.
Нельзя удалить файлы данных из табличного пространства, пока существуют таблицы, использующие это табличное пространство.
Невозможно удалить файлы, созданные в связи с другим табличным пространством, кроме того, с которым были созданы файлы.
Например, чтобы удалить все созданные в этой части объекты, можно использовать следующие операторы:
mysql> DROP TABLE dt_1;
mysql> ALTER TABLESPACE ts_1
-> DROP DATAFILE 'data_2.dat';
mysql> ALTER TABLESPACE ts_1
-> DROP DATAFILE 'data_1.dat';
mysql> DROP TABLESPACE ts_1;
mysql> DROP LOGFILE GROUP lg_1;
Эти операторы должны выполняться в указанном порядке, за исключением двух ALTER TABLESPACE ... DROP
DATAFILE операторов, которые можно выполнить в любом порядке.
Более старые версии NDB Cluster использовали предложение ENGINE с ALTER
TABLESPACE ... DROP DATAFILE и DROP
TABLESPACE. В NDB 8.4 и более поздних версиях оно больше не поддерживается ни с одним из этих операторов.
© 2025 Oracle
Licensed under the GPLv2 License.