21.6.7.3 Добавление узлов данных NDB Cluster онлайн: подробный пример
В этом разделе мы приводим подробный пример, иллюстрирующий, как добавить новые узлы данных NDB Cluster онлайн, начиная с NDB Cluster, имеющего 2 узла данных в одной группе узлов, и заканчивая кластером с 4 узлами данных в 2 группах узлов.
Начальная конфигурация. Для целей иллюстрации мы предполагаем минимальную конфигурацию и что кластер использует файл config.ini, содержащий только следующую информацию:
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
Мы оставили пробел в последовательности между идентификаторами узлов данных и другими узлами. Это упрощает в дальнейшем назначение идентификаторов узлов, которые еще не используются, новым узлам данных.
Мы также предполагаем, что вы уже запустили кластер с помощью соответствующей команды или параметров командной строки my.cnf, и что выполнение SHOW в клиенте управления дает вывод, аналогичный тому, что показан здесь:
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (5.7.44-ndb-7.5.36, Nodegroup: 0, *)
id=2 @198.51.100.2 (5.7.44-ndb-7.5.36, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (5.7.44-ndb-7.5.36)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (5.7.44-ndb-7.5.36)
id=21 @198.51.100.21 (5.7.44-ndb-7.5.36)
Наконец, мы предполагаем, что кластер содержит одну таблицу NDBCLUSTER, созданную, как показано здесь:
USE n;
CREATE TABLE ips (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
country_code CHAR(2) NOT NULL,
type CHAR(4) NOT NULL,
ip_address VARCHAR(15) NOT NULL,
addresses BIGINT UNSIGNED DEFAULT NULL,
date BIGINT UNSIGNED DEFAULT NULL
) ENGINE NDBCLUSTER;
Использование памяти и связанная информация, показанные позже в этом разделе, были получены после вставки примерно 50000 строк в эту таблицу.
В этом примере показан однопоточный ndbd, используемый для процессов узлов данных. Вы также можете применить этот пример, если используете многопоточный ndbmtd, заменив ndbmtd на ndbd во всех шагах, которые следуют далее.
Шаг 1: Обновить файл конфигурации. Откройте файл глобальной конфигурации кластера в текстовом редакторе и добавьте секции [ndbd], соответствующие 2 новым узлам данных. (Мы даем этим узлам данных идентификаторы 3 и 4 и предполагаем, что они будут запускаться на хост-машинах по адресам 198.51.100.3 и 198.51.100.4 соответственно.) После добавления новых секций содержимое файла config.ini должно выглядеть так, где добавления к файлу показаны жирным шрифтом:
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[ndbd]
Id = 3
HostName = 198.51.100.3
[ndbd]
Id = 4
HostName = 198.51.100.4
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
После внесения необходимых изменений сохраните файл.
Шаг 2: Перезапустить сервер управления. Перезапуск сервера управления требует выполнения отдельных команд для остановки сервера управления, а затем для его повторного запуска, как показано ниже:
-
Остановите сервер управления, используя команду клиента управления
STOP, как показано здесь:ndb_mgm>
10 STOPNode 10 has shut down. Disconnecting to allow Management Server to shutdown $> -
Поскольку остановка сервера управления приводит к завершению работы клиента управления, вы должны запустить сервер управления из командной оболочки. Для простоты мы предполагаем, что
config.iniнаходится в той же директории, что и двоичный файл сервера управления, но на практике вы должны указать правильный путь к файлу конфигурации. Вы также должны указать опцию--reloadили--initial, чтобы сервер управления читал новую конфигурацию из файла, а не из кэша конфигурации. Если текущая директория вашей оболочки совпадает с директорией, где расположен двоичный файл сервера управления, вы можете запустить сервер управления, как показано здесь:$>
ndb_mgmd -f config.ini --reload2008-12-08 17:29:23 [MgmSrvr] INFO -- NDB Cluster Management Server. 5.7.44-ndb-7.5.36 2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'
Если вы проверите вывод SHOW в клиенте управления после перезапуска процесса ndb_mgm, вы теперь увидите что-то вроде этого:
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (5.7.44-ndb-7.5.36, Nodegroup: 0, *)
id=2 @198.51.100.2 (5.7.44-ndb-7.5.36, Nodegroup: 0)
id=3 (not connected, accepting connect from 198.51.100.3)
id=4 (not connected, accepting connect from 198.51.100.4)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (5.7.44-ndb-7.5.36)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (5.7.44-ndb-7.5.36)
id=21 @198.51.100.21 (5.7.44-ndb-7.5.36)
Шаг 3: Выполнить поочередный перезапуск существующих узлов данных. Этот шаг можно выполнить полностью в клиенте управления кластером, используя команду RESTART, как показано здесь:
ndb_mgm> 1 RESTART
Node 1: Node shutdown initiated
Node 1: Node shutdown completed, restarting, no start.
Node 1 is being restarted
ndb_mgm> Node 1: Start initiated (version 7.5.36)
Node 1: Started (version 7.5.36)
ndb_mgm> 2 RESTART
Node 2: Node shutdown initiated
Node 2: Node shutdown completed, restarting, no start.
Node 2 is being restarted
ndb_mgm> Node 2: Start initiated (version 7.5.36)
ndb_mgm> Node 2: Started (version 7.5.36)
После выполнения каждой команды подождите, пока клиент управления не сообщит X
RESTARTNode перед продолжением дальнейших действий.X: Started
(version ...)
Вы можете проверить, что все существующие узлы данных были перезапущены с использованием обновленной конфигурации, проверив таблицу ndbinfo.nodes в клиенте mysql.
Шаг 4: Выполнить поочередный перезапуск всех узлов API кластера. Остановите и перезапустите каждый сервер MySQL, действующий как узел SQL в кластере, используя mysqladmin shutdown, за которым следует mysqld_safe (или другой скрипт запуска). Это должно быть аналогично тому, что показано здесь, где password — это пароль MySQL root для данного экземпляра сервера MySQL:
$> mysqladmin -uroot -ppassword shutdown
081208 20:19:56 mysqld_safe mysqld from pid file
/usr/local/mysql/var/tonfisk.pid ended
$> mysqld_safe --ndbcluster --ndb-connectstring=198.51.100.10 &
081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
081208 20:20:06 mysqld_safe Starting mysqld daemon with databases
from /usr/local/mysql/var
Конечно, точный ввод и вывод зависят от того, как и где MySQL установлен в системе, а также от выбранных опций для его запуска (и от того, указаны ли некоторые или все эти опции в файле my.cnf).
Шаг 5: Выполнить первоначальный запуск новых узлов данных. Из командной оболочки на каждом из хостов для новых узлов данных запустите узлы данных, как показано здесь, используя опцию --initial:
$> ndbd -c 198.51.100.10 --initial
В отличие от случая с перезапуском существующих узлов данных, вы можете запустить новые узлы данных одновременно; вам не нужно ждать завершения запуска одного из них перед запуском другого.
Подождите, пока оба новых узла данных не загрузятся, прежде чем переходить к следующему шагу. После того, как новые узлы данных загрузились, вы можете увидеть в выводе команды управления кластером SHOW, что они пока не принадлежат ни одной группе узлов (как указано жирным шрифтом здесь):
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (5.7.44-ndb-7.5.36, Nodegroup: 0, *)
id=2 @198.51.100.2 (5.7.44-ndb-7.5.36, Nodegroup: 0)
id=3 @198.51.100.3 (5.7.44-ndb-7.5.36, no nodegroup)
id=4 @198.51.100.4 (5.7.44-ndb-7.5.36, no nodegroup)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (5.7.44-ndb-7.5.36)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (5.7.44-ndb-7.5.36)
id=21 @198.51.100.21 (5.7.44-ndb-7.5.36)
Шаг 6: Создать новую группу узлов. Вы можете сделать это, выдав команду CREATE
NODEGROUP в клиенте управления кластером. Эта команда принимает в качестве аргумента список идентификаторов узлов данных, которые будут включены в новую группу узлов, как показано здесь:
ndb_mgm> CREATE NODEGROUP 3,4
Nodegroup 1 created
Выполнив SHOW снова, вы можете проверить, что узлы данных 3 и 4 присоединились к новой группе узлов (опять же, указано жирным шрифтом):
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @198.51.100.1 (5.7.44-ndb-7.5.36, Nodegroup: 0, *)
id=2 @198.51.100.2 (5.7.44-ndb-7.5.36, Nodegroup: 0)
id=3 @198.51.100.3 (5.7.44-ndb-7.5.36, Nodegroup: 1)
id=4 @198.51.100.4 (5.7.44-ndb-7.5.36, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @198.51.100.10 (5.7.44-ndb-7.5.36)
[mysqld(API)] 2 node(s)
id=20 @198.51.100.20 (5.7.44-ndb-7.5.36)
id=21 @198.51.100.21 (5.7.44-ndb-7.5.36)
Шаг 7: Перераспределить данные кластера. При создании группы узлов существующие данные и индексы не распределяются автоматически по узлам данных новой группы, как вы можете увидеть, выполнив соответствующую команду REPORT в клиенте управления:
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(177 32K pages of total 3200)
Node 1: Index usage is 0%(108 8K pages of total 12832)
Node 2: Data usage is 5%(177 32K pages of total 3200)
Node 2: Index usage is 0%(108 8K pages of total 12832)
Node 3: Data usage is 0%(0 32K pages of total 3200)
Node 3: Index usage is 0%(0 8K pages of total 12832)
Node 4: Data usage is 0%(0 32K pages of total 3200)
Node 4: Index usage is 0%(0 8K pages of total 12832)
Используя ndb_desc с опцией -p, которая включает в вывод информацию о разбиении, вы можете увидеть, что таблица все еще использует только 2 раздела (в разделе Per partition info вывода, показанном здесь жирным шрифтом):
$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 1
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 340
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 26086 26086 1572864 557056
1 26329 26329 1605632 557056
NDBT_ProgramExit: 0 - OK
Вы можете заставить данные перераспределяться среди всех узлов данных, выполнив для каждой таблицы NDB оператор ALTER
TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION в клиенте mysql.
ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE
PARTITION не работает с таблицами, созданными с опцией MAX_ROWS. Вместо этого используйте ALTER TABLE ... ALGORITHM=INPLACE,
MAX_ROWS=... для реорганизации таких таблиц.
Имейте в виду, что использование MAX_ROWS для установки количества разделов на таблицу устарело в NDB 7.5.4 и более поздних версиях, где вместо этого следует использовать PARTITION_BALANCE; см. Раздел 13.1.18.9, «Установка опций комментариев NDB» для получения дополнительной информации.
После выполнения оператора ALTER TABLE ips
ALGORITHM=INPLACE, REORGANIZE PARTITION вы можете увидеть с помощью ndb_desc, что данные для этой таблицы теперь хранятся с использованием 4 разделов, как показано здесь (с соответствующими частями вывода жирным шрифтом):
$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 16777217
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 341
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 4
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 12981 52296 1572864 557056
1 13236 52515 1605632 557056
2 13105 13105 819200 294912
3 13093 13093 819200 294912
NDBT_ProgramExit: 0 - OK
Обычно, ALTER
TABLE используется со списком идентификаторов разделов и набором определений разделов для создания новой схемы разбиения для таблицы, которая уже явно разбита. Его использование здесь для перераспределения данных на новый узел группы узлов NDB Cluster является исключением; когда используется таким образом, за ним не следуют другие ключевые слова или идентификаторы table_name
[ALGORITHM=INPLACE,] REORGANIZE PARTITIONREORGANIZE
PARTITION.
Для получения дополнительной информации см. Раздел 13.1.8, «Команда ALTER TABLE».
Кроме того, для каждой таблицы за операцией ALTER
TABLE должна следовать операция OPTIMIZE TABLE для освобождения от неиспользуемого места. Вы можете получить список всех NDBCLUSTER таблиц, выполнив следующий запрос к таблице схемы информации TABLES:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'NDBCLUSTER';
Значение INFORMATION_SCHEMA.TABLES.ENGINE для таблицы NDB Cluster всегда NDBCLUSTER, независимо от того, использовала ли операция CREATE TABLE для создания таблицы (или операция ALTER TABLE для преобразования существующей таблицы из другого хранилища) NDB или NDBCLUSTER в своем параметре ENGINE.
После выполнения этих команд в выводе ALL REPORT MEMORY можно увидеть, что данные и индексы теперь перераспределены между всеми узлами данных кластера, как показано здесь:
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(176 32K pages of total 3200)
Node 1: Index usage is 0%(76 8K pages of total 12832)
Node 2: Data usage is 5%(176 32K pages of total 3200)
Node 2: Index usage is 0%(76 8K pages of total 12832)
Node 3: Data usage is 2%(80 32K pages of total 3200)
Node 3: Index usage is 0%(51 8K pages of total 12832)
Node 4: Data usage is 2%(80 32K pages of total 3200)
Node 4: Index usage is 0%(50 8K pages of total 12832)
Поскольку одновременно может выполняться только одна операция DDL для NDBCLUSTER таблиц, необходимо дождаться завершения каждой операции ALTER TABLE ...
REORGANIZE PARTITION, прежде чем выполнять следующую.
Для NDBCLUSTER таблиц, созданных после добавления новых узлов данных, нет необходимости выполнять команды ALTER TABLE ...
REORGANIZE PARTITION; данные, добавленные в такие таблицы, распределяются по всем узлам данных автоматически. Однако в NDBCLUSTER таблицах, существовавших до добавления новых узлов, ни существующие, ни новые данные не распределяются с помощью новых узлов до тех пор, пока эти таблицы не будут перестроены с помощью ALTER TABLE ...
REORGANIZE PARTITION.
Альтернативный метод, без перестройки с роллинг-рестартом. Возможна конфигурация дополнительных узлов данных без их запуска при первом запуске кластера, чтобы избежать необходимости в перестройке с роллинг-рестартом. Предполагается, как и раньше, что вы хотите начать с двух узлов данных — узлов 1 и 2 — в одной группе узлов, а затем расширить кластер до четырех узлов данных, добавив вторую группу узлов, состоящую из узлов 3 и 4:
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 198.51.100.1
[ndbd]
Id = 2
HostName = 198.51.100.2
[ndbd]
Id = 3
HostName = 198.51.100.3
Nodegroup = 65536
[ndbd]
Id = 4
HostName = 198.51.100.4
Nodegroup = 65536
[mgm]
HostName = 198.51.100.10
Id = 10
[api]
Id=20
HostName = 198.51.100.20
[api]
Id=21
HostName = 198.51.100.21
Узлы данных, которые будут подключены позже (узлы 3 и 4), могут быть сконфигурированы с помощью NodeGroup = 65536, в этом случае узлы 1 и 2 могут быть запущены, как показано здесь:
$> ndbd -c 198.51.100.10 --initial
Узлы данных, сконфигурированные с помощью NodeGroup = 65536, воспринимаются сервером управления так, как будто вы запустили узлы 1 и 2 с помощью --nowait-nodes=3,4 после ожидания в течение периода времени, определяемого настройкой параметра конфигурации узла данных StartNoNodeGroupTimeout. По умолчанию это 15 секунд (15000 миллисекунд).
StartNoNodegroupTimeout должно быть одинаковым для всех узлов данных в кластере; по этой причине вы всегда должны задавать его в разделе [ndbd
default] файла config.ini, а не для отдельных узлов данных.
Когда вы готовы добавить вторую группу узлов, вам нужно выполнить только следующие дополнительные шаги:
-
Запустите узлы данных 3 и 4, вызвав процесс узла данных по одному для каждого нового узла:
$>
ndbd -c 198.51.100.10 --initial -
Выполните соответствующую команду
CREATE NODEGROUPв клиенте управления:ndb_mgm>
CREATE NODEGROUP 3,4 В клиенте mysql выполните команды
ALTER TABLE ... REORGANIZE PARTITIONиOPTIMIZE TABLEдля каждой существующейNDBCLUSTERтаблицы. (Как отмечено в другом месте в этом разделе, существующие таблицы NDB Cluster не могут использовать новые узлы для распределения данных до тех пор, пока это не будет сделано.)
© 2025 Oracle
Licensed under the GPLv2 License.