Перейти к основному содержимому

Пересоздание узла арбитра

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

Процесс пересоздания узлов СУБД Pangolin представлен в связке Pangolin Manager и Pangolin DCS или с применением Pangolin Manager и etcd. В разделе приведены примеры команд для Platform V SberLinux OS Server (SLO) 9.6 и версии продукта 7.3.1.

примечание

Для восстановления потребуется полностью новая виртуальная машина.

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

Обозначение параметров

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

  • узел мастера: {master_host} и {master_ip};
  • узел реплики: {replica_host} и {replica_ip};
  • узел арбитра: {arbiter_host} и {arbiter_ip}.

Также имеются другие обозначения:

  • {base_version} – базовая версия продукта (текущая: 7);
  • {short_version} – короткая версия продукта (текущая: 7.3);
  • product_version – полная версия продукта (текущая: 7.3.1);
  • {cluster_id} – ID кластера;
  • {version_component} – версия поставляемого расширения;
  • {OS} – наименование операционной системы и ее версия.
Внимание!

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

Например, сочетание (мастер, реплика) означает, что действия, указанные в пункте, необходимо выполнить сначала на основном узле, затем на реплике (при этом выполнять действия на арбитре не нужно).

Пересоздание узла арбитра с компонентами Pangolin Manager и Pangolin DCS

Подготовительные действия

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

  1. (арбитр) Для настройки репозиториев перенесите содержимое с аналогичных файлов на узле мастера или скопируйте сами файлы на узел арбитра и выдайте такие же права.

    Пример команды и репозиториев:

       sudo nano /etc/yum.repos.d/pangolin_local_repo_7.3.1.repo
    sudo nano /etc/yum.repos.d/sbel_local.repo
    sudo nano /etc/yum.repos.d/sberlinux.repo
  2. (мастер) Переведите Pangolin Manager в режим паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause
  3. (арбитр) В случае необходимости, выполните генерацию серверного сертификата и перенос клиентских сертификатов с мастера для того, чтобы все сертификаты кластера были подписаны одним root-сертификатом.

