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

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

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

В YMatrix мы предоставляем функцию Smooth scaling для реализации этого требования. Создав объект 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();
                                                                                                                                    version

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12 (MatrixDB 5.0.0-enterprise) (Greenplum Database 7.0.0+dev.17976.g99b559cbeb build commit:99b559cbebca8c47dfb2de58fb10b6e2a04f91a0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5), 64-bit
compiled on Aug 16 2022 16:18:55
(1 row)

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

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

[<普通用户名>@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/matrixdb5/bin/mxctl expand init > /tmp/init_output

Информация о текущем кластере выводится в директорию /tmp/init_output в виде структурированных данных.

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

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

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

3.3 Проверка сетевой взаимосвязи

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

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

3.4 Генерация плана масштабирования

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

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

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

$ cat /tmp/exandplan | sudo /opt/ymatrix/matrixdb5/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/matrixdb5/bin/mxctl expand redistribute

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

$ sudo /opt/ymatrix/matrixdb5/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-запросы в YMatrix для указания созданной коллекции узлов. Например:

=# 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 Использование значений по умолчанию

Создайте новую таблицу в YMatrix. Если вы не укажете коллекцию узлов, данные будут распределены на коллекцию узлов, указанную параметром 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;

На этом завершено эффективное расширение кластера, выполненное через командную строку!