?

Log in

No account? Create an account
Cat-light

klink0v


Блохи в свитере деда Сергеича


Проблемы с Corosync внутри KVM-виртуалок
Cat-light
klink0v

Есть такая софтинка для организации коммуникации между различными компонентами (например, узлами кластера), называется Corosync. В частности, её можно использовать в качестве транспорта по обмену сообщениями для менджера ресурсов кластера под названием Pacemaker.

Покуда под мои задачи ещё не купили много крутого и дорого железа, я тренируюсь на кошках KVM-виртуалках. И пытаюсь внутри них гонять все эти прелести.

Так вот, я обнаружил неприятный эффект. При некоторых обстоятельствах этот самый Corosync внутри виртуальных машин начинает дико косячить и вообще вести себя слабопредсказуемым образом. Иногда подвисает при попытке останова, иногда уходит в split-brain после рестарта одной из машин, иногда ещё чего-нибудь выкинет. Пришлось потратить несколько часов на разбор полётов.

Оказалось, что если ядро хост-машины собрано с опцией "CONFIG_BRIDGE_IGMP_SNOOPING", то дюже умный драйвер сетевого моста в Linux начинает сам решать, куда пропускать multicast-ы, а куда нет. И поскольку по умолчанию Corosync использует как раз таки групповые рассылки UDP-пакетов, то такое поведение ядра становится препятствием на пути оповещений, исходящих от виртуальной машины "в мир".

Соответственно, решений может быть три.

  1. Сконфигурировать Corosync на использование unicast.
  2. Использовать на хост-машине ядро без поддержки igmp snooping.
  3. Отключить igmp snooping командой типа
    echo 0 > /sys/devices/virtual/net/vmbr0/bridge/multicast_snooping
    где vmbr0 — имя моста на хост-машине, к которому подключена нужная нам виртуалка.

Если интересно, подробнее про эту проблему можно прочитать, например, здесь.