Пересоздание узла арбитра
В данном разделе описан процесс восстановления только отказавшего узла, а не всего кластера целиком при полной утери узла арбитра.
Процесс пересоздания узлов СУБД Pangolin представлен в связке Pangolin Manager и Pangolin DCS или с применением Pangolin Manager и etcd. В статье приведены примеры команд для Platform V SberLinux OS Server (SLO) 9.6 и версии продукта 6.7.6.
Для восстановления потребуется полностью новая виртуальная машина.
Для наглядности приведенных ниже действий и их последовательности в описываемой процедуре приводятся примеры команд. Допускается выполнение данных действий какими-либо другими средствами или командами, более удобными с точки зрения пользователя.
Обозначение параметров
В примерах команд далее используются параметры для обозначения имен узлов вместо действительных значений:
- узел мастера:
{master_host}и{master_ip}; - узел реплики:
{replica_host}и{replica_ip}; - узел арбитра:
{arbiter_host}и{arbiter_ip}.
Также имеются другие обозначения:
{base_version}– базовая версия продукта (текущая: 6);{short_version}– короткая версия продукта (текущая: 6.7);product_version– полная версия продукта (текущая: 6.7.6);{cluster_id}– ID кластера;{version_component}– версия поставляемого расширения;{OS}– наименование операционной системы и ее версия.
Каждый пункт будет начинаться с информации в круглых скобках о том, на каких узлах необходимо выполнить данный шаг. Все команды необходимо выполнять последовательно.
Например, сочетание (master, replica) означает, что действия, указанные в пункте, необходимо выполнить сначала на основном узле, затем на реплике (при этом выполнять действия на арбитре не нужно).
Пересоздание узла арбитра с компонентами Pangolin Manager и Pangolin DCS
Подготовительные действия
Для выполнения данного сценария предполагается наличие новой виртуальной машины, на которой будет производиться установка. Все команды и набор необходимых действий ниже являются примерами. В других версиях могут отличаться имена файлов, директорий, набор компонентов, особенности конфигурации, влияющие на выбор того или иного формата команд и другое. Их необходимо отредактировать в соответствии с проводимым сценарием конфигурации и окружения.
-
(arbiter) Для настройки репозиториев перенесите содержимое с аналогичных файлов на узле мастера или скопируйте сами файлы на узел арбитра и выдайте такие же права.
Пример команды и репозиториев:
sudo nano /etc/yum.repos.d/pangolin_local_repo_{product_version}.repo
sudo nano /etc/yum.repos.d/sbel_local.repo
sudo nano /etc/yum.repos.d/sberlinux.repo -
(master) Переведите Pangolin Manager в режим паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause -
(arbiter) В случае необходимости, выполните генерацию серверного сертификата и перенос клиентских сертификатов с мастера для того, чтобы все сертификаты кластера были подписаны одним
root-сертификатом.
Установка Pangolin DCS
-
(arbiter) Установите rpm/deb-пакеты компонента
pangolin-managerи его зависимостьpangolin-manager-venv:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm
sudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpmsudo apt install pangolin-manager-venv-{version_component}_amd64.deb
sudo apt install pangolin-manager-{version_component}_amd64.debsudo apt-get install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm
sudo apt-get install pangolin-manager-{version_component}-{OS}.x86_64.rpmПример команды:
sudo yum install -y "/tmp/distr/distributive/3rdparty/pangolin-manager-venv/pangolin-manager-venv-2.1.19-sberlinux8.x86_64.rpm"
sudo yum install -y "/tmp/distr/distributive/pangolin-manager-2.1.19-sberlinux8.x86_64.rpm" -
(arbiter) В связи с добавлением утилит безопасности (
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 -
(arbiter) Выполните конфигурацию unit-файла службы Pangolin Manager, пример файла можно получить на мастере.
Пример команды:
nano /usr/lib/systemd/system/pangolin-manager.service -
(arbiter) Отредактируйте конфигурационный файл 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/0{base_version}/raft_data
journal_max_size: 10485760
journal_wait_timeout: 10
memory_journal_size: 10000
journal_force_read_wait: True
dump_dir: /pgdata/0{base_version}/raft_dump
dump_interval: 300
dump_wait_timeout: 10
logfile: /pgerrorlogs/0{base_version}/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/0{base_version}/audit
filename: pangolin-manager
rotation_age: 1d
rotation_size: 10M
file_mode: 0600
log:
dir: "/pgerrorlogs/0{base_version}/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 -
(arbiter) Создайте директории, измените привилегии:
sudo mkdir -p /pgdata/0{base_version}/{raft_data,raft_dump}
sudo mkdir -p /pgerrorlogs/0{base_version}/{audit,raft,pangolin-manager}
sudo chown -R postgres:postgres /pgdata
sudo chmod -R 770 /pgdata
sudo chown -R postgres:pangolin_users /pgerrorlogs
sudo chmod -R 770 /pgerrorlogs -
(arbiter) Найдите в файле
.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 после потери одного из узлов.
-
(master) Выполните оценку состояния кластера. Когда все узлы кластера в рабочем состоянии, то будет выведен следующий результат:
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 -
(master) Удалите из кластера узел арбитра, как в следующем примере. Если он существовал ранее и был утерян – информация о нем будет отображаться в результате команды
'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 -
(master) Добавьте новый узел кластера. В данном примере приводится вариант команды и результат:
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 -
(master, replica, arbiter) Выполните актуализацию файлов
postgres.ymlна всех узлах кластера, если для «нового» арбитра были изменены адрес и имя, следует обратить внимание на такие параметры как:self_addr;
partner_addrs;
connect_address;
partner_address. -
(arbiter) Запустите службу Pangolin Manager на узле арбитра:
sudo systemctl daemon-reload
sudo systemctl start pangolin-manager
sudo systemctl status pangolin-manager -
(master) Выведите Pangolin Manager из режима паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume
Процедура 2. Способ с полной заменой всех узлов
Процедура 2 выполняется, если не были выполнены шаги «Процедуры 1», то есть в случае, когда в Pangolin Manager включена аутентификация и неизвестен пароль пользователя root.
-
(master, replica, arbiter) Остановите работу Pangolin Manager:
sudo systemctl stop pangolin-manager.service -
(master, replica, arbiter) Выполните удаление директорий и их содержимого:
sudo rm -rf /pgdata/0{base_version}/raft_dump
sudo rm -rf /pgdata/0{base_version}/raft_dataПересоздайте директории, измените привелегии:
sudo mkdir /pgdata/0{base_version}/raft_data
sudo mkdir /pgdata/0{base_version}/raft_dump
sudo chmod -R 770 /pgdata/0{base_version}/raft_data
sudo chmod -R 770 /pgdata/0{base_version}/raft_dump
sudo chown postgres:postgres /pgdata/0{base_version}/raft_data
sudo chown postgres:postgres /pgdata/0{base_version}/raft_dump -
(master, replica, arbiter) Запустите Pangolin Manager:
sudo systemctl daemon-reload
sudo systemctl start pangolin-manager.serviceПроверьте статус службы на каждом узле:
sudo systemctl status pangolin-manager.service -
(master) Настройте аутентификацию в 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}' -
(master, replica) Если был изменен пароль пользователя
patronietcd, необходимо обновить его в конфигурационных файлах Pangolin Manager на мастере и реплике:Пароль, засекреченный на мастере, должен быть прописан в
postgres.ymlмастера, а пароль, засекреченный на реплике, — вpostgres.ymlреплики.Заполните новые пароли в
postgres.yml:sudo su - postgres
nano /etc/pangolin-manager/postgres.ymlВыполните актуализацию файлов
postgresql.ymlна всех узлах кластера, если для «нового» арбитра были изменены адрес и имя. Если были изменены пароли дляpatronietcd, следует обратить внимание на такие параметры, как:self_addrpartner_addrsconnect_addresspartner_address
Затем выполните:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload $CLNAME
sudo systemctl restart pangolin-manager -
(master) Выведите Pangolin Manager из режима паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume
Пересоздание узла арбитра с компонентами Pangolin Manager и etcd
Подготовительные действия
Для выполнения данного сценария предполагается наличие новой виртуальной машины, на которой будет производиться установка. Все команды и набор необходимых действий ниже являются примерами. В других версиях могут отличаться имена файлов, директорий, набор компонентов, особенности конфигурации, влияющие на выбор того или иного формата команд и другое. Их необходимо отредактировать в соответствии с проводимым сценарием конфигурации и окружения.
-
(arbiter) Для настройки репозиториев перенесите содержимое с аналогичных файлов на узле мастера или скопируйте сами файлы на узел арбитра и выдайте такие же права:
Пример команды и репозиториев:
sudo nano /etc/yum.repos.d/pangolin_local_repo_{product_version}.repo
sudo nano /etc/yum.repos.d/sbel_local.repo
sudo nano /etc/yum.repos.d/sberlinux.repo -
(master) Переведите Pangolin Manager в режим паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause -
(arbiter) Если пользователя
postgresнет в системе, создайте его:sudo useradd -m -r -d /home/postgres \-s /bin/bash postgresПараметры команды
useradd:-m– создание домашнего каталога для пользователя;-r- пользователь системный;-d- каталог файловой системы, назначенный домашним для этого пользователя;-s- назначение обертки.
-
(arbiter) В случае необходимости, выполните генерацию серверного сертификата и перенос клиентских сертификатов с мастера для того, чтобы все сертификаты кластера были подписаны одним
root-сертификатом.
Установка и настройка etcd
-
(arbiter) Опционально выполните очистку узла от предыдущих инсталляций, если это необходимо (если виртуальная машина новая, то выполнять данное действие не требуется):
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 -
(master) Установите rpm/deb-пакет компонента etcd:
- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo yum install etcdsudo apt install etcdsudo apt-get install etcd -
(master) Отредактируйте файл конфигурации
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/0{base_version}/etcd/etcd.log"
ETCD_LOGGER="zap"Следует изменить следующие параметры:
ETCD_NAMEETCD_ADVERTISE_CLIENT_URLSETCD_INITIAL_CLUSTERETCD_INITIAL_ADVERTISE_PEER_URLSETCD_LOG_OUTPUTS
-
(master) Запуск
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/0{base_version}/etcd
sudo chown -R postgres:postgres /pgerrorlogs
sudo chmod -R 770 /pgerrorlogs -
(master) Отредактируйте 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 -
(master) Найдите в файле
.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/0{base_version}/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 после потери одного из узлов.
-
(master) Выполните оценку состояния кластера. Когда все узлы кластера в рабочем состоянии, то будет выведен следующий результат:
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 |
+------------------+---------+----------------+------------------------------------+------------------------------------+------------+ -
(master) Удалите из кластера узел арбитра, как в следующем примере. Если он существовал ранее и был утерян – информация о нем будет отображаться в результате команды
'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
-
-
(master) Добавьте новый узел кластера
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
-
-
В конфигурационном файле
/etc/etcd/etcd.confна узле арбитра установите параметрETCD_INITIAL_CLUSTER_STATEв значение"existing". Старт компонента etcd на узле арбитра без параметраETCD_INITIAL_CLUSTER_STATE="existing"не будет успешным. -
(arbiter) Запустите службу etcd на узле арбитра:
sudo systemctl daemon-reload
sudo systemctl start etcd
sudo systemctl status etcd -
В конфигурационном файле на узле арбитра установите параметр
ETCD_INITIAL_CLUSTER_STATEв значение"new". Затем произведите рестарт службы.После этого проверьте работоспособность кластера
etcd:ETCDCTL_API=3 etcdctl --endpoints={master_host}:{arbiter_ip} member list -w table -
(master) Выведите Pangolin Manager из режима паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume
Процедура 2. Способ с полной заменой всех узлов
Процедура 2 выполняется, если не были выполнены шаги «Процедуры 1», то есть в случае, когда в etcd включена аутентификация и неизвестен etcd-пароль пользователя root.
Пересоздание рабочих директорий etcd может выполняться независимо от выбора процедуры в случае, если возникает необходимость переписать в etcd параметры аутентификации.
-
(master) Переведите Pangolin Manager в режим паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause -
(master, replica, arbiter) Остановите службу
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 -
(master, replica, arbiter) Запустите службу
etcd:sudo systemctl daemon-reload
sudo systemctl start etcd -
(master) Укажите пользователей в
etcdи включите аутентификацию:В зависимости от того, какая версия API указана в
postgres.yml—etcd,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 -
(master, replica) Если был изменен пароль пользователя
patronietcd, необходимо обновить его в конфигурационных файлах Pangolin Manager на мастере и реплике.Пароль, засекреченный на мастере, должен быть прописан в
postgres.ymlмастера, а пароль, засекреченный на реплике, — вpostgres.ymlреплики.Заполните новые пароли в
postgres.yml:sudo su - postgres
nano /etc/pangolin-manager/postgres.yml -
(master, replica) Актуализируйте новые файлы
postgres.yml, содержащие новые паролиpatronietcd:sudo systemctl restart pangolin-manager -
(master) Выведите Pangolin Manager из режима паузы:
sudo su - postgres
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume