8. Режим обслуживания

Добавлено в v0.1.0.

8.1. О режиме обслуживания

Режим обслуживания позволяет временно приостановить полноценную работу кластера, при этом не теряя состояние master/slave узлов.

Это полезно при обновлениях СУБД и отладке кластера.

В режиме обслуживания выполняются следующие действия:

  1. Ручная остановка rdbserver игнорируется и не приведет к demote или отключению slave от кластера

  2. При остановке cook не останавливает rdbserver

  3. При запуске cook не запускает rdbserver

  4. cookd в режиме master игнорирует потерю блокировки в Consul

  5. cookd в режиме slave игнорирует потерю master и не выполняет promote

  6. cookd в режиме slave подключится к новому master, если он появится в кластере

  7. cookd выполнит ручной promote и demote игнорируя любые ограничения

Для того, чтобы перевести кластер в режим обслуживания нужно выполнить команду cookctl maintenance с параметром 1.

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

cookctl -c config.yml maintenance 1 --wait
Enabling maintenance mode

cookctl status показывает режим обслуживания для всего кластера и отдельно для узлов:

cookctl -c config.yml status

testcluster (c93e02c8-0e7d-49ee-b286-c7195c221b6a, 0.2.0) generation 2 (585866d6-85b0-45e9-8002-a257619e8157), locked by node1, MAINTENANCE

node0 (slave) API URL http://127.0.0.1:5030, RDB 3.0.9.0 on 3050 and AUX 3060 (127.0.0.1/3050), failover enabled, pending restart, MAINTENANCE
    /tmp/cook/node0/database1.fdb (testdb1, 4b2780bd-0d3d-4da3-b037-98fb3b0b9e01) 2:0 127.0.0.1/3050:testdb1
    /tmp/cook/node0/database2.fdb (testdb2, 010228a8-33d2-4058-bbe5-5b441d1acbbc) 2:0 127.0.0.1/3050:testdb2
node1 (master) API URL http://127.0.0.1:5031, RDB 3.0.9.0 on 3051 and AUX 3060 (127.0.0.1/3051), failover enabled, pending restart, MAINTENANCE
    /tmp/cook/node1/database1.fdb (testdb1, 4b2780bd-0d3d-4da3-b037-98fb3b0b9e01) 2:0 127.0.0.1/3051:testdb1
    /tmp/cook/node1/database2.fdb (testdb2, 010228a8-33d2-4058-bbe5-5b441d1acbbc) 2:0 127.0.0.1/3051:testdb2

Узлы в режиме обслуживания добавляют (MAINTENANCE) в логах:

[node1 (MAINTENANCE)] INFO:2022-04-25 14:34:00,568 - cook.mind:436 - Processing locked cluster as master. Lock owned by node1
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,569 - cook.mind:458 - Updating data state...
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,569 - cook.rdb:535 - Updating master data position...
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,569 - cook.rdb:995 - Selecting data from mon$replication
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,575 - cook.rdb:538 - Master position of /tmp/cook/node1/database1.fdb (testdb1, 4b2780bd-0d3d-4da3-b037-98fb3b0b9e01) is 2:0
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,576 - cook.rdb:995 - Selecting data from mon$replication
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,581 - cook.rdb:538 - Master position of /tmp/cook/node1/database2.fdb (testdb2, 010228a8-33d2-4058-bbe5-5b441d1acbbc) is 2:0
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,582 - cook.mind:462 - Updating master lock...
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,582 - cook.arbiter:281 - Updating master lock
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,582 - cook.arbiter:283 - Renewing consul session...
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,585 - cook.mind:464 - Master lock and cluster position updated
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,585 - cook.mind:197 - Updating my status in cluster
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:00,606 - cook.mind:197 - Updating my status in cluster
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:05,544 - cook.mind:64 - Node step
[node1 (MAINTENANCE)] DEBUG:2022-04-25 14:34:05,545 - cook.mind:197 - Updating my status in cluster

Для того, чтобы перевести кластер в нормальный режим нужно выполнить команду cookctl maintenance с параметром 0.

cookctl -c config.yml maintenance 0 --wait
Disabling maintenance mode

8.2. Пример использования режима обслуживания

При выполнении обновления RedDatabase необходимо остановить сервер СУБД, кластера это означает остановка сервиса cook и, если обновление выполняется на master, то demote текущего и promote нового. Для того чтобы этого избежать можно:

  1. Перевести cookd в режим maintenance

  2. Остановить rdbserver вручную

  3. Обновить дистрибутив RedDatabase

  4. Запустить rdbserver вручную

  5. Перевести cookd в нормальный режим