GitHub

Настройка зеркалирования в кластере

Павел Семёнов

В этом разделе описано, как включить зеркалирование в кластере Greengage DB (на основе Greenplum).

Greengage DB обеспечивает отказоустойчивость кластера с помощью механизма зеркалирования. Каждый экземпляр кластера — сегмент или мастер — может иметь зеркало, которое хранит либо такие же данные (зеркальный сегмент), либо системный каталог (резервный мастер). Зеркала автоматически синхронизируются с соответствующими основными экземплярами. При отказе основного экземпляра его функции выполняет зеркало, обеспечивая целостность и доступность кластера.

Кластер Greengage DB можно инициализировать с зеркалами сразу, как описано в разделе Инициализация СУБД. Если кластер был изначально создан без зеркал, их можно добавить позже без остановки сервиса.

Для добавления зеркал используются следующие утилиты:

  • gpaddmirrors — добавление зеркальных сегментов.

  • gpinitstandby — добавление резервного мастера.

Включение зеркалирования сегментов

Зеркалирование сегментов обеспечивает доступность данных в случае отказа сегмента. Если основной сегмент выходит из строя, система автоматически назначает его зеркало в качестве основного без необходимости ручного вмешательства.

Зеркалирование сегментов включается сразу для всего кластера. Запуск утилиты gpaddmirrors на мастер-хосте создает зеркала для всех сегментов и распределяет их по сегмент-хостам в соответствии с заданной (или используемой по умолчанию) политикой зеркалирования.

РЕКОМЕНДАЦИЯ

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

Стандартная конфигурация зеркалирования

Greengage DB автоматически распределяет зеркальные сегменты по сегмент-хостам кластера. По умолчанию применяется следующая конфигурация зеркал:

  • Хосты зеркал: все существующие сегмент-хосты.

  • Политика зеркалирования: grouped (зеркала всех основных сегментов одного хоста размещаются вместе на другом хосте).

  • Базовый порт для зеркал: базовый порт основных сегментов плюс 1000.

  • Каталоги данных: указываются во время создания зеркал.

Чтобы создать зеркальные сегменты на существующих хостах кластера:

  1. Войдите на мастер-хост под пользователем gpadmin.

  2. Запустите gpaddmirrors:

    $ gpaddmirrors

    При необходимости вы можете добавить опции для изменения конфигурации зеркал:

    • -p — устанавливает смещение портов (port offset):

      $ gpaddmirrors -p 5000
      ВАЖНО

      Смещение портов — это число, которое добавляется к номерам портов основных сегментов. Например, если основные сегменты используют порты от 10000 до 10003, а значение -p равно 5000, то зеркальные сегменты займут порты от 15000 до 15003.

      Смещение портов по умолчанию — 1000.

    • -s — устанавливает политику зеркалирования spread:

      $ gpaddmirrors -s

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

    • -m — передает файл с каталогами данных зеркал:

      $ gpaddmirrors -m mirror_dirs
      ВАЖНО

      Каталоги данных зеркал должны отличаться от каталогов данных основных сегментов.

      В этом файле каждая строка должна содержать абсолютный путь к каталогу для хранения зеркального сегмента. Количество строк должно соответствовать количеству основных сегментов на хосте.

      • Четыре зеркальных сегмента на хосте, все в одном каталоге:

        /data1/mirror
        /data1/mirror
        /data1/mirror
        /data1/mirror

        Все зеркала будут храниться в каталогах /data1/mirror/gpseg<N>, где <N> — идентификатор сегмента.

      • Отдельное расположение для каждого из четырех зеркальных сегментов на хосте:

        /data1/mirror1
        /data1/mirror2
        /data1/mirror3
        /data1/mirror4

        Каждый указанный каталог будет содержать один вложенный каталог сегмента, например /data1/mirror1/gpseg<N>, /data1/mirror2/gpseg<M> и так далее.

  3. (Опционально) Если файл с каталогами данных зеркал не был указан при вызове gpaddmirrors, введите пути к каталогам данных для каждого зеркального сегмента на хостах кластера:

    Enter mirror segment data directory location 1 of 2 >

    Greengage DB подготовит конфигурацию зеркал на основе указанных параметров и выведет следующую информацию о каждом зеркале:

    [INFO]:---------------------------------------------
    [INFO]:-Mirror 1 of 8
    [INFO]:---------------------------------------------
    [INFO]:-   Primary instance host        = sdw1
    [INFO]:-   Primary instance address     = sdw1
    [INFO]:-   Primary instance directory   = /data1/primary/gpseg0
    [INFO]:-   Primary instance port        = 10000
    [INFO]:-   Mirror instance host         = sdw2
    [INFO]:-   Mirror instance address      = sdw2
    [INFO]:-   Mirror instance directory    = /data1/mirror/gpseg0
    [INFO]:-   Mirror instance port         = 15000
  4. Введите y и нажмите Enter, чтобы подтвердить создание зеркал:

    Continue with add mirrors procedure Yy|Nn (default=N):

    После успешного создания зеркал будут выведены следующие строки:

    [INFO]:-******************************************************************
    [INFO]:-Mirror segments have been added; data synchronization is in progress.
    [INFO]:-Data synchronization will continue in the background.
    [INFO]:-Use  gpstate -s  to check the resynchronization progress.
    [INFO]:-******************************************************************

Пользовательская конфигурация зеркал

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

Перед созданием зеркал сегментов на хостах за пределами кластера подготовьте эти хосты для работы с Greengage DB, как описано в разделе Инициализация СУБД.

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

Чтобы сгенерировать шаблон файла конфигурации зеркалирования:

  1. Войдите на мастер-хост под пользователем gpadmin.

  2. Запустите gpaddmirror, указав имя создаваемого файла в параметре -o:

    $ gpaddmirrors -o mirror_conf_file

    При необходимости укажите смещение портов (-p), файл с расположением зеркал (-m) и политику зеркалирования (-s для spread):

    $ gpaddmirrors -o mirror_conf_file -p 2000 -m mirror_dirs
  3. (Опционально) Если не был указан файл с расположением зеркал, введите пути к каталогам данных зеркал по одному в ответ на запрос:

    Enter mirror segment data directory location 1 of 2 >

    После успешного создания файла утилита выводит сообщение:

    [INFO]:-Configuration file output to mirror_conf_file successfully.

Следующий файл — это шаблон, созданный для кластера с четырьмя сегмент-хостами — sdw1, sdw2, sdw3 и sdw4 — с политикой зеркалирования по умолчанию (grouped).

0|sdw2|11000|/data1/mirror/gpseg0
1|sdw2|11001|/data1/mirror/gpseg1
2|sdw3|11000|/data1/mirror/gpseg2
3|sdw3|11001|/data1/mirror/gpseg3
4|sdw4|11000|/data1/mirror/gpseg4
5|sdw4|11001|/data1/mirror/gpseg5
6|sdw1|11000|/data1/mirror/gpseg6
7|sdw1|11001|/data1/mirror/gpseg7

Файл конфигурации зеркалирования состоит из строк следующей структуры:

content|address|port|datadir
Структура файла конфигурации зеркал
Поле Описание

content

Уникальный идентификатор сегмента данных

address

Адрес хоста. Может совпадать со значением hostname в системах, не использующих настройку имен хостов для каждого интерфейса (per-interface)

port

TCP-порт, прослушиваемый сегментом БД

datadir

Физическое расположение каталога данных сегмента

Сгенерированный шаблон файла содержит стандартную конфигурацию зеркал в соответствии с указанными параметрами. Измените файл в соответствии с желаемой конфигурацией зеркал. Например, чтобы разместить зеркала на других хостах, замените существующие адреса сегмент-хостов на адреса новых хостов. Файл, приведенный ниже, создает зеркальные сегменты на новых хостах sdw5, sdw5, sdw7 и sdw8:

0|sdw5|11000|/data1/mirror/gpseg0
1|sdw5|11001|/data1/mirror/gpseg1
2|sdw6|11000|/data1/mirror/gpseg2
3|sdw6|11001|/data1/mirror/gpseg3
4|sdw7|11000|/data1/mirror/gpseg4
5|sdw7|11001|/data1/mirror/gpseg5
6|sdw8|11000|/data1/mirror/gpseg6
7|sdw8|11001|/data1/mirror/gpseg7

Чтобы создать зеркала на основе полученного файла, используйте параметр -i:

$ gpaddmirrors -i mirror_conf_file

Включение зеркалирования мастера

Зеркалирование мастера повышает отказоустойчивость кластера Greengage DB за счет резервного мастера (standby master) — дополнительного экземпляра, который хранит синхронизированную копию системного каталога. Резервный мастер работает в режиме горячего резерва: в случае отказа основного мастера он может заменить его, обеспечивая непрерывность работы.

ВАЖНО

Greengage DB не выполняет автоматическое переключение на резервный мастер при отказе основного. Для активации резервного мастера вручную выполните gpactivatestandby на его хосте. Чтобы узнать больше, обратитесь к статье Восстановление мастера после сбоев.

Добавление резервного мастера

Если кластер был инициализирован без резервного мастера, его можно добавить в любой момент во время работы кластера.

Перед созданием резервного мастера убедитесь, что хост настроен для работы с Greengage DB, как описано в разделе Инициализация СУБД.

Чтобы создать резервный мастер на подготовленном хосте:

  1. Войдите на активный мастер-хост под пользователем gpadmin.

  2. Выполните gpinitstandby на мастер-хосте, указав имя хоста резервного мастера в параметре -s:

    $ gpinitstandby -s smdw

    По умолчанию Greengage DB использует тот же порт и каталог данных для резервного мастера, что и для активного мастера. Эти параметры можно изменить с помощью параметров -P и -S:

    $ gpinitstandby -s smdw -P 12000 -S /data2/master

    Пользователь gpadmin должен иметь права на чтение и запись в указанный каталог данных резервного мастера.

    РЕКОМЕНДАЦИЯ

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

    Утилита выводит параметры будущего резервного мастера:

    [INFO]:------------------------------------------------------
    [INFO]:-Greengage standby master initialization parameters
    [INFO]:------------------------------------------------------
    [INFO]:-Greengage master hostname               = mdw
    [INFO]:-Greengage master data directory         = /data1/master/gpseg-1
    [INFO]:-Greengage master port                   = 5432
    [INFO]:-Greengage standby master hostname       = smdw
    [INFO]:-Greengage standby master port           = 5432
    [INFO]:-Greengage standby master data directory = /data1/master/gpseg-1
    [INFO]:-Greengage update system catalog         = On
  3. Введите y, чтобы подтвердить инициализацию резервного мастера, и нажмите Enter:

    Do you want to continue with standby master initialization? Yy|Nn (default=N):

    После успешной инициализации резервного мастера утилита выводит сообщение:

    [INFO]:-Successfully created standby master on smdw
ПРИМЕЧАНИЕ

Если по какой-либо причине вы хотите создать резервный мастер на текущем мастер-хосте, укажите только порт и каталог данных. Они должны отличаться от используемых активным мастером.

$ gpinitstandby -P 6432 -S /data2/master

Замена существующего резервного мастера

Если в кластере уже есть резервный мастер и его необходимо перенести на другой хост, выполните следующие шаги:

  1. Удалите существующий резервный мастер, выполнив gpinitstandby с параметром -r:

    $ gpinitstandby -r
    ВНИМАНИЕ

    После этого шага кластер утратит отказоустойчивость, пока не будет инициализирован новый резервный мастер.

  2. Инициализируйте новый резервный мастер на другом хосте:

    $ gpinitstandby -s smdw2
Перезапуск резервного мастера

Если существующий резервный мастер перестал работать по какой-то причине, его можно перезапустить с помощью gpinitstandby -n:

$ gpinitstandby -n

Мониторинг состояния зеркалирования

В этом разделе перечислены способы проверки состояния зеркалирования в кластере.

Утилита gpstate

Вызов утилиты gpstate с параметрами позволяет вывести информацию о зеркалировании в кластере:

  • gpstate -m выводит список зеркальных сегментов и политику зеркалирования кластера:

    $ gpstate -m

    Пример вывода:

    [INFO]:--------------------------------------------------------------
    [INFO]:--Current GPDB mirror list and status
    [INFO]:--Type = Group
    [INFO]:--------------------------------------------------------------
    [INFO]:-   Mirror    Datadir                Port    Status    Data Status
    [INFO]:-   sdw2      /data1/mirror/gpseg0   11000   Passive   Synchronized
    [INFO]:-   sdw2      /data1/mirror/gpseg1   11001   Passive   Synchronized
    [INFO]:-   sdw1      /data1/mirror/gpseg2   11000   Passive   Synchronized
    [INFO]:-   sdw1      /data1/mirror/gpseg3   11001   Passive   Synchronized
    [INFO]:--------------------------------------------------------------

    Следующие значения указывают на работу зеркальных сегментов в назначенной роли и синхронизацию с основными сегментами:

    • Status = Passive

    • Data Status = Synchronized

  • gpstate -f выводит информацию о резервном мастере:

    $ gpstate -f

    Пример вывода:

    [INFO]:-Standby master details
    [INFO]:-----------------------
    [INFO]:-   Standby address          = smdw
    [INFO]:-   Standby data directory   = /data1/master/gpseg-1
    [INFO]:-   Standby port             = 5432
    [INFO]:-   Standby PID              = 1310
    [INFO]:-   Standby status           = Standby host passive
    [INFO]:--------------------------------------------------------------
    [INFO]:--pg_stat_replication
    [INFO]:--------------------------------------------------------------
    [INFO]:--WAL Sender State: streaming
    [INFO]:--Sync state: sync
    [INFO]:--Sent Location: 0/141D6D18
    [INFO]:--Flush Location: 0/141D6D18
    [INFO]:--Replay Location: 0/141D6D18
    [INFO]:--------------------------------------------------------------

    Следующие значения указывают на работу резервного мастера в своей роли и его синхронизацию с основным мастером:

    • Standby status = Standby host passive

    • WAL Sender State: streaming

    • Sync state: sync

Другие опции gpstate, например -s или -e, позволяют получить более детальную информацию об аспектах зеркалирования. Чтобы узнать больше о параметрах gpstate, обратитесь к разделу Проверка состояния кластера.

Таблица gp_segment_configuration

Таблица gp_segment_configuration содержит информацию о сегментах кластера, включая их роли: основные (role = 'p') и зеркальные (role = 'm').

SELECT * FROM gp_segment_configuration;

Результат запроса:

 dbid | content | role | preferred_role | mode | status | port  | hostname | address |        datadir
------+---------+------+----------------+------+--------+-------+----------+---------+-----------------------
    1 |      -1 | p    | p              | n    | u      |  5432 |   mdw    |   mdw   | /data1/master/gpseg-1
    6 |      -1 | m    | m              | s    | u      | 10000 |   sdw1   |   sdw1  | /data1/primary/gpseg0
    2 |       0 | p    | p              | s    | u      | 10000 |   sdw2   |   sdw2  | /data1/primary/gpseg2
    7 |       0 | m    | m              | s    | u      | 10000 |   sdw3   |   sdw3  | /data1/primary/gpseg4
    3 |       1 | p    | p              | s    | u      | 10000 |   sdw4   |   sdw4  | /data1/primary/gpseg6
    8 |       1 | m    | m              | s    | u      | 10001 |   sdw1   |   sdw1  | /data1/primary/gpseg1
    4 |       2 | p    | p              | s    | u      | 10001 |   sdw2   |   sdw2  | /data1/primary/gpseg3
    9 |       2 | m    | m              | s    | u      | 10001 |   sdw3   |   sdw3  | /data1/primary/gpseg5
    5 |       3 | p    | p              | s    | u      | 10001 |   sdw4   |   sdw4  | /data1/primary/gpseg7
   10 |       3 | m    | m              | s    | u      |  5432 |   smdw   |   smdw  | /data1/master/gpseg-1
(10 rows)

Активный и резервный мастера представлены строками с content = -1.

SELECT * FROM gp_segment_configuration WHERE content = -1;

Результат запроса:

 dbid | content | role | preferred_role | mode | status | port | hostname | address |        datadir
------+---------+------+----------------+------+--------+------+----------+---------+-----------------------
    1 |      -1 | p    | p              | n    | u      | 5432 |   mdw    |   mdw   | /data1/master/gpseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 |   smdw   |   smdw  | /data1/master/gpseg-1
(2 rows)

Если все экземпляры работают в своих предпочтительных ролях, количество строк с role = preferred_role совпадает с числом экземпляров в кластере.

SELECT COUNT(*) FROM gp_segment_configuration WHERE role = preferred_role;

Результат запроса:

count
-------
    10
(1 row)

Представление pg_stat_replication

Состояние зеркалирования также хранится в системном представлении pg_stat_replication. Оно содержит информацию о процессах, используемых для репликации данных между основными и зеркальными экземплярами сегментов и мастера.

Пример запроса:

SELECT gp_segment_id, client_addr, client_port, state, sync_state, sync_error
FROM gp_stat_replication;

Результат запроса:

 gp_segment_id | client_addr  | client_port |   state   | sync_state | sync_error
---------------+--------------+-------------+-----------+------------+------------
            -1 | 10.92.41.13  |       34318 | streaming | sync       | none
             3 | 10.92.41.158 |       26458 | streaming | sync       | none
             2 | 10.92.41.158 |       16108 | streaming | sync       | none
             1 | 10.92.42.185 |       53158 | streaming | sync       | none
             0 | 10.92.42.185 |       64946 | streaming | sync       | none
(5 rows)