Онлайн расширение кластера через командную строку

Если вы предпочитаете выполнять расширение кластера с помощью командной строки, YMatrix предоставляет соответствующие инструменты и SQL-заявки для поддержки гибкого и бесшовного масштабирования. Расширение кластера обычно состоит из двух этапов: добавление новых узлов и перераспределение данных.

Добавление новых узлов — это быстрая операция, которая может быть завершена без простоя в YMatrix. Перераспределение данных, однако, является более сложной задачей. По умолчанию любая новая таблица распределяется по всем узлам. Во время перераспределения таблицы или партиции блокируются и становятся недоступными для чтения и записи, что может вызывать блокировки.

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

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

1 Планирование системы

Перед выполнением расширения необходимо тщательно спланировать систему. Ниже приведён контрольный список, описывающий полный рабочий процесс расширения.

Этап Задача
Подготовка
1 Установите ту же версию программного обеспечения YMatrix на новых хостах
2 Проверьте состояние кластера
3 Убедитесь в совпадении версии ПО
4 Добавьте имена хостов в системные файлы
Расширение
5 Выполните расширение
Проверка после расширения
6 Просмотрите обновлённую конфигурацию кластера
7 Проверьте распределение данных

После расширения и до начала перераспределения данных тщательно спланируйте стратегию перераспределения.

Например, временные ряды, разделённые по времени, часто демонстрируют чёткие характеристики "горячих"/"холодных" данных (относительное понятие, основанное на частоте запросов — часто запрашиваемые данные считаются «горячими»). Со временем горячие данные становятся холодными, а спрос на них снижается. Выделение дополнительных ресурсов для запросов к холодным данным неэффективно, поэтому полное перераспределение необязательно. В таких случаях лучше заранее определить стратегию распределения для новых данных при создании таблицы. Возможность плавного расширения YMatrix позволяет реализовать такой подход.

Напротив, если большинство таблиц не разделены на партиции или разделены с равномерными паттернами доступа и постоянными вставками по всем партициям, более подходящим является полное перераспределение данных.

Для перераспределения всех данных следуйте шагам из Таблицы 1.

Таблица 1

Этап Задача
Перераспределение данных
1 Выполните команду полного перераспределения данных
Задачи после перераспределения
2 Проверьте текущий статус перераспределения
3 Убедитесь в корректности распределения данных

Для выполнения плавного расширения обратитесь к Таблице 2 ниже.
Предоставлено четыре различных метода; выберите один в соответствии с вашими потребностями.

Таблица 2

Метод Плавное расширение
(1) Создайте требуемый набор сегментов (CREATE SEGMENT_SET), затем укажите его при создании новых таблиц или партиций
(2) Укажите существующий набор сегментов (созданный до расширения) при создании таблицы
(3) Не указывайте набор сегментов для новых таблиц; используйте набор узлов, определённый параметром mx_default_segment_set (по умолчанию: глобальное распределение по всем узлам)
(4) Перераспределите только выбранные старые данные, обрабатывая новые данные отдельно. Используйте ALTER TABLE SET SEGMENT_SET для перераспределения старых данных. Для новых данных примените один из методов (1), (2) или (3) выше

2 Подготовка

Ниже приведены пошаговые инструкции. Предположим, что ваш текущий кластер включает три сервера: mdw, sdw1 и sdw2. Вы планируете добавить два новых компьютера: sdw3 и sdw4.
Тестовая среда содержит пример таблицы test с 100 строками тестовых данных.

=# CREATE EXTENSION matrixts;
=# CREATE TABLE test (a int, b int) USING MARS3 DISTRIBUTED BY (a) ORDER BY (a);
=# INSERT INTO test SELECT i, i+10 FROM generate_series(1, 100) AS i;

2.1 Установка совместимого программного обеспечения YMatrix на новых хостах

Сначала установите ту же версию программного обеспечения YMatrix на двух новых хостах, которые будут добавлены в кластер. Подробные инструкции по развертыванию см. в разделе Онлайн развертывание кластера, части 1–3.

2.2 Проверка состояния кластера

Затем запросите каталогную таблицу gp_segment_configuration, чтобы проверить состояние кластера и убедиться, что все экземпляры сегментов работоспособны.

=# SELECT * FROM gp_segment_configuration ORDER BY 1 ASC;

