drbd: State change failed: No response from secondary peer — Решение сбоев DRBD
Архитектура ошибки и симптомы сбоя
Сообщение «drbd: State change failed: No response from secondary peer» регистрируется ядерным модулем DRBD (Distributed Replicated Block Device). Ошибка указывает на то, что локальная нода попыталась изменить свое состояние (например, повысить статус с Secondary до Primary или сбросить флаг репликации), но сетевой обмен с удаленной нодой (Peer) завершился таймаутом. Это приводит к разрыву связи (Connection state: StandAlone или Disconnecting) и высокому риску разделения кластера (Split-Brain).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Connection State | StandAlone / Unconnected | Локальная нода изолирована и прекратила синхронизацию блоков. |
| Role Mismatch | Primary/Unknown | Нода не может подтвердить статус удаленного узла перед промоутом. |
| Split-Brain Threat | Data Divergence | Риск параллельной записи разных данных на обоих узлах кластера. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка текущего статуса репликации DRBD
# Просмотр статуса ресурсов DRBD (версии 9.x / 8.4):
sudo drbdadm status
# Либо через устаревший интерфейс:
cat /proc/drbd
# Проверка логов ядра на признаки Split-Brain:
dmesg -T | grep -E "(drbd|Split-Brain)"Сценарий 2: Ручное разрешение состояния Split-Brain (Ручной выбор источника правды)
Если произошел Split-Brain, выберите узел с устаревшими данными (Victim Node) и сбросьте его данные:
# 1. На узле с УСТАРЕВШИМИ данными (Secondary):
sudo drbdadm disconnect resource_name
sudo drbdadm secondary resource_name
sudo drbdadm connect --discard-my-data resource_name
# 2. На узле с АКТУАЛЬНЫМИ данными (Primary):
sudo drbdadm disconnect resource_name
sudo drbdadm connect resource_nameСценарий 3: Восстановление сетевой связности и проверка выделенного линка
# Проверка доступности IP-адресов DRBD сети репликации:
ping -c 4 192.168.100.2
# Принудительное переподключение ресурса без сброса данных:
sudo drbdadm connect resource_nameСценарий 4: Настройка Fencing и Stonith в /etc/drbd.d/
Настройте автоматическую изоляцию узла для защиты от взаимного промоута:
net {
fencing resource-only;
}
handlers {
fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh";
unfence-peer "/usr/lib/drbd/crm-unfence-peer.9.sh";
}ITSTM проводит аудит отказоустойчивых кластеров, ликвидацию Split-Brain без потери транзакций БД и интеграцию аппаратного STONITH/IPMI.
Частые вопросы (FAQ)
Почему нода DRBD переходит в состояние StandAlone?
Состояние StandAlone — защитный механизм DRBD. При обнаружении конфликта поколений данных (Split-Brain) или критической сетевой ошибки нода отключается от сети репликации, чтобы не затереть свои и чужие данные.
Чем отличается протокол синхронизации Protocol A от Protocol C в DRBD?
Protocol A (асинхронный) подтверждает запись, как только данные попали в локальный диск и сетевой буфер. Protocol C (полностью синхронный, стандарт для HA) подтверждает запись только после того, как обе ноды записали блок на свои физические накопители.
Что делает флаг --discard-my-data при подключении DRBD?
Он указывает локальной ноде считать свои локальные изменения недействительными и полностью перезаписать их блоками, полученными от удаленной ноды в процессе начальной ресинхронизации.
Как принудительно сделать ноду Primary, если удаленный узел мертв?
Выполните команду: sudo drbdadm primary --force resource_name. Применяйте ее только в том случае, если вы на 100% уверены, что вторая нода выключена и не принимает трафик.