Установка Pangolin DCS

  1. (арбитр) Установите rpm/deb-пакеты компонента pangolin-manager и его зависимость pangolin-manager-venv:

    sudo dnf install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm
    sudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpm

    Пример команды:

       sudo yum install -y "/tmp/distr/distributive/3rdparty/pangolin-manager-venv/pangolin-manager-venv-3.1.1-sberlinux9.x86_64.rpm"
    sudo yum install -y "/tmp/distr/distributive/pangolin-manager-3.1.1-sberlinux9.x86_64.rpm"
  2. (арбитр) В связи с добавлением утилит безопасности (setup_kms_credentials, pg_auth_password, pangolin-certs-rotate) в основной пакет Pangolin Manager, на узле арбитра необходима установка файла лицензии:

    sudo mkdir /opt/pangolin-license
    sudo cp /opt/pangolin-license/license.json
    sudo chown -R postgres:pangolin_users /opt/pangolin-license
    sudo chmod -R 770 /opt/pangolin-license
  3. (арбитр) Выполните конфигурацию unit-файла службы Pangolin Manager, пример файла можно получить на мастере.

    Пример команды:

    nano /usr/lib/systemd/system/pangolin-manager.service
  4. (арбитр) Отредактируйте конфигурационный файл Pangolin Manager /etc/pangolin-manager/postgres.yml. Пример:

    postgres.yml
       sudo nano /etc/pangolin-manager/postgres.yml

    scope: clustername
    name: {arbiter_host}

    restapi:
    listen: 0.0.0.0:8008
    connect_address: {arbiter_host}:{arbiter_ip}
    allowlist: []
    allowlist_include_members: true
    authentication:
    username: patroniyml
    password: <password>
    pangolin_dcs:
    self_addr: {arbiter_host}:{arbiter_ip}
    partner_addrs: {master_host}:{master_ip},{replica_host}:{replica_ip}
    data_dir: /pgdata/07/raft_data
    journal_max_size: 10485760
    journal_wait_timeout: 10
    memory_journal_size: 10000
    journal_force_read_wait: True
    dump_dir: /pgdata/07/raft_dump
    dump_interval: 300
    dump_wait_timeout: 10
    logfile: /pgerrorlogs/pangolin-manager/raft/raft.log
    log_max_size: 20971520
    log_rotation_period: 1d
    heartbeat_interval: 1000
    election_timeout: 5000
    ctl:
    retry_timeout: 10
    restapi:
    listen: 0.0.0.0:8009
    connect_address: {arbiter_host}:{arbiter_ip}
    partner_address: {master_host}:{master_ip},{replica_host}:{replica_ip}
    allowlist: []
    allowlist_include_members: true
    authentication:
    username: patronietcd
    password: etcd_password

    audit:
    enabled: True
    directory: /pgerrorlogs/pangolin-manager/audit
    filename: pangolin-manager
    rotation_age: 1d
    rotation_size: 10M
    file_mode: 0600

    log:
    dir: "/pgerrorlogs/pangolin-manager"

    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log

    destination: file
    file_mode: 600
    redirect_min_size: 10

    bootstrap:
    dcs:
    ttl: 135
    retry_timeout: 60
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: True
    synchronous_mode_strict: False
    postgresql:
    parameters:
    max_connections: '110'
    max_worker_processes: '32'
    max_prepared_transactions: '12'
    wal_level: 'replica'
    wal_log_hints: on
    track_commit_timestamp: off
    wal_keep_size: '8GB'
    max_wal_senders: '10'
    max_replication_slots: '10'
    logical_decoding_work_mem: '64MB'
    auth_activity_period: '60'
    authentication_max_workers: '16'
    use_pg_rewind: true
    use_slots: true
    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: "en_US.UTF-8"
    tags:
    nofailover: true
    noloadbalance: false
    clonefrom: false
    nosync: true
  5. (арбитр) Создайте директории, измените привилегии:

       sudo mkdir -p /pgdata/07/{raft_data,raft_dump}
    sudo mkdir -p /pgerrorlogs/pangolin-manager/{audit,raft}
    sudo chown -R postgres:postgres /pgdata
    sudo chmod -R 770 /pgdata
    sudo chown -R postgres:pangolin_users /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  6. (арбитр) Найдите в файле .bash_profile на узле мастера строки с префиксом: 'alias members', 'alias elist', 'alias health' и добавьте их в конец аналогичного файла на арбитре. Откорректируйте имена узлов и IP-адреса на значения, соответствующие узлу арбитра.

    Под пользователем postgres, находясь в домашнем каталоге, выполните команду:

    nano .bash_profile

    alias members="pangolin-dcs-ctl member list"
    alias elist="pangolin-dcs-ctl endpoint status --endpoints='{arbiter_host}:{arbiter_ip}, {master_host}:{master_ip},{replica_host}:{replica_ip}'"
    alias health="pangolin-dcs-ctl endpoint health --endpoints='{arbiter_host}:{arbiter_ip}, {master_host}:{master_ip},{replica_host}:{replica_ip}'"

Процедура 1. Мягкий способ без замены всех узлов

Процедура 1 применяется, если:

  • в Pangolin Manager не включена аутентификация;
  • известен пароль Pangolin Manager пользователя root.

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

В противном случае перейдите к «Процедуре 2», где производится полная замена всех узлов.