dbid | content | role | preferred_role | mode | status | port | hostname | address |                datadir                
------+---------+------+----------------+------+--------+------+----------+---------+---------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /data/mxdata/master/mxseg-1
    2 |       0 | p    | p              | n    | u      | 6000 | sdw1     | sdw1    | /data/mxdata/primary/mxseg0
    3 |       1 | p    | p              | n    | u      | 6001 | sdw1     | sdw1    | /data/mxdata/primary/mxseg1
    4 |       2 | p    | p              | n    | u      | 6000 | sdw2     | sdw2    | /data/mxdata/primary/mxseg2
    5 |       3 | p    | p              | n    | u      | 6001 | sdw2     | sdw2    | /data/mxdata/primary/mxseg3
(5 rows)

2.3 Проверка версии программного обеспечения

Используйте функцию version(), чтобы убедиться, что версия YMatrix одинакова на всех узлах.

=# SELECT version();

2.4 Добавление имён хостов в системные файлы

После подтверждения исправности кластера и совпадения версий настройте файл /etc/hosts с правами root на всех узлах, добавив новые имена хостов. Убедитесь в сохранении сетевой связности на протяжении всего процесса.

[<username>@mdw ~]$ sudo vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.247.128 mdw
192.168.247.129 sdw1
192.168.247.130 sdw2
192.168.247.131 sdw3
192.168.247.132 sdw4

3 Выполнение расширения

Примечание!
Все операции расширения должны выполняться на Master-узле.

3.1 Сбор текущей информации о кластере

$ sudo /opt/ymatrix/matrixdb6/bin/mxctl expand init > /tmp/init_output

Это создаст структурированную информацию о кластере в каталоге /tmp/init_output.

3.2 Добавление новых хостов

$ cat /tmp/init_output | sudo /opt/ymatrix/matrixdb6/bin/mxctl expand add --host newhost1 > /tmp/add.1
$ cat /tmp/add.1 | sudo /opt/ymatrix/matrixdb6/bin/mxctl expand add --host newhost2 > /tmp/add.2
...

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

3.3 Тестирование сетевой связности

$ cat /tmp/add.3 | sudo /opt/ymatrix/matrixdb6/bin/mxctl expand netcheck > /tmp/ncheck

Если код возврата (echo $?) больше 0, тест связности завершился неудачно.

3.4 Генерация плана расширения

$ cat /tmp/ncheck | sudo /opt/ymatrix/matrixdb6/bin/mxbox deployer expand > /tmp/exandplan

Сгенерированный файл /tmp/exandplan содержит все параметры конфигурации, включая пути к каталогам, количество сегментов и политики размещения зеркал. Опытные пользователи могут напрямую редактировать этот файл.

3.5 Выполнение плана расширения

$ cat /tmp/exandplan | sudo /opt/ymatrix/matrixdb6/bin/mxbox deployer exec

Поздравляем! Расширение успешно завершено.

4 Проверка после расширения

4.1 Просмотр обновлённой конфигурации кластера

=# SELECT * FROM gp_segment_configuration ORDER BY 1;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |                datadir                
------+---------+------+----------------+------+--------+------+----------+---------+---------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata_20220331173619/master/mxseg-1
    2 |       0 | p    | p              | n    | u      | 6000 | sdw1     | sdw1    | /mxdata_20220331173619/primary/mxseg0
    3 |       1 | p    | p              | n    | u      | 6001 | sdw1     | sdw1    | /mxdata_20220331173619/primary/mxseg1
    4 |       2 | p    | p              | n    | u      | 6000 | sdw2     | sdw2    | /mxdata_20220331173619/primary/mxseg2
    5 |       3 | p    | p              | n    | u      | 6001 | sdw2     | sdw2    | /mxdata_20220331173619/primary/mxseg3
    6 |       4 | p    | p              | n    | u      | 6000 | sdw3     | sdw3    | /mxdata_20220331173619/primary/mxseg4
    7 |       5 | p    | p              | n    | u      | 6001 | sdw3     | sdw3    | /mxdata_20220331173619/primary/mxseg5
    8 |       6 | p    | p              | n    | u      | 6000 | sdw4     | sdw4    | /mxdata_20220331173619/primary/mxseg6
    9 |       7 | p    | p              | n    | u      | 6001 | sdw4     | sdw4    | /mxdata_20220331173619/primary/mxseg7
(9 rows)

4.2 Проверка распределения данных

Используйте следующий SQL-запрос, чтобы просмотреть, как распределены существующие данные таблицы по исходным сегментам. Сейчас — подходящее время для планирования новой стратегии распределения.

=# SELECT gp_segment_id, count(*) FROM public.test GROUP BY gp_segment_id;

5 Планирование распределения данных

Перед перераспределением данных помните, что перераспределение — это критически важная и трудоёмкая задача после расширения.

