Репликация для аварийного восстановления (DR, disaster recovery) держит горячий резервный кластер — полную копию хранилища primary вместе с локальными данными (токенами, арендами). DR-secondary не обслуживает клиентов (кроме распечатывания и небольшого служебного набора) и ждёт promote, чтобы принять нагрузку при отказе primary.
Перед началом
Перед настройкой DR-репликации подготовьте следующее:
- Убедитесь, что оба кластера работают на Stronghold EE с integrated Raft storage и что репликация включена. Подробнее — в разделе «Обзор».
- Убедитесь, что кластерный порт primary доступен с secondary и что у вас есть CA-сертификат primary для TLS.
- Подготовьте токен с правами на
sys/replication/*на primary. - Обеспечьте доступ к долям ключей для церемонии promote: при ручном распечатывании (Shamir) — доли ключа распечатывания, при авто-распечатывании — доли ключа восстановления. Понадобится их кворум по порогу, заданному при инициализации.
В примерах ниже ${PRIMARY_ADDR} и ${SECONDARY_ADDR} — API-адреса кластеров,
а ${VAULT_TOKEN} — токен с правами на sys/replication/*.
Если репликацию включают на кластере, где уже есть данные (например, после
обновления со сборки без репликации), или после периода с отключённой
репликацией, узел при первом запуске сам заново индексирует хранилище. Вызывать
sys/replication/reindex вручную не нужно.
Шаг 1. Включите DR primary
На кластере primary включите DR-репликацию в режиме primary:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write -force sys/replication/dr/primary/enablestronghold write -force sys/replication/dr/primary/enableШаг 2. Создайте activation-токен для DR secondary
На кластере primary создайте activation-токен для DR secondary:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write sys/replication/dr/primary/secondary-token id=dr-1 ttl=24hstronghold write sys/replication/dr/primary/secondary-token id=dr-1 ttl=24hПараметр id обязателен, ttl по умолчанию — 30m. Команда возвращает
токен обёртывания в поле wrap_info.token — его и передайте на secondary.
Шаг 3. Включите DR secondary
На кластере secondary включите DR-репликацию в режиме secondary с activation-токеном:
curl --header "X-Vault-Token: ${VAULT_TOKEN}" --request POST --data @dr-secondary-enable.json "${SECONDARY_ADDR}/v1/sys/replication/dr/secondary/enable"Пример dr-secondary-enable.json:
{
"token": "<WRAPPING_TOKEN>",
"primary_api_addr": "<PRIMARY_API_ADDR>",
"ca_file": "<PRIMARY_CA_FILE>"
}В примере:
<WRAPPING_TOKEN>— токен обёртывания из поляwrap_info.token, полученный на шаге 2;<PRIMARY_API_ADDR>— API-адрес кластера primary;<PRIMARY_CA_FILE>— путь к CA-сертификату primary в формате PEM на сервере secondary.
Для окружений с самоподписанными сертификатами параметр ca_file или ca_path (CA primary в
формате PEM, читается на сервере secondary) обязателен. DR-secondary копирует всё хранилище, включая локальные
данные, и не обслуживает клиентские запросы.
Шаг 4. Проверьте статус
Проверьте статус репликации на кластере secondary:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold read -address="${SECONDARY_ADDR}" sys/replication/dr/statusstronghold read -address="${SECONDARY_ADDR}" sys/replication/dr/statusСтатус показывает mode, state, connection_state, last_wal и
last_remote_wal. DR-secondary догнал primary, когда его last_wal дошёл до
last_remote_wal.
Повышение DR-secondary
Повышение требует DR operation token — его выпускают через церемонию с долями ключей и одноразовым паролем (OTP).
Запустите церемонию. В ответе возвращаются
nonceиotp:curl --request PUT --data '{}' "${SECONDARY_ADDR}/v1/sys/replication/dr/secondary/generate-operation-token/attempt"Внесите долю ключа. Повторите для каждой требуемой доли:
curl --request PUT --data '{"key":"<KEY_SHARE>","nonce":"<NONCE>"}' "${SECONDARY_ADDR}/v1/sys/replication/dr/secondary/generate-operation-token/update"В команде
<KEY_SHARE>— доля ключа распечатывания или ключа восстановления,<NONCE>— значениеnonceиз предыдущего шага.Когда
completeстановитсяtrue, в ответе появляетсяencoded_token. Расшифруйте его с помощьюotp, чтобы получить DR operation token.Повысьте secondary с помощью DR operation token:
curl --request POST --data '{"dr_operation_token":"<DR_OPERATION_TOKEN>"}' "${SECONDARY_ADDR}/v1/sys/replication/dr/secondary/promote"В команде
<DR_OPERATION_TOKEN>— DR operation token из предыдущего шага.
После promote бывший secondary становится активным DR primary и обслуживает клиентов.
Возврат прежнего primary
После аварийного переключения в кластере уже есть активный primary — повышенный secondary. Прежний primary нельзя просто запустить обратно как primary, иначе в кластере окажется два primary. Вместо этого подключите его к новому primary как DR secondary.
- На новом primary выпустите activation-токен:
d8 stronghold write sys/replication/dr/primary/secondary-token id=<SECONDARY_ID>. Activation-токен находится в полеwrap_info.tokenответа. - Если прежний primary ещё считает себя primary, понизьте его:
d8 stronghold write -force sys/replication/dr/primary/demote. После demote прежний primary становится DR secondary. - На прежнем primary выпустите DR operation token. Выполните шаги 1 и 2 из раздела «Повышение DR-secondary», указав адрес прежнего primary.
- Подключите прежний primary к новому primary и передайте DR operation token:
d8 stronghold write sys/replication/dr/secondary/update-primary token=<ACTIVATION_TOKEN> dr_operation_token=<DR_OPERATION_TOKEN>.
В командах:
<SECONDARY_ID>— идентификатор DR secondary на новом primary;<ACTIVATION_TOKEN>— activation-токен из шага 1;<DR_OPERATION_TOKEN>— DR operation token из шага 3.
Используйте именно token-метод: у нового primary другой идентификатор кластера,
и primary_cluster_addr для него не подойдёт.
Операции управления
В таблице перечислены команды управления DR-репликацией:
| Действие | Эндпоинт |
|---|---|
| Статус | d8 stronghold read sys/replication/dr/status |
| Отозвать secondary | d8 stronghold write sys/replication/dr/primary/revoke-secondary id=dr-1 |
| Отключить на primary | d8 stronghold write -force sys/replication/dr/primary/disable |
| Понизить primary (demote) | d8 stronghold write -force sys/replication/dr/primary/demote |
| Перенаправить secondary | d8 stronghold write sys/replication/dr/secondary/update-primary token=<ACTIVATION_TOKEN> dr_operation_token=<DR_OPERATION_TOKEN> |
Учитывайте следующее:
demoteпонижает DR primary до отключённого DR secondary, сохраняя cluster ID и локальные данные, — узел готов переподключиться без обнуления.update-primaryвыполняется на DR secondary и требует DR operation token.- Плановое переключение:
demoteна текущем primary,promoteна резерве, затемupdate-primary, чтобы вернуть прежний primary как secondary. Подробнее — в разделе «Возврат прежнего primary».