В соответствии с процедурой 1 потерянный узел кластера удаляется и взамен него добавляется новый. Остановка всего кластера Pangolin Manager не выполняется. При этом, все настройки кластера, включая аутентификационные (если они есть), перенесутся на новый узел Pangolin Manager. Таким образом, процедура 1 предлагает более «мягкий» вариант конфигурирования кластера Pangolin Manager после потери одного из узлов.

  1. (мастер) Выполните оценку состояния кластера. Когда все узлы кластера в рабочем состоянии, то будет выведен следующий результат:

    sudo su - postgres

    $ pangolin-dcs-ctl endpoint health --endpoints='{arbiter_host}:{arbiter_ip},{master_host}:{master_ip},{replica_host}:{replica_ip}'
    {arbiter_host}:{arbiter_ip} is healthy
    {master_host}:{master_ip} is healthy
    {replica_host}:{replica_ip} is healthy

    $ pangolin-dcs-ctl endpoint status --endpoints='{replica_host}:{replica_ip},{arbiter_host}:{arbiter_ip},{master_host}:{master_ip}'
    0.3.10,1.2.0,{replica_host}:{replica_ip},follower,{master_host}:{master_ip},2,connected,connected,0,41,126103,126103,1,1,54229,1,0,126103,415756
    0.3.10,1.2.0,{arbiter_host}:{arbiter_ip},follower,{master_host}:{master_ip},2,connected,connected,0,80,126103,126103,1,0,0,126103,236736
    0.3.10,1.2.0,{master_host}:{master_ip},leader,{master_host}:{master_ip},2,connected,connected,0,50,126103,126103,1,2,126104,126104,2,126103,126103, 126103,415788

    $ pangolin-dcs-ctl member list
    {arbiter_host}:{arbiter_ip}, connected, False
    {replica_host}:{replica_ip}, connected, False
    {master_host}:{master_ip}, connected, True
  2. (мастер) Удалите из кластера узел арбитра, как в следующем примере. Если он существовал ранее и был утерян – информация о нем будет отображаться в результате команды 'member list':

    sudo su - postgres
    $ pangolin-dcs-ctl -u root:<password> member remove {arbiter_host}:{arbiter_ip}
    Member {arbiter_host}:{arbiter_ip} removed from cluster
  3. (мастер) Добавьте новый узел кластера. В данном примере приводится вариант команды и результат:

    sudo su - postgres
    $ pangolin-dcs-ctl -u root:<password> member add --peer-urls={arbiter_host}:{arbiter_ip}

    Member {arbiter_host}:{arbiter_ip} added to cluster
  4. (мастер, реплика, арбитр) Выполните актуализацию файлов postgres.yml на всех узлах кластера, если для «нового» арбитра были изменены адрес и имя, следует обратить внимание на такие параметры как:

    self_addr;
    partner_addrs;
    connect_address;
    partner_address.
  5. (арбитр) Запустите службу Pangolin Manager на узле арбитра:

    sudo systemctl daemon-reload
    sudo systemctl start pangolin-manager
    sudo systemctl status pangolin-manager
  6. (мастер) Выведите Pangolin Manager из режима паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume

Процедура 2. Способ с полной заменой всех узлов

