Spec-Zone.ru › MySQL 8.4

25.6.11.1 Объекты данных на диске NDB Cluster

Хранение данных на диске NDB Cluster реализовано с использованием следующих объектов:

  • Пространство имен: Выступает в качестве контейнера для других объектов данных на диске. Пространство имен содержит один или несколько файлов данных и одну или несколько групп файлов журнала отката.

  • Файл данных: Хранит данные столбцов. Файл данных напрямую назначается пространству имен.

  • Файл журнала отката: Содержит информацию отката, необходимую для отмены транзакций. Назначается группе файлов журнала отката.

  • Группа файлов журнала: Содержит один или несколько файлов журнала отката. Назначается пространству имен.

Файлы журнала отката и файлы данных являются фактическими файлами в файловой системе каждого узла данных; по умолчанию они размещаются в ndb_node_id_fs в DataDir, указанном в файле конфигурации NDB Cluster config.ini, где node_id — идентификатор узла данных. Размещение этих файлов в других местах возможно, указав абсолютный или относительный путь в имени файла при создании файла журнала отката или файла данных. Команды для создания этих файлов показаны далее в этом разделе.

Файлы журнала отката используются только таблицами данных на диске и не нужны или не используются таблицами NDB, которые хранятся только в памяти.

Пространства имен и группы файлов журнала NDB Cluster не реализованы как файлы.

Хотя не все объекты данных на диске реализованы как файлы, все они используют одно и то же пространство имен. Это означает, что каждый объект данных на диске должен иметь уникальное имя (а не только каждый объект данных данного типа). Например, вы не можете иметь пространство имен и группу файлов журнала, оба с именем dd1.

Предполагая, что вы уже настроили NDB Cluster со всеми узлами (включая управляющие и SQL-узлы), основные шаги по созданию таблицы NDB Cluster на диске следующие:

  1. Создайте группу файлов журнала и назначьте один или несколько файлов журнала отката (файл журнала отката также иногда называется файлом отката).

  2. Создайте пространство имен; назначьте группу файлов журнала, а также один или несколько файлов данных пространству имен.

  3. Создайте таблицу данных на диске, использующую это пространство имен для хранения данных.

Каждая из этих задач может быть выполнена с помощью SQL-запросов в клиенте mysql или другом приложении-клиенте MySQL, как показано в следующем примере.

  1. Мы создаём группу файлов журнала с именем 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_fs внутри DataDir каждого узла данных в кластере создаётся файл с именем 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».

  2. Теперь мы можем создать табличное пространство — абстрактный контейнер для файлов, используемых таблицами Дисковых данных для хранения данных. Табличное пространство ассоциировано с определённой группой файлов журнала; при создании нового табличного пространства необходимо указать группу файлов журнала, используемую для журналирования отката. Также необходимо указать как минимум один файл данных; после создания табличного пространства можно добавить больше файлов данных. Также можно удалить файлы данных из табличного пространства (см. примеры позже в этом разделе).

    Предположим, что мы хотим создать табличное пространство с именем 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_fs внутри DataDir каждого узла данных в кластере создаётся файл с именем 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».

  3. Теперь можно создать таблицу, неиндексированные столбцы которой хранятся на диске, используя файлы в табличном пространстве 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/mysql-cluster-disk-data-objects.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API