Расширение кластера
Этот раздел описывает, как расширить кластер Greengage DB (на основе Greenplum) путем добавления новых сегментов и хостов.
По мере роста объема хранимых данных может появляться необходимость увеличения дискового пространства. В других случаях необходимо увеличение вычислительной мощности для эффективной обработки аналитических запросов. Заранее предсказать будущие потребности в ресурсах для хранения и обработки данных бывает сложно, особенно при работе с большими данными.
СУБД Greengage решает эти задачи, обеспечивая линейную масштабируемость. Вы можете расширить существующий кластер, добавив новые сегмент-хосты, тем самым увеличивая как объем хранения, так и вычислительные мощности. После расширения кластер функционирует так, как если бы он изначально был создан с новой конфигурацией. Это позволяет в дальнейшем продолжать расширение кластера по мере роста объема данных.
Новые хосты добавляются с минимальным простоем во время инициализации новых сегментов. После этого кластер работает в обычном режиме. Однако производительность может временно снизиться, пока все таблицы не будут перераспределены согласно обновленной топологии.
Проверка требований
Перед расширением кластера Greengage DB подготовьте новые сегмент-хосты и убедитесь, что они соответствуют необходимым требованиям. Эти хосты могут быть как физическими серверами, так и облачными ресурсами в зависимости от среды развертывания.
Количество новых хостов должно быть достаточным для применения политики зеркалирования, используемой в кластере — grouped
или spread
.
Для политики зеркалирования grouped
требуется минимум два дополнительных хоста, так как каждый хост хранит зеркала основных сегментов другого хоста.
Аппаратные, программные и сетевые конфигурации новых хостов должны соответствовать параметрам существующих сегмент-хостов. Узнайте подробнее о программных и сетевых требованиях к Greengage DB.
Настройка новых хостов
Перед добавлением новых хостов в кластер настройте их операционные системы и установите СУБД Greengage, как описано в этом разделе.
Установка Greengage DB
Подготовьте новые хосты для работы Greengage DB:
-
Установите все необходимые программные зависимости, перечисленные в этом разделе: Требования к ПО для установки Greengage DB.
-
Установите Greengage DB на все хосты. Например, чтобы установить Greengage DB, собранный из исходного кода, выполните действия, описанные в разделе: Сборка Greengage DB из исходного кода. В этом разделе описано, как:
-
настроить операционную систему;
-
создать административного пользователя Greengage DB;
-
собрать Greengage DB из исходного кода;
-
установить Greengage DB.
ПРИМЕЧАНИЕДля инициализации СУБД вам не нужно создавать тестовый кластер.
-
Если ваш кластер использует расширения, такие как PXF, MADlib или PostGIS, вам также нужно установить их зависимости на новые хосты.
Настройка разрешения имен хостов
Убедитесь, что разрешение имен согласовано для всех хостов, существующих и новых. Если вы используете ручную настройку разрешения имен в файле /etc/hosts, обновите его на каждом хосте, добавив имена новых хостов.
Например, если вы добавляете хосты sdw3
и sdw4
в кластер с четырьмя хостами mdw
, smdw
, sdw1
и sdw2
, файл должен выглядеть следующим образом на всех хостах:
# ... 192.168.1.10 mdw 192.168.1.20 smdw 192.168.1.30 sdw1 192.168.1.40 sdw2 192.168.1.50 sdw3 192.168.1.60 sdw4
Создание файла с новыми хостами
-
Подключитесь к мастер-хосту под пользователем
gpadmin
и войдите в домашний каталог. -
Создайте файл hostfile_new_hosts:
$ vi hostfile_new_hosts
-
Добавьте в этот файл имена новых сегмент-хостов:
sdw3 sdw4
-
Сохраните и закройте файл.
Настройка беспарольного SSH для новых хостов
Выполните следующие команды на мастер-хосте:
-
Включите беспарольный SSH-доступ с мастер-хоста на новые хосты. Используйте
ssh-copy-id
, чтобы скопировать открытый ключ пользователяgpadmin
в файл authorized_keys на новых хостах:$ ssh-copy-id sdw3 $ ssh-copy-id sdw4
-
Настройте беспарольный SSH-доступ между всеми хостами будущего кластера с помощью утилиты
gpssh-exkeys
:$ gpssh-exkeys -e <hostfile_all_hosts> -x hostfile_new_hosts
где
<hostfile_all_hosts>
— это список хостов исходного кластера, который использовался для его инициализации.
Создание каталогов данных
Создайте каталоги данных на новых хостах с помощью утилиты gpssh
:
$ gpssh -f hostfile_new_hosts -e 'sudo mkdir -p /data1/primary'
$ gpssh -f hostfile_new_hosts -e 'sudo mkdir -p /data1/mirror'
$ gpssh -f hostfile_new_hosts -e 'sudo chown -R gpadmin /data1/*'
Расположение каталогов данных должно совпадать с их расположением на существующих сегмент-хостах. Вы можете найти правильные пути в файле конфигурации базы данных, который использовался при инициализации исходного кластера.
Тестирование производительности
После настройки новых хостов рекомендуется проверить производительность их дисковой системы с помощью утилиты gpcheckperf
:
$ gpcheckperf -f hostfile_new_hosts -d /data1/primary -d /data1/mirror
Этот тест передает большие файлы между хостами и записывает их на диск на новых хостах.
По завершении теста gpcheckperf
выводит результаты.
Если это возможно в вашей среде, остановите кластер и проверьте производительность будущего расширенного кластера целиком:
$ gpstop -a
$ gpcheckperf -f <hostfile_all_with_new> -d /data1/primary -d /data1/mirror
где <hostfile_all_with_new>
— файл со списком всех хостов будущего кластера: существующих и новых.
Инициализация новых сегментов
Рекомендуется создать резервную копию исходного кластера с помощью утилиты gpbackup
до начала процесса расширения.
Файл конфигурации новых сегментов
Для определения параметров расширения кластера необходим файл конфигурации новых сегментов.
Этот файл указывает количество новых сегментов, их имена хостов, место размещения и роли.
Вы можете сгенерировать этот файл интерактивно с помощью утилиты gpexpand
или подготовить его вручную, используя структуру, описанную в этом разделе.
Для интерактивной генерации файла конфигурации сегментов:
-
Запустите
gpexpand
, указав файл с новыми хостами в опции-f
:$ gpexpand -f hostfile_new_hosts
ПРИМЕЧАНИЕВы также можете запустить
gpexpand
без аргументов. В этом случае утилита предложит ввести новые имена хостов интерактивно. -
Введите
y
, чтобы подтвердить расширение кластера, и нажмитеEnter
:Would you like to initiate a new System Expansion Yy|Nn (default=N):
-
(Опционально) Если при вызове
gpexpand
не был указан хост-файл, введите имена новых хостов через запятую:Enter a comma separated list of new hosts you want to add to your array. Do not include interface hostnames. **Enter a blank line to only add segments to existing hosts**[]:
-
Определите стратегию зеркалирования в расширенном кластере:
grouped
(по умолчанию) илиspread
.What type of mirroring strategy would you like? spread|grouped (default=grouped):
-
Введите количество новых основных сегментов, добавляемых на каждый существующий хост:
How many new primary segments per host do you want to add? (default=0):
Чтобы оставить существующие сегмент-хосты без изменений и создать такое же количество новых сегментов на новых хостах, введите
0
или нажмитеEnter
.ВАЖНОЭто число определяет, сколько новых основных сегментов будет создано дополнительно к уже существующим на сегмент-хостах. На новых хостах будет создано столько же основных сегментов, сколько будет на существующих хостах после расширения.
Например, если в кластере два сегмент-хоста
sdw1
иsdw2
хранят по два основных сегмента, ввод1
приведет к следующей конфигурации:-
Существующие хосты
sdw1
иsdw2
будут хранить по три основных сегмента: два старых и один новый. -
Все новые хосты получат по три новых основных сегмента.
-
Всего в кластере будет 12 основных сегментов.
-
-
(Опционально) Если расширение подразумевает создание новых сегментов на существующих хостах, укажите каталоги для хранения их данных: основных и зеркальных.
Утилита выводит имя созданного файла конфигурации сегментов в сообщении вида:
Input configuration file was written to 'gpexpand_inputfile_20250312_083443'.
Этот файл расширяет кластер, добавляя по два новых основных сегмента на каждом новом хосте (sdw3
и sdw4
).
Хосты хранят зеркала основных сегментов друг друга.
sdw3|sdw3|10000|/data1/primary/gpseg4|11|4|p sdw4|sdw4|10500|/data1/mirror/gpseg4|17|4|m sdw3|sdw3|10001|/data1/primary/gpseg5|12|5|p sdw4|sdw4|10501|/data1/mirror/gpseg5|18|5|m sdw4|sdw4|10000|/data1/primary/gpseg6|13|6|p sdw3|sdw3|10500|/data1/mirror/gpseg6|15|6|m sdw4|sdw4|10001|/data1/primary/gpseg7|14|7|p sdw3|sdw3|10501|/data1/mirror/gpseg7|16|7|m
Файл конфигурации сегментов состоит из строк следующей структуры:
hostname|address|port|datadir|dbid|content|preferred_role
Поле | Описание |
---|---|
hostname |
Имя хоста |
address |
Адрес хоста. Может совпадать со значением |
port |
TCP-порт, прослушиваемый сегментом БД |
datadir |
Физическое расположение каталога данных сегмента |
dbid |
Уникальный идентификатор инстанса в кластере |
content |
Уникальный идентификатор сегмента данных |
preferred_role |
Роль, назначенная сегменту при инициализации системы. Возможные значения: |
Поля этого файла соответствуют столбцам системной таблицы gp_segment_configuration
, которые можно задать при инициализации.
Создание новых сегментов
Выполнение DDL-операций во время инициализации сегментов может привести к несогласованности кластера. Убедитесь, что DDL-операции не выполняются до завершения инициализации.
Чтобы создать новые сегменты на основе файла конфигурации, выполните команду gpexpand -i
:
$ gpexpand -i <gpexpand_inputfile>
где <gpexpand_inputfile>
— это файл конфигурации сегментов, созданный на предыдущем этапе.
После успешного создания сегментов утилита выводит следующие строки:
[INFO]:-************************************************ [INFO]:-Initialization of the system expansion complete. [INFO]:-To begin table expansion onto the new segments [INFO]:-rerun gpexpand [INFO]:-************************************************ [INFO]:-Exiting...
В результате выполнения команды:
-
Кластер переходит в состояние расширения. Теперь можно отслеживать процесс расширения с помощью
gpstate -x
:$ gpstate -x
Команда выводит информацию о состоянии процесса расширения:
[INFO]:-Cluster Expansion State = Data Distribution - Paused [INFO]:----------------------------------------------------- [INFO]:-Number of tables to be redistributed [INFO]:- Database Count of Tables to redistribute [INFO]:- postgres 4 [INFO]:-----------------------------------------------------
-
В базе данных
postgres
на мастер-сегменте создается схемаgpexpand
. Эта схема хранит информацию о процессе расширения, позволяя отслеживать его прохождение.Таблицы схемы gpexpand Таблица Описание expansion_progress
Общая информация о перераспределении данных во время расширения
status
Завершенные этапы расширения с отметками времени
status_detail
Подробный статус перераспределения данных каждой таблицы
-
Новые сегменты создаются на новых и существующих хостах в соответствии с указанной конфигурацией. Обновленная конфигурация сегментов сохраняется в системной таблице
gp_segment_configuration
. Новые сегменты создаются пустыми, а хранимые данные остаются в исходных сегментах. Чтобы сбалансировать данные, выполните перераспределение данных по всем сегментам расширенного кластера.
Перераспределение данных таблиц
После добавления новых сегментов все данные остаются на существующих сегментах.
Это приводит к дисбалансу в кластере, из-за которого основная нагрузка ложится на старые сегменты.
Политика распределения всех распределенных таблиц меняется на DISTRIBUTED RANDOMLY
, что может ухудшить их производительность.
Чтобы сбалансировать нагрузку, данные необходимо перераспределить между всеми сегментами новой топологии.
Когда перераспределение таблицы завершено, она возвращается к своей исходной политике распределения и оптимальной производительности.
Greengage DB предоставляет встроенный механизм перераспределения, который обеспечивает оптимальное распределение данных с минимальным влиянием на работу сервиса.
Перераспределение можно выполнять только в рабочем (production) режиме кластера.
В крупных кластерах этот процесс может потребовать значительных ресурсов и времени.
Чтобы уменьшить влияние на производительность, Greengage DB позволяет приостанавливать и возобновлять процесс, разбивая его на несколько сессий ограниченной длительности.
Прогресс перераспределения сохраняется в таблицах схемы gpexpand
.
Запускайте сеансы перераспределения в периоды с низкой нагрузкой, чтобы минимизировать влияние на производительность.
Новые таблицы, созданные на этом этапе, автоматически распределяются по всем сегментам и не требуют перераспределения. Они доступны сразу после создания. Однако существующие таблицы временно блокируются для чтения и записи на время их перераспределения.
Порядок перераспределения таблиц
Чтобы минимизировать влияние на производительность запросов во время перераспределения, первыми рекомендуется перераспределить крупные и часто запрашиваемые таблицы. Это позволит быстрее сделать их доступными для работы в обычном режиме.
Порядок перераспределения определяется значением столбца rank
в системной таблице gpexpand.status_detail
.
Меньшие значения имеют более высокий приоритет.
Чтобы задать порядок перераспределения таблиц:
-
Подключитесь к базе данных
postgres
на мастер-узле:$ psql postgres
-
Установите большое значение
rank
для всех таблиц, например,100
:UPDATE gpexpand.status_detail SET rank = 100;
-
Уменьшите значение
rank
для таблиц, которые нужно перераспределить в первую очередь:UPDATE gpexpand.status_detail SET rank = 10 WHERE fq_name = 'public.table3'; UPDATE gpexpand.status_detail SET rank = 20 WHERE fq_name = 'public.table2'; UPDATE gpexpand.status_detail SET rank = 30 WHERE fq_name = 'public.table4';
Укажите название базы данных, если имена схем и таблиц повторяются:
UPDATE gpexpand.status_detail SET rank = 50 WHERE fq_name = 'public.table4' AND dbname = 'test_db';
РЕКОМЕНДАЦИЯИспользование круглых значений (
10
,20
,30
) увеличивает гибкость подстройки. При необходимости вы сможете изменить порядок перераспределения, обновив всего одну строку:UPDATE gpexpand.status_detail SET rank = 15 WHERE fq_name = 'public.table5';
Чтобы не выполнять перераспределение таблицы, удалите ее запись из таблицы gpexpand.status_detail
:
DELETE FROM gpexpand.status_detail WHERE fq_name = 'public.table4';
Запуск сеансов перераспределения
Запустить перераспределение можно с помощью gpexpand
, указав один из параметров:
-
-d <HH:MM:SS>
— выполнять перераспределение в течение заданного периода времени. -
-e <YYYY-MM-DD HH:MM:SS>
— выполнять перераспределение до указанного момента времени.
Примеры:
-
Запустить сеанс перераспределения длительностью пять минут:
$ gpexpand -d 00:05:00
-
Выполнять перераспределение до 9:00 13 марта 2025 года:
$ gpexpand -e 2025-03-13 09:00:00
Greengage DB может выполнять перераспределение нескольких таблиц параллельно.
Чтобы запустить параллельное перераспределение, укажите число таблиц для одновременной обработки в опции -n
:
$ gpexpand -n 16
Во время перераспределения создается по два подключения на каждую таблицу: одно изменяет таблицу, а другое записывает прогресс в схему gpexpand
.
При задании числа таблиц для параллельного перераспределения убедитесь, что это не приведет к превышению максимального числа подключений к кластеру (параметр конфигурации max_connections
).
При необходимости увеличьте лимит подключений.
Мониторинг процесса расширения
В этом разделе описано, как отслеживать процесс расширения кластера.
Утилита gpstate
При вызове с флагом -x
утилита gpstate
показывает количество таблиц, которые еще не перераспределены:
$ gpstate -x
В выводе содержатся строки следующего вида:
[INFO]:-Cluster Expansion State = Data Distribution - Paused [INFO]:----------------------------------------------------- [INFO]:-Number of tables to be redistributed [INFO]:- Database Count of Tables to redistribute [INFO]:- postgres 3 [INFO]:-----------------------------------------------------
Таблица gpexpand.expansion_progress
Таблица gpexpand.expansion_progress
хранит текущую статистику процесса расширения, включая количество перераспределенных и оставшихся таблиц, объем переданных данных и предполагаемое время завершения.
SELECT * FROM gpexpand.expansion_progress;
Результат запроса:
name | value ------------------------------+----------------------- Tables Expanded | 1 Estimated Expansion Rate | 27.0714856745503 MB/s Bytes Left | 211241312 Estimated Time to Completion | 00:00:07.441609 Tables Left | 3 Bytes Done | 264568832 (6 rows)
Таблица gpexpand.status_detail
Таблица gpexpand.status_detail
хранит подробную информацию о процессе перераспределения для каждой таблицы.
SELECT dbname, fq_name,rank, status, expansion_started, expansion_finished
FROM gpexpand.status_detail;
Результат запроса:
dbname | fq_name | rank | status | expansion_started | expansion_finished ----------+---------------+------+-------------+----------------------------+---------------------------- postgres | public.table1 | 100 | NOT STARTED | | postgres | public.table4 | 30 | NOT STARTED | | postgres | public.table2 | 20 | NOT STARTED | | postgres | public.table3 | 10 | COMPLETED | 2025-03-13 10:15:41.775582 | 2025-03-13 10:15:50.095813 (4 rows)
Дальнейшие шаги после расширения
Когда перераспределение всех таблиц завершено, в выводе gpexpand
появляется строка:
[INFO]:-EXPANSION COMPLETED SUCCESSFULLY
Кроме того, в таблице gpexpand.status
создается строка EXPANSION COMPLETE
, подтверждающая завершение процесса:
SELECT * FROM gpexpand.status WHERE status = 'EXPANSION COMPLETE';
Результат запроса:
status | updated --------------------+---------------------------- EXPANSION COMPLETE | 2025-03-13 10:29:18.385153 (1 row)
В этом разделе описаны шаги, выполнение которых может потребоваться после расширения кластера.
Удаление схемы расширения
После завершения перераспределения данных схема gpexpand
больше не нужна.
Удалите ее, выполнив следующую команду на мастер-узле:
$ gpexpand -c
Пока в кластере существует схема gpexpand
, запуск нового процесса расширения невозможен.
Восстановление из резервной копии исходного кластера
Если вам потребуется восстановить данные из исходной копии, созданной до расширения кластера, используйте gprestore
с опцией --resize-cluster
.
$ gprestore --resize-cluster --backup-dir /data1/backup --timestamp 20250302111439
Настройка PXF
Если ваш кластер использует PXF, настройте его на всех узлах расширенного кластера:
-
Установите PXF на новые хосты.
-
Синхронизируйте конфигурацию PXF на всех узлах кластера:
$ pxf cluster register $ pxf cluster sync
-
Перезапустите PXF:
$ pxf cluster restart