Командная строка: онлайн-масштабирование

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

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

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

YMatrix также поддерживает следующие функции: параллельное перераспределение данных таблиц, объединение таблиц, не подвергшихся перераспределению, с уже перераспределёнными и т.д.

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

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

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

После завершения расширения необходимо заранее спланировать метод перераспределения данных перед их перераспределением.

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

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

Если вы хотите перераспределить все данные, см. Таблицу 1: Планирование задач.

Таблица 1

Номер Содержание задачи
Перераспределение данных
1 Выполнить команду перераспределения всех данных
Задачи после перераспределения
2 Просмотр текущего статуса перераспределения
3 Просмотр распределения данных

Если вы хотите выполнить плавное масштабирование, см. Таблицу 2 ниже.
В этой таблице представлены 4 различных способа достижения плавного масштабирования — выберите один из них.

Таблица 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

Путь создания директории, количество сегментов, стратегия распределения зеркальных копий и другие параметры — всё это информация, содержащаяся в сгенерированном файле /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;

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

Внимание!
После выполнения расширения через командную строку необходимо перезапустить mxui, чтобы он считал новую топологию кластера и повторно развернул все mxui_collectors.
Команда для перезапуска mxui: /opt/ymatrix/matrixdb5/bin/supervisorctl restart mxui