21.6.11.1 Объекты данных на диске NDB Cluster
Хранение данных на диске NDB Cluster реализовано с помощью ряда объектов данных на диске. К ним относятся следующие:
Пространства имен служат контейнерами для других объектов данных на диске.
Журналы отката содержат информацию для отката транзакций.
Один или несколько журналов отката назначаются группе файлов журнала, которая, в свою очередь, назначается пространству имен.
Файлы данных хранят данные таблиц на диске. Файл данных назначается непосредственно пространству имен.
Журналы отката и файлы данных являются фактическими файлами в файловой системе каждого узла данных; по умолчанию они размещаются в ndb_ в node_id_fsDataDir, указанном в файле конфигурации NDB Cluster config.ini, где node_id — идентификатор узла данных. Можно разместить их в другом месте, указав абсолютный или относительный путь в имени файла при создании журнала отката или файла данных. Соответствующие инструкции показаны позже в этом разделе.
Пространства имен и группы файлов журналов NDB Cluster не реализованы как файлы.
Хотя не все объекты данных на диске реализованы как файлы, они все используют одно и то же имя пространства имён. Это означает, что каждый объект данных на диске должен иметь уникальное имя (а не только каждый объект данного типа). Например, вы не можете иметь пространство имен и группу файлов журнала с одинаковым именем dd1.
Предполагая, что у вас уже настроен NDB Cluster со всеми узлами (включая управляющие и SQL-узлы), основные шаги по созданию таблицы NDB Cluster на диске следующие:
-
Создайте группу файлов журнала и назначьте ей один или несколько файлов журнала отката (файл журнала отката также иногда называется файлом отката).
ПримечаниеФайлы журнала отката необходимы только для таблиц данных на диске; они не используются для таблиц
NDBCLUSTER, которые хранятся только в памяти. Создайте пространство имен; назначьте ему группу файлов журнала, а также один или несколько файлов данных.
Создайте таблицу данных на диске, использующую это пространство имен для хранения данных.
Все эти задачи можно выполнить с помощью 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 кластере может существовать не более одной группы файлов журнала в любой момент времени.
При добавлении файла журнала отката в группу файлов журнала с помощью
ADD UNDOFILE ', файл с именемfilename'filenameсоздаётся в каталогеndb_вnode_id_fsDataDirкаждого узла данных в кластере, гдеnode_id— идентификатор узла данных. Каждый файл журнала отката имеет размер, указанный в операторе SQL. Например, если NDB кластер имеет 4 узла данных, то только что показанный операторALTER LOGFILE GROUPсоздаёт 4 файла журнала отката, по одному на каждом узле данных в каталоге данных; каждый из этих файлов называетсяundo_2.logи имеет размер 12 МБ.UNDO_BUFFER_SIZEограничено объёмом доступной оперативной памяти.Для получения дополнительной информации об операторе
CREATE LOGFILE GROUP, см. Раздел 13.1.15, «Оператор CREATE LOGFILE GROUP». Для получения дополнительной информации обALTER LOGFILE GROUP, см. Раздел 13.1.5, «Оператор ALTER LOGFILE GROUP».
-
Теперь мы можем создать табличное пространство, которое содержит файлы, используемые NDB Cluster Disk Data таблицами для хранения данных. Табличное пространство также ассоциировано с определённой группой файлов журнала. При создании нового табличного пространства необходимо указать группу файлов журнала, которую следует использовать для журнала отката, а также указать файл данных. После создания табличного пространства можно добавить больше файлов данных в табличное пространство, а также удалить файлы данных из табличного пространства (пример удаления файлов данных приведён ниже в этом разделе).
Предположим, что мы хотим создать табличное пространство под названием
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 ENGINE NDBCLUSTER;Оператор
CREATE TABLESPACEсоздаёт табличное пространствоts_1с файлом данныхdata_1.datи связывает его с группой файлов журналаlg_1. ОператорALTER TABLESPACEдобавляет второй файл данных (data_2.dat).Некоторые замечания:
Как и в случае с расширением файла
.log, используемым в этом примере для файлов журнала отката, расширение файла.datне имеет особого значения; оно используется только для облегчения распознавания файлов данных.При добавлении файла данных в табличное пространство с помощью
ADD DATAFILE ', файл с именемfilename'filenameсоздаётся в каталогеndb_вnode_id_fsDataDirкаждого узла данных в кластере, гдеnode_id— идентификатор узла данных. Каждый файл данных имеет размер, указанный в операторе SQL. Например, если NDB кластер имеет 4 узла данных, то только что показанный операторALTER TABLESPACEсоздаёт 4 файла данных, по одному в каталоге данных каждого из 4 узлов данных; каждый из этих файлов называетсяdata_2.datи имеет размер 48 МБ.NDB 7.6 (и более поздние версии) резервирует 4% от каждого табличного пространства для использования во время перезапуска узлов данных. Это пространство недоступно для хранения данных.
Все
CREATE TABLESPACEиALTER TABLESPACEоператоры должны содержать разделENGINE; только таблицы, использующие тот же движок хранения, что и табличное пространство, могут быть созданы в нём. Для табличных пространств NDB Cluster допустимые значения для этой опции —NDBCLUSTERиNDB.Для получения дополнительной информации об операторах
CREATE TABLESPACEиALTER TABLESPACE, см. Раздел 13.1.19, «Оператор CREATE TABLESPACE» и Раздел 13.1.9, «Оператор 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 ... STORAGE DISKсообщает движку храненияNDBCLUSTERиспользовать табличное пространствоts_1для хранения данных на диске.После создания таблицы
ts_1, как показано выше, вы можете выполнять операторыINSERT,SELECT,UPDATEиDELETEс ней так же, как и с любой другой MySQL таблицей.Также можно указать, хранится ли тот или иной столбец на диске или в памяти, используя раздел
STORAGEв определении столбца в операторахCREATE TABLEилиALTER TABLE.STORAGE DISKуказывает на хранение столбца на диске, аSTORAGE MEMORY— на хранение в памяти. Дополнительная информация приведена в Разделе 13.1.18, «Оператор CREATE TABLE».
Индексирование столбцов, неявно хранящихся на диске. Для таблицы dt_1, определённой в только что показанном примере, на диске хранятся только столбцы dob и joined. Это связано с тем, что есть индексы по столбцам id, last_name и first_name, поэтому данные, относящиеся к этим столбцам, хранятся в оперативной памяти. Только неиндексированные столбцы могут храниться на диске; индексы и индексированные данные столбцов продолжают храниться в оперативной памяти. Этот компромисс между использованием индексов и сохранением оперативной памяти необходимо учитывать при проектировании таблиц Disk Data.
Нельзя добавить индекс к столбцу, явно объявленному как 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=latin1
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
NDBT_ProgramExit: 0 - OK
Примечание по производительности. Производительность кластера, использующего хранение данных на диске, значительно улучшается, если файлы данных на диске хранятся на отдельном физическом диске от файловой системы узла данных. Это необходимо сделать для каждого узла данных в кластере, чтобы получить заметное улучшение.
Вы можете использовать абсолютные и относительные пути к файловой системе с помощью ADD UNDOFILE и ADD
DATAFILE. Относительные пути рассчитываются относительно каталога данных узла данных. Вы также можете использовать символические ссылки; см. Раздел 21.6.11.2, «Использование символических ссылок с объектами данных на диске» для получения дополнительной информации и примеров.
Группа файлов журнала, пространство таблиц и любые таблицы данных на диске, использующие их, должны быть созданы в определенном порядке. То же самое относится к удалению любого из этих объектов:
Группа файлов журнала не может быть удалена, пока какие-либо пространства таблиц её используют.
Пространство таблиц не может быть удалено, пока оно содержит какие-либо файлы данных.
Вы не можете удалить какие-либо файлы данных из пространства таблиц, пока существуют какие-либо таблицы, использующие это пространство таблиц.
Невозможно удалить файлы, созданные в связи с другим пространством таблиц, отличным от того, с которым эти файлы были созданы. (Ошибка #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;
Эти инструкции должны быть выполнены в указанном порядке, за исключением того, что две ALTER TABLESPACE ... DROP
DATAFILE инструкции могут быть выполнены в любом порядке.
Вы можете получить информацию о файлах данных, используемых таблицами данных на диске, запросив таблицу FILES в базе данных INFORMATION_SCHEMA. Дополнительная “NULL строка” предоставляет дополнительную информацию о файлах журнала отката. Для получения дополнительной информации и примеров см. Раздел 24.3.9, «Таблица INFORMATION_SCHEMA FILES».
© 2025 Oracle
Licensed under the GPLv2 License.