Если вы привыкли использовать код для выполнения операций расширения емкости, мы также предоставляем соответствующие инструменты расширения и SQL-заявки для реализации гибких и плавных функций масштабирования. Как правило, расширение кластера включает два основных этапа: добавление новых узлов и перераспределение данных.
Добавление новых узлов — это очень быстрая операция, которую в YMatrix можно выполнить без остановки системы. Перераспределение данных является более сложным процессом: если не выполнить специальных действий, любая новая таблица по умолчанию будет распределена на всех узлах. При перераспределении таблицы или партиции она блокируется и становится недоступной для чтения и записи, что может вызвать остановку работы. В то же время, в некоторых бизнес-сценариях пользователям не требуется перераспределять данные определённых таблиц — достаточно настроить новые схемы распределения только для некоторых старых или новых таблиц, чтобы удовлетворить их потребности.
В YMatrix мы предоставляем функцию Smooth scaling для реализации этого требования. Создав объект SEGMENT_SET, вы можете независимо определить коллекцию узлов хранения данных и указать, что данные таблицы должны распределяться именно на эту коллекцию (то есть данные будут храниться только в определённом наборе узлов).
YMatrix также поддерживает следующие функции: параллельное перераспределение данных таблиц, объединение таблиц, не подвергшихся перераспределению, с перераспределёнными таблицами и т.д.
Перед выполнением формальной операции расширения необходимо провести систематическое планирование кластера. Мы составили следующий список задач, охватывающий полный процесс расширения:
| Номер | Содержание задачи |
|---|---|
| Подготовка | |
| 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) выше, выбрав один из них. |
Примеры конкретных операций приведены ниже. Предположим, что у вас сейчас три сервера: mdw, sdw1, sdw2. Планируется добавить два новых узла: sdw3 и sdw4.
В примере кластера присутствует тестовая таблица test, содержащая 100 тестовых записей.
=# CREATE EXTENSION matrixts;
=# CREATE TABLE test (a int,b int) USING MARS2 DISTRIBUTED BY (a);
=# CREATE INDEX ON test USING mars2_btree(a);
=# INSERT INTO test SELECT i,i+10 FROM generate_series(1, 100) AS i;
Сначала необходимо установить ту же версию программного обеспечения YMatrix на два новых хоста, которые вы собираетесь добавить в кластер, а также на существующие хосты. Подробные шаги развертывания см. в разделе Онлайн-развертывание кластера, разделы 1–3.
Во-вторых, используйте таблицу 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)
Снова используйте функцию 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)
После подтверждения состояния кластера и версии программного обеспечения необходимо на всех узлах с правами 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
Примечание!
Все последующие операции расширения выполняются на Master-узле.
$ sudo /opt/ymatrix/matrixdb5/bin/mxctl expand init > /tmp/init_output
Информация о текущем кластере выводится в директорию /tmp/init_output в виде структурированных данных.
$ 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
...
Для добавления нескольких хостов необходимо выполнить команду несколько раз; каждый вывод используется как вход для следующего запуска.
$ cat /tmp/add.3 | sudo /opt/ymatrix/matrixdb5/bin/mxctl expand netcheck > /tmp/ncheck
Если код выхода exitcode (echo $?) больше 0, это означает, что тест не пройден.
$ cat /tmp/ncheck | sudo /opt/ymatrix/matrixdb5/bin/mxbox deployer expand > /tmp/exandplan
Путь создания директории, количество сегментов, стратегия распределения зеркальных копий и другие параметры — всё это информация, содержащаяся в сгенерированном файле /tmp/exandplan. Опытные пользователи могут напрямую изменять этот файл.
$ cat /tmp/exandplan | sudo /opt/ymatrix/matrixdb5/bin/mxbox deployer exec
Поздравляем! Расширение выполнено успешно.
=# 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)
С помощью следующего SQL-запроса вы можете увидеть текущее распределение данных исходной таблицы на старых узлах. Пришло время спланировать, как данные будут распределены далее.
=# SELECT gp_segment_id,count(*) FROM public.test GROUP BY gp_segment_id;
Перед выполнением перераспределения данных вы уже знаете, что перераспределение кластера — это важная и трудоёмкая задача после расширения.
До расширения кластера бизнес-данные распределялись на старых узлах. Во время расширения добавляется новый доступный узел. Процесс равномерного перераспределения данных со старых узлов на все узлы текущего кластера называется «перераспределением данных».
Когда это соответствует требованиям сценария, перераспределение данных значительно повышает скорость ответа сервиса; однако, если требования не соответствуют, оно тратит много ресурсов и времени. Поэтому крайне важно заранее продумать и спланировать, как именно следует распределить данные.
Ниже представлены два подхода. Выберите один из них в зависимости от характеристик вашего сценария.
На новых узлах хранения данных пока нет данных. Вы можете использовать следующий метод, чтобы перераспределить все старые данные в новый кластер. Вы можете выбрать время выполнения или запустить его немедленно.
Примечание!
Рекомендуется выбирать период с низкой нагрузкой для перераспределения данных.
Запустить немедленно:
$ 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;
Это то, что в YMatrix называется плавным расширением. Как было запланировано ранее, вы готовы выбрать один из четырёх доступных методов в зависимости от реальных условий.
| Метод | Плавное расширение |
|---|---|
| (1) | Создать необходимую коллекцию узлов хранения (CREATE SEGMENT_SET), указать эту коллекцию при создании новой таблицы или партиции |
| (2) | При создании таблицы сразу указать существующую коллекцию узлов хранения до расширения. |
| (3) | Новая таблица не указывает коллекцию узлов хранения. Распределение коллекции узлов хранения определяется параметром mx_default_segment_set. Значение по умолчанию — глобальное распределение. |
| (4) | Помимо новых данных, некоторые старые данные также требуют повторного планирования и перераспределения. В этом случае новые данные необходимо обрабатывать отдельно от старых. Для перераспределения старых данных используется оператор ALTER TABLE SET SEGMENT_SET, а для новых — методы (1), (2) и (3) выше, выбрав один из них. |
Создайте новую коллекцию узлов хранения с помощью SQL-запроса CREATE SEGMENT_SET в YMatrix.
=# CREATE SEGMENT_SET name SEGMENTS (content_id, ...);
Дополнительную информацию о применении см. в разделе CREATE SEGMENT_SET
Используйте SQL-запросы в YMatrix для указания созданной коллекции узлов хранения. Например:
=# CREATE TABLE t1(a int, b int) DISTRIBUTED BY(a) SEGMENT_SET ss1;
=# CREATE TABLE t1(a int, b int) DISTRIBUTED REPLICATED SEGMENT_SET ss1;
=# CREATE TABLE t1(a int, b int) DISTRIBUTED RANDOMLY SEGMENT_SET ss1;
Дополнительную информацию о применении см. в разделе CREATE SEGMENT_SET
Создайте новую таблицу в YMatrix. Если вы не укажете коллекцию узлов хранения, данные будут распределены на коллекцию узлов, указанную параметром mx_default_segment_set, и по умолчанию — на все узлы кластера. Вы можете изменить коллекцию узлов хранения по умолчанию с помощью оператора SET, например:
=# SET mx_default_segment_set TO 'ss1';
Помимо новых данных, некоторые старые данные также требуют повторного планирования и перераспределения. В этом случае новые данные обрабатываются отдельно от старых. Для перераспределения старых данных используется оператор 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;
На этом завершено эффективное расширение кластера, выполненное через командную строку!