До расширения бизнес-данные находились только на старых сегментах. После добавления новых узлов равномерное перераспределение существующих данных по всем текущим узлам называется «перераспределением данных». При согласовании с паттернами нагрузки перераспределение значительно улучшает производительность запросов. Однако некорректное перераспределение тратит время и ресурсы. Поэтому тщательное планирование крайне важно.

Доступны два подхода. На основе вашего сценария временных рядов выберите один.

5.1 Полное перераспределение данных

Новые сегменты изначально не содержат данных. Используйте приведённый ниже метод для перераспределения всех существующих данных по расширенному кластеру. Вы можете запланировать операцию или выполнить её немедленно.

Примечание!
Рекомендуется выполнять перераспределение в часы низкой нагрузки.

Немедленное выполнение:

$ sudo /opt/ymatrix/matrixdb6/bin/mxctl expand redistribute

Запланированное выполнение:

$ sudo /opt/ymatrix/matrixdb6/bin/mxctl expand redistribute --schedule "2022-07-20 22:00:00"

Вы можете изменить расписание до наступления запланированного времени. Удалите параметр --schedule, чтобы немедленно запустить перераспределение.

Во время и после перераспределения отслеживайте прогресс с помощью системных таблиц в разделе Системные каталоги расширения. Повторно проверьте распределение данных с помощью:

=# SELECT gp_segment_id, count(*) FROM public.test GROUP BY gp_segment_id;

5.2 Частичное перераспределение (плавное расширение)

Этот подход в YMatrix называется плавным расширением. Как планировалось ранее, выберите один из четырёх доступных методов в соответствии с вашими реальными требованиями.

Метод Плавное расширение
(1) Создайте требуемый набор сегментов (CREATE SEGMENT_SET), затем назначьте его при создании новых таблиц или партиций
(2) Непосредственно укажите существующий набор сегментов (созданный до расширения) при создании таблицы
(3) Не указывайте набор сегментов; используйте набор узлов, определённый параметром mx_default_segment_set (по умолчанию: все узлы)
(4) Некоторые старые данные также требуют перераспределения. Обрабатывайте старые и новые данные отдельно: используйте ALTER TABLE SET SEGMENT_SET для старых данных; для новых данных примените один из методов (1), (2) или (3)

5.2.1 Создание нового набора сегментов

Используйте SQL-команду CREATE SEGMENT_SET для создания нового набора сегментов в YMatrix.

=# CREATE SEGMENT_SET name SEGMENTS (content_id, ...);

5.2.2 Указание существующего набора сегментов

Используйте SQL для назначения уже созданного набора сегментов при определении таблицы. Примеры:

=# CREATE TABLE t1(a int, b int) USING MARS3 DISTRIBUTED BY(a) SEGMENT_SET ss1 ORDER BY (a);
=# CREATE TABLE t1(a int, b int) USING MARS3 DISTRIBUTED REPLICATED SEGMENT_SET ss1 ORDER BY (a);
=# CREATE TABLE t1(a int, b int) USING MARS3 DISTRIBUTED RANDOMLY SEGMENT_SET ss1 ORDER BY (a);

Дополнительную информацию см. в разделе CREATE SEGMENT_SET.

5.2.3 Использование набора сегментов по умолчанию

При создании новой таблицы без указания набора сегментов данные распределяются в соответствии с набором узлов, определённым параметром mx_default_segment_set. По умолчанию это все узлы кластера. Измените значение по умолчанию с помощью команды SET:

=# SET mx_default_segment_set TO 'ss1';

5.2.4 Перераспределение выбранных старых данных

Когда некоторые существующие данные также требуют перераспределения, обрабатывайте старые и новые данные отдельно. Используйте команду ALTER TABLE SET SEGMENT_SET для перераспределения старых данных. Для новых данных примените один из методов, описанных в разделах 5.2.1, 5.2.2 или 5.2.3.

Пример: Переместите существующую таблицу t в набор сегментов ss1.

=# ALTER TABLE t SET SEGMENT_SET ss1;

Альтернативно, перераспределите таблицу t по всем узлам после расширения:

=# ALTER TABLE t SET SEGMENT_SET all_segments;

#or

=# ALTER TABLE t EXPAND TABLE;

Ваше расширение кластера через командную строку завершено!

Примечание!
После расширения через командную строку перезапустите mxui для перезагрузки топологии кластера и повторного развёртывания всех экземпляров mxui_collector.
Используйте следующую команду: /opt/ymatrix/matrixdb6/bin/supervisorctl restart mxui