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'filenameсоздаётся в каталогеndb_вnode_id_fsDataDirкаждого узла данных в кластере, гдеnode_id— идентификатор узла данных. Каждый файл журнала отката имеет размер, указанный в операторе SQL. Например, если в кластере NDB Cluster 4 узла данных, тоALTER LOGFILE GROUPоператор, показанный выше, создаёт 4 файла журнала отката, по одному на каждом узле данных; каждый из этих файлов называетсяundo_2.logи имеет размер 12 МБ.UNDO_BUFFER_SIZEограничено объёмом доступной оперативной памяти.Более подробную информацию об этих операторах см. в разделе 15.1.17, «Оператор 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'filenameсоздаётся в каталогеndb_вnode_id_fsDataDirкаждого узла данных в кластере, гдеnode_id— идентификатор узла данных. Каждый файл данных имеет размер, указанный в операторе SQL. Например, если в кластере NDB Cluster 4 узла данных, то операторALTER TABLESPACE, который был показан выше, создаёт 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.22, «Оператор 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.21, «Оператор 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, которые могут быть выполнены в любом порядке.
© 2025 Oracle
Licensed under the GPLv2 License.