15.1.21.12 Настройка параметров комментариев NDB
Можно установить ряд параметров, специфичных для кластера NDB, в комментариях к таблице или столбцам таблицы NDB. Параметры уровня таблицы для управления чтением из любой реплики и балансировки партиций можно встроить в комментарий к таблице, используя NDB_TABLE.
NDB_COLUMN можно использовать в комментарии к столбцу для задания размера таблицы фрагментов BLOB, используемой для хранения фрагментов значений BLOB, устанавливая NDB на максимальное значение. Это работает для столбцов BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT и JSON. Комментарий к столбцу также может использоваться для управления внутренним размером столбца BLOB. Комментарии NDB_COLUMN не поддерживают столбцы TINYBLOB или TINYTEXT, поскольку они имеют только внутреннюю часть фиксированного размера и не имеют отдельных фрагментов для хранения в другом месте.
NDB_TABLE можно использовать в комментарии к таблице для настройки параметров, связанных с балансировкой партиций и полным дублированием таблицы, среди прочего.
Остальная часть этого раздела описывает эти параметры и их использование.
Параметры NDB_COLUMN
В кластере NDB комментарий к столбцу в операторе CREATE
TABLE или ALTER TABLE также может использоваться для указания параметра NDB_COLUMN. NDB поддерживает два параметра комментариев к столбцам BLOB_INLINE_SIZE и MAX_BLOB_PART_SIZE. Синтаксис этих параметров показан здесь:
COMMENT 'NDB_COLUMN=speclist'
speclist := spec[,spec]
spec :=
BLOB_INLINE_SIZE=value
| MAX_BLOB_PART_SIZE[={0|1}]
BLOB_INLINE_SIZE задаёт количество байтов, которые должны храниться в строке столбца; ожидаемое значение — целое число в диапазоне от 1 до 29980 включительно. Установка значения больше 29980 приводит к ошибке; установка значения меньше 1 разрешена, но используется значение по умолчанию для размера внутреннего хранения типа столбца.
Следует учитывать, что максимальное значение для этого параметра фактически представляет собой максимальное количество байтов, которые могут храниться в одной строке таблицы NDB; каждый столбец в строке вносит свой вклад в эту сумму.
Также следует помнить, особенно при работе со столбцами TEXT, что значение, установленное с помощью MAX_BLOB_PART_SIZE или BLOB_INLINE_SIZE, представляет размер столбца в байтах. Оно не указывает количество символов, которое варьируется в зависимости от набора символов и сортировки, используемых столбцом.
Чтобы увидеть влияние этого параметра, сначала создайте таблицу с двумя столбцами BLOB, один (b1) без дополнительных параметров, а другой (b2) с настройкой для BLOB_INLINE_SIZE, как показано здесь:
mysql> CREATE TABLE t1 (
-> a INT NOT NULL PRIMARY KEY,
-> b1 BLOB,
-> b2 BLOB COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=8000'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)
Вы можете посмотреть настройки BLOB_INLINE_SIZE для столбцов BLOB, запросив таблицу ndbinfo.blobs, например так:
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't1';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| b1 | 256 | 2000 |
| b2 | 8000 | 2000 |
+-------------+-------------+----------------+
2 rows in set (0.01 sec)
Также можно проверить вывод утилиты ndb_desc, как показано здесь, с соответствующими строками, отображёнными с использованием выделения текста:
$> ndb_desc -d test t1
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 945
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 2
FragmentCount: 2
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options: readbackup
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
b1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_1
b2 Blob(8000,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_2
-- Indexes --
PRIMARY KEY(a) - UniqueHashIndex
PRIMARY(a) - OrderedIndex
BLOB_INLINE_SIZE не разрешено для столбцов TINYBLOB и вызывает предупреждение, если используется.
Для MAX_BLOB_PART_SIZE знак = и значение, за ним идущее, необязательны. Использование любого значения, отличного от 0 или 1, приведёт к синтаксической ошибке.
Влияние использования MAX_BLOB_PART_SIZE в комментарии к столбцу заключается в установке размера фрагмента BLOB столбца TEXT или BLOB на максимальное количество байтов, поддерживаемое для этого NDB (13948). Этот параметр может быть применён к любому типу столбца BLOB, поддерживаемому MySQL, за исключением TINYBLOB или TINYTEXT (BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT). В отличие от BLOB_INLINE_SIZE, MAX_BLOB_PART_SIZE не оказывает никакого влияния на столбцы JSON.
Чтобы увидеть влияние этого параметра, сначала выполним следующее SQL-предложение в клиенте mysql для создания таблицы с двумя столбцами BLOB, один (c1) без дополнительных параметров, а другой (c2) с MAX_BLOB_PART_SIZE:
mysql> CREATE TABLE test.t2 (
-> p INT PRIMARY KEY,
-> c1 BLOB,
-> c2 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)
Из командной оболочки выполните утилиту ndb_desc для получения информации о только что созданной таблице, как показано в этом примере:
$> ndb_desc -d test t2
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_1
c2 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex
Информация о столбцах в выводе приведена в разделе Attributes; для столбцов c1 и c2 она отображается здесь с выделением текста. Для c1 размер фрагмента BLOB составляет 2000, значение по умолчанию; для c2 он составляет 13948, как задано MAX_BLOB_PART_SIZE.
Вы также можете запросить таблицу ndbinfo.blobs, чтобы увидеть это, как показано здесь:
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 256 | 2000 |
| c2 | 256 | 13948 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
Вы можете изменить размер фрагмента BLOB для данного столбца BLOB таблицы NDB с помощью оператора ALTER
TABLE, например такого, и проверить изменения позднее с помощью SHOW CREATE
TABLE:
mysql> ALTER TABLE test.t2
-> DROP COLUMN c1,
-> ADD COLUMN c1 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
-> CHANGE COLUMN c2 c2 BLOB AFTER c1;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE test.t2\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t2` (
`p` int(11) NOT NULL,
`c1` blob COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
`c2` blob,
PRIMARY KEY (`p`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> EXIT
Bye
Вывод ndb_desc показывает, что размеры фрагментов BLOB столбцов были изменены как ожидалось:
$> ndb_desc -d test t2
-- t --
Version: 16777220
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_1
c2 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex
Вы также можете увидеть изменение, повторно выполнив запрос к таблице ndbinfo.blobs:
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 256 | 13948 |
| c2 | 256 | 2000 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
Возможно задать как BLOB_INLINE_SIZE, так и MAX_BLOB_PART_SIZE для столбца BLOB, как показано в этом операторе CREATE TABLE:
mysql> CREATE TABLE test.t3 (
-> p INT NOT NULL PRIMARY KEY,
-> c1 JSON,
-> c2 JSON COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=5000,MAX_BLOB_PART_SIZE'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.28 sec)
Запрос таблицы blobs показывает нам, что оператор работал как ожидалось:
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't3';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 4000 | 8100 |
| c2 | 5000 | 8100 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
Вы также можете проверить, что оператор сработал, проверив вывод утилиты ndb_desc.
Изменение размера фрагмента BLOB столбца должно выполняться с использованием копирующего ALTER TABLE; данная операция не может быть выполнена онлайн (см. Раздел 25.6.12, “Операции в режиме онлайн с ALTER TABLE в кластере NDB”).
Для получения дополнительной информации о том, как NDB хранит столбцы типов BLOB, см. Требования к хранению типов строк.
Параметры NDB_TABLE
Для таблицы кластера NDB комментарий к таблице в операторе CREATE
TABLE или ALTER TABLE также может использоваться для указания параметра NDB_TABLE, который состоит из одной или нескольких пар имя-значение, разделённых запятыми при необходимости, следующих за строкой NDB_TABLE=. Полный синтаксис для имен и значений показан здесь:
COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"
ndb_table_option: {
NOLOGGING={1 | 0}
| READ_BACKUP={1 | 0}
| PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
| FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
| FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
| FULLY_REPLICATED={1 | 0}
}
Пробелы внутри строкового значения не допускаются. Строка регистронезависима.
Четыре NDB параметра таблицы, которые могут быть заданы в виде комментария, описаны более подробно в следующих разделах.
NOLOGGING: По умолчанию таблицы NDB регистрируются и выполняется проверка состояния. Это обеспечивает их надёжность при сбоях всего кластера. Использование NOLOGGING при создании или изменении таблицы означает, что эта таблица не регистрируется в журнале изменений или не включается в локальные контрольные точки. В этом случае таблица по-прежнему реплицируется по узлам данных для высокой доступности и обновляется с помощью транзакций, но изменения, внесённые в неё, не записываются в журналы изменений узлов данных и их содержимое не записывается на диск в контрольных точках; при восстановлении после сбоя кластера кластер сохраняет определение таблицы, но не сохраняет ни одной её строки — то есть таблица пуста.
Использование таких таблиц без регистрации уменьшает нагрузку узлов данных на ввод-вывод на диске и хранение, а также вычисления для создания контрольных точек. Это может быть уместно для краткосрочных данных, которые часто обновляются, и при этом потеря всех данных в случае редкого полного сбоя кластера приемлема.
Также можно использовать системную переменную ndb_table_no_logging, чтобы любые таблицы NDB, созданные или изменённые, пока эта переменная активна, вели себя так, как будто они были созданы с комментарием NOLOGGING. В отличие от прямого использования комментария, в выводе SHOW CREATE TABLE в этом случае нет ничего, что указывало бы на то, что это таблица без регистрации. Рекомендуется использовать подход с комментарием к таблице, так как он предоставляет управление функцией на уровне таблицы, и эта часть схемы таблицы встроена в оператор создания таблицы, где она легко находится инструментами, основанными на SQL.
READ_BACKUP: Установка этого параметра в 1 эквивалентна включению ndb_read_backup; позволяет чтение с любой реплики. Это значительно улучшает производительность чтения из таблицы с относительно небольшими затратами на производительность записи. 1 является значением по умолчанию для READ_BACKUP, а значение по умолчанию для ndb_read_backup — ON (ранее чтение с любой реплики было отключено по умолчанию).
Вы можете установить READ_BACKUP для существующей таблицы онлайн, используя оператор ALTER TABLE, аналогичный одному из показанных здесь:
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";
Для получения дополнительной информации об опции ALGORITHM для ALTER TABLE, см. Раздел 25.6.12, «Online Operations with ALTER TABLE in NDB Cluster».
PARTITION_BALANCE: Предоставляет дополнительный контроль над назначением и размещением партиций. Поддерживаются следующие четыре схемы:
-
FOR_RP_BY_NODE: Одна партиция на узел.Только один LDM на каждом узле хранит основную партицию. Каждая партиция хранится в том же LDM (с тем же идентификатором) на всех узлах.
-
FOR_RA_BY_NODE: Одна партиция на группу узлов.Каждый узел хранит одну партицию, которая может быть основной репликой или резервной репликой. Каждая партиция хранится в одном и том же LDM на всех узлах.
-
FOR_RP_BY_LDM: Одна партиция для каждого LDM на каждом узле; значение по умолчанию.Это значение используется, если
READ_BACKUPустановлено в 1. -
FOR_RA_BY_LDM: Одна партиция на каждый LDM в каждой группе узлов.Эти партиции могут быть основными или резервными.
-
FOR_RA_BY_LDM_X_2: Две партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть основными или резервными.
-
FOR_RA_BY_LDM_X_3: Три партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть основными или резервными.
-
FOR_RA_BY_LDM_X_4: Четыре партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть основными или резервными.
PARTITION_BALANCE является предпочтительным интерфейсом для установки количества партиций на таблицу. Использование MAX_ROWS для принудительного задания количества партиций устарело, но продолжает поддерживаться для обратной совместимости; оно может быть удалено в будущих выпусках MySQL NDB Cluster. (Ошибка #81759, Ошибка #23544301)
FULLY_REPLICATED управляет тем, полностью ли реплицируется таблица, то есть, содержит ли каждый узел данных полную копию таблицы. Чтобы включить полную репликацию таблицы, используйте FULLY_REPLICATED=1.
Этот параметр также можно контролировать с помощью системной переменной ndb_fully_replicated. Установка ее значения в ON по умолчанию включает этот параметр для всех новых NDB таблиц; значение по умолчанию — OFF. Системная переменная ndb_data_node_neighbour также используется для полностью реплицированных таблиц, чтобы обеспечить, что при доступе к полностью реплицированной таблице мы обращаемся к узлу данных, локальному для этого сервера MySQL.
Пример оператора CREATE TABLE, использующего такой комментарий при создании таблицы NDB, приведен здесь:
mysql> CREATE TABLE t1 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> c2 VARCHAR(100),
> c3 VARCHAR(100) )
> ENGINE=NDB
>
COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";
Комментарий отображается в выводе SHOW CREATE TABLE. Текст комментария также доступен при запросе к таблице схемы MySQL Information Schema TABLES, как в этом примере:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
Этот синтаксис комментария также поддерживается с операторами ALTER TABLE для NDB таблиц, как показано здесь:
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
Столбец TABLE_COMMENT отображает комментарий, необходимый для повторного создания таблицы после выполнения оператора ALTER TABLE, как показано здесь:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
-> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
Имейте в виду, что комментарий к таблице, используемый с ALTER
TABLE, заменяет любой существующий комментарий, который может быть у таблицы.
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
Вы также можете увидеть значение опции PARTITION_BALANCE в выводе программы ndb_desc. ndb_desc также отображает, установлены ли опции READ_BACKUP и FULLY_REPLICATED для таблицы. Для получения дополнительной информации см. описание этой программы.
© 2025 Oracle
Licensed under the GPLv2 License.