# Инструкция по смене `pg_advertise` адреса

***Инструкция актуальна для версии 25.3***

Данная инструкция описывает алгоритм по безопасной смене `pg_advertise` адреса уже
работающего инстанса.

1. Измените значение поля `address` из `_pico_peer_address` для нужного инстанса следующей командой:

```sql
UPDATE _pico_peer_address SET address = 'fqdn:port' WHERE raft_id = $raft_id and connection_type = 'pgproto';
```

Выполнить команду можно только с правами админа. Поэтому
подключение должно быть либо через админский сокет, либо `psql`
с правами админа.

***Важно*** — необходимо проконтролировать что DML применился на нужном инстансе.

Вывод `SELECT * FROM _pico_peer_address;` до команды:
```
+---------+----------------------------------+-----------------+
| raft_id | address                          | connection_type |
+==============================================================+
| 1       | fqdn:13301                       | iproto          |
|---------+----------------------------------+-----------------|
| 1       | 0.0.0.0:15001                    | pgproto         |
+---------+----------------------------------+-----------------+
```

После команды:
```
+---------+----------------------------------+-----------------+
| raft_id | address                          | connection_type |
+==============================================================+
| 1       | fqdn:13301                       | iproto          |
|---------+----------------------------------+-----------------|
| 1       | fqdn:15001                       | pgproto         |
+---------+----------------------------------+-----------------+
```

2. В конфигурационный файл инстанса в секцию `pg` рядом с `pg_listen`, либо допишите строку с `pg_advertise` и нужным адресом, как например
в случае апргейда кластера с 25.2, либо измените значение уже существущей записи:

```
pg:
    listen: 0.0.0.0:4327
    advertise: new_fqdn:port
```

3. Перезапустите службу (сервис) инстанса, чтобы изменения в
 конфигурационном файле вступили в силу..

Если инстанс после рестарта работает и в логах нет ошибок или его `state` из таблицы `_pico_instance` стал `Online`, значит смена адреса прошла успешно.

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


***Рекомендуется*** применять этот алгоритм к инстансам последовательно, по одному.
Это гарантирует сохранение кворума и доступности кластера на протяжении всего процесса обновления.
Одновременное применение алгоритма на всех узлах может привести к потере связи между ними и полной недоступности кластера.

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

`pg_advertise` появился в [25.3](https://git.picodata.io/core/picodata/-/blob/master/CHANGELOG.md?ref_type=heads#config). Поэтому в более старых версиях в таблице `_pico_peer_address`
содержится значение `pg_listen`. В таких случаях кластер необходимо проапгрейдить кластер до 25.3, а затем следовать основной инструкции.
При апгрейде кластера до 25.3 следует обратить внимание на то, чтобы `pg_listen` в конфиг файле
не расходился с `pg_advertise` значением из `_pico_peer_address`.