Процедура 2 выполняется, если не были выполнены шаги «Процедуры 1», в случае, когда в Pangolin Manager включена аутентификация и неизвестен пароль пользователя root.

  1. (мастер, реплика, арбитр) Остановите работу Pangolin Manager:

    sudo systemctl stop pangolin-manager.service
  2. (мастер, реплика, арбитр) Выполните удаление директорий и их содержимого:

       sudo rm -rf /pgdata/07/raft_dump
    sudo rm -rf /pgdata/07/raft_data

    Пересоздайте директории, измените привелегии:

       sudo mkdir /pgdata/07/raft_data
    sudo mkdir /pgdata/07/raft_dump
    sudo chmod -R 770 /pgdata/07/raft_data
    sudo chmod -R 770 /pgdata/07/raft_dump
    sudo chown postgres:postgres /pgdata/07/raft_data
    sudo chown postgres:postgres /pgdata/07/raft_dump
  3. (мастер, реплика, арбитр) Запустите Pangolin Manager:

    sudo systemctl daemon-reload
    sudo systemctl start pangolin-manager.service

    Проверьте статус службы на каждом узле:

    sudo systemctl status pangolin-manager.service
  4. (мастер) Настройте аутентификацию в Pangolin Manager:

    Укажите пользователей в Pangolin Manager и включите аутентификацию:

    sudo su - postgres

    /opt/pangolin-manager/bin/pangolin-dcs-ctl user add root:'<password>'
    /opt/pangolin-manager/bin/pangolin-dcs-ctl user add patronietcd:'etcd_password'
    /opt/pangolin-manager/bin/pangolin-dcs-ctl --user root --password '<password>' role add pangolindcsapi
    /opt/pangolin-manager/bin/pangolin-dcs-ctl role grant-permission pangolindcsapi readwrite --prefix /service/
    /opt/pangolin-manager/bin/pangolin-dcs-ctl --user root --password '<password>' user grant-role patronietcd pangolindcsapi
    /opt/pangolin-manager/bin/pangolin-dcs-ctl --user root --password '<password>' auth enable

    Если необходимо, пароль можно засекретить (на узле мастера и реплики), чтобы впоследствии поместить в postgres.yml. Утилита pg_auth_password используется для засекречивания, запрашивает пароль и выдает его засекреченный вид: 'pg_auth_password enc'.

    Проверьте статус кластера:

    pangolin-dcs-ctl member list
    pangolin-dcs-ctl endpoint status --endpoints='{arbiter_host}:{arbiter_ip},{master_host}:{master_ip},{replica_host}:{replica_ip}'
    pangolin-dcs-ctl endpoint health --endpoints='{arbiter_host}:{arbiter_ip},{master_host}:{master_ip},{replica_host}:{replica_ip}'
  5. (мастер, реплика) Если был изменен пароль пользователя patronietcd, необходимо обновить его в конфигурационных файлах Pangolin Manager на мастере и реплике:

    Пароль, засекреченный на мастере, должен быть прописан в postgres.yml мастера, а пароль, засекреченный на реплике, — в postgres.yml реплики.

    Заполните новые пароли в postgres.yml:

    sudo su - postgres
    nano /etc/pangolin-manager/postgres.yml

    Выполните актуализацию файлов postgresql.yml на всех узлах кластера, если для «нового» арбитра были изменены адрес и имя. Если были изменены пароли для patronietcd, следует обратить внимание на такие параметры, как:

    • self_addr
    • partner_addrs
    • connect_address
    • partner_address

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

    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload $CLUSTERNAME
    sudo systemctl restart pangolin-manager
  6. (мастер) Выведите Pangolin Manager из режима паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume

Пересоздание узла арбитра с компонентами Pangolin Manager и etcd

Подготовительные действия

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

  1. (арбитр) Для настройки репозиториев перенесите содержимое с аналогичных файлов на узле мастера или скопируйте сами файлы на узел арбитра и выдайте такие же права:

    Пример команды и репозиториев:

       sudo nano /etc/yum.repos.d/pangolin_local_repo_7.3.1.repo
    sudo nano /etc/yum.repos.d/sbel_local.repo
    sudo nano /etc/yum.repos.d/sberlinux.repo
  2. (мастер) Переведите Pangolin Manager в режим паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause
  3. (арбитр) Если пользователя postgres нет в системе, создайте его:

    sudo useradd -m -r -d /home/postgres \-s /bin/bash postgres

    Параметры команды useradd:

    • -m – создание домашнего каталога для пользователя;
    • -r - пользователь системный;
    • -d - каталог файловой системы, назначенный домашним для этого пользователя;
    • -s - назначение обертки.
  4. (арбитр) В случае необходимости, выполните генерацию серверного сертификата и перенос клиентских сертификатов с мастера для того, чтобы все сертификаты кластера были подписаны одним root-сертификатом.

Установка и настройка etcd

  1. (арбитр) Опционально выполните очистку узла от предыдущих инсталляций, если это необходимо (если виртуальная машина новая, то выполнять данное действие не требуется):

    sudo systemctl stop etcd
    sudo yum remove etcd -y
    sudo rm -rf /var/lib/etcd
    sudo rm -rf /etc/etcd
    sudo rm /usr/lib/systemd/system/etcd.service
  2. (мастер) Установите rpm/deb-пакет компонента etcd:

    sudo yum install etcd
  3. (мастер) Отредактируйте файл конфигурации etcd, пример конфигурации:

    etcd.conf
    sudo nano /etc/etcd/etcd.conf

    ETCD_NAME="{arbiter_host}"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:{IP-address}"
    ETCD_ADVERTISE_CLIENT_URLS="http://{arbiter_host}:{arbiter_ip}"
    ETCD_LISTEN_PEER_URLS="http://0.0.0.0:{IP-address}"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://{arbiter_host}:{arbiter_ip}"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd_clustername"
    ETCD_INITIAL_CLUSTER="{master_host}=http://{master_host}:{master_ip},{replica_host}=http://{replica_host}:{replica_ip},{arbiter_host}=http://{arbiter_host}:{arbiter_ip}"
    ETCD_INITIAL_CLUSTER_STATE="new"
    ETCD_DATA_DIR="/var/lib/etcd"
    ETCD_ELECTION_TIMEOUT="5000"
    ETCD_HEARTBEAT_INTERVAL="1000"
    ETCD_ENABLE_V2="true"
    ETCD_LOG_OUTPUTS="/pgerrorlogs/etcd/etcd.log"
    ETCD_LOGGER="zap"

    Следует изменить следующие параметры:

    • ETCD_NAME
    • ETCD_ADVERTISE_CLIENT_URLS
    • ETCD_INITIAL_CLUSTER
    • ETCD_INITIAL_ADVERTISE_PEER_URLS
    • ETCD_LOG_OUTPUTS
  4. (мастер) Запуск etcd будет осуществляться под пользователем postgres, поэтому поправьте владельцев и права на каталоги с хранилищем etcd, конфигурацией etcd:

    sudo chown postgres:postgres /var/lib/etcd
    sudo chmod -R 700 /var/lib/etcd
    sudo chown -R postgres:postgres /etc/etcd
    sudo chmod -R 700 /etc/etcd

    Пересоздайте директории для хранения логов:

    sudo mkdir -p /pgerrorlogs/etcd
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  5. (мастер) Отредактируйте unit-файл службы etcd:

    Измените поле User в файле etcd.service на пользователя, от имени которого будет запущен сервис, в примере указан postgres:

    sudo nano /usr/lib/systemd/system/etcd.service

    [Unit]
    Description=etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target

    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    EnvironmentFile=-/etc/etcd/etcd.conf
    User=postgres
    # set GOMAXPROCS to number of processors
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 /usr/bin/etcd"

    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target
  6. (мастер) Найдите в файле .bash_profile на узле мастера строки с префиксом: 'alias members', 'alias elist', 'alias elog', 'alias health' и добавьте их в конец аналогичного файла на арбитре. Откорректируйте имена узлов и IP-адреса на значения, соответствующие узлу арбитра.

    Под пользователем postgres, находясь в домашнем каталоге, выполните команду:

    nano .bash_profile

    alias members='ETCDCTL_API=3 etcdctl --endpoints={arbiter_host}:{arbiter_ip},{master_host}:{master_ip},{replica_host}:{replica_ip} member list -w table'
    alias elist='ETCDCTL_API=3 etcdctl --endpoints={arbiter_host}:{arbiter_ip},{master_host}:{master_ip},{replica_host}:{replica_ip} endpoint status -w table --cluster'
    alias elog='cat /pgerrorlogs/etcd/etcd.log'
    alias health='ETCDCTL_API=2 etcdctl --endpoints http://{arbiter_host}:{arbiter_ip},http://{master_host}:{master_ip},http://{replica_host}:{replica_ip} cluster-health 2>&1'

Процедура 1. Мягкий способ без замены всех узлов

Процедура 1 применяется, если:

  • в etcd не включена аутентификация;
  • известен пароль etcd пользователя root.

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

В противном случае перейдите к «Процедуре 2», где производится полная замена всех узлов.

В соответствии с процедурой 1 потерянный узел кластера удаляется и взамен него добавляется новый. Остановка всего кластера etcd не выполняется. При этом, все настройки кластера, включая аутентификационные (если они есть), перенесутся на новый узел etcd. Таким образом, Процедура 1 предлагает более «мягкий» вариант конфигурирования кластера etcd после потери одного из узлов.

  1. (мастер) Выполните оценку состояния кластера. Когда все узлы кластера в рабочем состоянии, то будет выведен следующий результат:

    sudo su - postgres
    $ health
    member 3ac36a8acaf06436 is healthy: got healthy result from http://{replica_host}:{replica_ip}
    member 9c71ac9699e27c8a is healthy: got healthy result from http://{master_host}:{master_ip}
    member e064ad7dfcaedc54 is healthy: got healthy result from http://{arbiter_host}:{arbiter_ip}
    cluster is healthy

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

    $ ETCDCTL_API=3 etcdctl --endpoints={replica_host}:{replica_ip},{master_host}:{master_ip},{arbiter_host}:{arbiter_ip}  --user=root:'<password>' endpoint health
    {"level":"warn","ts":"2025-11-06T09:53:25.273295+0300","logger":"client","caller":"v3/retry_interceptor.go:63","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0000365a0/{arbiter_host}:{arbiter_ip}","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing: dial tcp {IP-Address}: connect: connection refused\""}
    {master_host}:{master_ip} is healthy: successfully committed proposal: took = 1.064394ms
    {replica_host}:{replica_ip} is healthy: successfully committed proposal: took = 728.176µs
    {arbiter_host}:{arbiter_ip} is unhealthy: failed to commit proposal: context deadline exceeded
    Error: unhealthy cluster

    Идентификаторы узлов можно получить при помощи следующей команды:

    $  ETCDCTL_API=3 etcdctl --endpoints={replica_host}:{replica_ip},{master_host}:{master_ip},{arbiter_host}:{arbiter_ip} member list -w table
    +------------------+---------+----------------+------------------------------------+------------------------------------+------------+
    | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
    +------------------+---------+----------------+------------------------------------+------------------------------------+------------+
    | 3ac36a8acaf06436 | started | {replica_host} | http://{replica_host}:{replica_ip} | http://{replica_host}:{replica_ip} | false |
    | 9c71ac9699e27c8a | started | {master_host} | http://{master_host}:{master_ip} | http://{master_host}:{master_ip} | false |
    | e064ad7dfcaedc54 | started | {arbiter_host} | http://{arbiter_host}:{arbiter_ip} | http://{arbiter_host}:{arbiter_ip} | false |
    +------------------+---------+----------------+------------------------------------+------------------------------------+------------+
  2. (мастер) Удалите из кластера узел арбитра, как в следующем примере. Если он существовал ранее и был утерян – информация о нем будет отображаться в результате команды 'cluster-health' или 'member list'.

    В данном примере узел 'e064ad7dfcaedc54' относится к узлу арбитра {arbiter_host} и когда:

    • аутентификация выключена:

      sudo su - postgres
      $ etcdctl member remove e064ad7dfcaedc54
      Member e064ad7dfcaedc54 removed from cluster 9149bec11d9151f4
    • аутентификация включена:

      sudo su - postgres
      $ ETCDCTL_API=3 etcdctl --endpoints={replica_host}:{replica_ip},{master_host}:{master_ip},{arbiter_host}:{arbiter_ip} --user=root:'<password>' member remove e064ad7dfcaedc54
      Member e064ad7dfcaedc54 removed from cluster 9149bec11d9151f4
  3. (мастер) Добавьте новый узел кластера etcd.

    Пример команды и результата, когда:

    • аутентификация выключена:

      sudo su - postgres
      $ etcdctl member add {arbiter_host} http://{arbiter_host}:{arbiter_ip}
      Added member named {arbiter_host} with ID e5882a44ab9d491f to cluster
    • аутентификация включена:

      sudo su - postgres
      $ ETCDCTL_API=3 etcdctl --endpoints={replica_host}:{replica_ip},{master_host}:{master_ip},{arbiter_host}:{arbiter_ip} --user=root:'<password>' member add {arbiter_host} --peer-urls=http://{arbiter_host}:{arbiter_ip}
      Member e5882a44ab9d491f added to cluster 9149bec11d9151f4
  4. В конфигурационном файле /etc/etcd/etcd.conf на узле арбитра установите параметр ETCD_INITIAL_CLUSTER_STATE в значение "existing". Старт компонента etcd на узле арбитра без параметра ETCD_INITIAL_CLUSTER_STATE="existing" не будет успешным.

  5. (арбитр) Запустите службу etcd на узле арбитра:

    sudo systemctl daemon-reload
    sudo systemctl start etcd
    sudo systemctl status etcd
  6. В конфигурационном файле на узле арбитра установите параметр ETCD_INITIAL_CLUSTER_STATE в значение "new". Затем произведите рестарт службы.

    После этого проверьте работоспособность кластера etcd:

    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{arbiter_ip} member list -w table
  7. (мастер) Выведите Pangolin Manager из режима паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume

Процедура 2. Способ с полной заменой всех узлов

Процедура 2 выполняется, если не были выполнены шаги «Процедуры 1» — в случае, когда в etcd включена аутентификация и неизвестен etcd-пароль пользователя root.

примечание

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

  1. (мастер) Переведите Pangolin Manager в режим паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause
  2. (мастер, реплика, арбитр) Остановите службу etcd:

    sudo systemctl stop etcd

    Пересоздайте рабочие директории etcd на каждом узле (они будут заполнены впоследствии автоматически во время первого старта):

    sudo rm -rf /var/lib/etcd
    sudo mkdir -p /var/lib/etcd
    sudo chown postgres:postgres /var/lib/etcd
    sudo chmod 700 /var/lib/etcd
  3. (мастер, реплика, арбитр) Запустите службу etcd:

    sudo systemctl daemon-reload
    sudo systemctl start etcd
  4. (мастер) Укажите пользователей в etcd и включите аутентификацию:

    В зависимости от того, какая версия API указана в postgres.ymletcd, etcd3 или другая, — создание пользователей выполняется для этой же версии.

    Пользователь root является техническим и используется только во время данного конфигурирования. По умолчанию он не используется после установки.

    Если необходимо, пароль можно засекретить (на узле мастера и реплики), чтобы впоследствии поместить в postgres.yml. Утилита pg_auth_password используется для засекречивания, запрашивает пароль и выдает его засекреченный вид: 'pg_auth_password enc'.

    sudo su - postgres

    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} user add root:'<password>'
    --назначить роль root пользователю root
    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} user grant-role root root

    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} user add patronietcd:'<password>'
    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} role add patroni
    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} role grant-permission patroni readwrite --prefix=true /service/
    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} user grant-role patronietcd patroni
    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} auth enable

    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} user add root:'<password>'
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} user add patronietcd:'<password>'
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} role add patroni
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} role grant patroni -path '/service/*' -readwrite
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} user grant patronietcd -roles patroni
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} auth enable
    ETCDCTL_API=2 etcdctl --endpoints http://{master_host}:{master_ip} -u root:'<password>' role revoke guest -path '/*' --readwrite

    ETCDCTL_API=3 etcdctl --endpoints={master_host}:{master_ip} member list -w table
    ETCDCTL_API=3 etcdctl --endpoints={replica_host}:{replica_ip} --user=root:'<password>' user list
  5. (мастер, реплика) Если был изменен пароль пользователя patronietcd, необходимо обновить его в конфигурационных файлах Pangolin Manager на мастере и реплике.

    Пароль, засекреченный на мастере, должен быть прописан в postgres.yml мастера, а пароль, засекреченный на реплике, — в postgres.yml реплики.

    Заполните новые пароли в postgres.yml:

    sudo su - postgres
    nano /etc/pangolin-manager/postgres.yml
  6. (мастер, реплика) Актуализируйте новые файлы postgres.yml, содержащие новые пароли patronietcd:

    sudo systemctl restart pangolin-manager
  7. (мастер) Выведите Pangolin Manager из режима паузы:

    sudo su - postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume