Category:

Corosync: положу вашу сеть. Быстро, дешево, качественно.

Есть одна софтинка, не буду говорить какая. Кто знает, сам догадается. В качестве сервиса для синхронизации конфигурации нод кластера она исторически использует не ставший уже промышленным стандартом ZooKeeper, а несколько экзотический Corosync.

И то ли в самом Corosync-е есть архитектурные изъяны (что более вероятно), то ли софтина испольует его каким-то дюже нетрадиционным способом (что менее вероятно, но тоже возможно), только вот при количестве нод в кластере более 20ти наступает внезапный неожиданный эффект: сеть ложится. Совсем. То есть полностью. На любых сетевых картах и с любыми коммутаторами. В непредсказуемый момент. До такой степени, что разваливаются LACP-линки по причине непрохождения 802.3ad PDU между коммутатором и ядром операционной системы подключенного к этому коммутатору сервера.

Мы "поймали" такой эффект на Juniper EX2300, Cisco 9200, Broadcom BCM5719, Intel X722. Симптомы плюс-минус одинаковые. Пока узлов в кластере мало, все работает хорошо. Но если либо растет их количество, либо нагрузка на них, то они начинают генерировать весьма существенный трафик (до 300 МБит/с), и всё с треском падает. Причем, не просто разваливается сам кластер. Рушатся ethernet-линки до серверов, что приводит к уходу со связи. Но стоит только остановить пресловутый corosync, как работа сети тут же восстанавливается.

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

Сеть гигабитная. Коммутаторы не самые плохие. Уж 300 МБит/с они должны бы через себя прокачать. Трафик генерируется чисто unicast-овый, хоть и UDPшный. Если посмотреть по PPS (packets per second), там в пике не так уж и много получается, никак не больше 3000 PPS на порт. Ядро более-менее свежее, из ветки 5.4 или новее. Пробовали переводить логику работы Corosync-а с UDP на SCTP. Не помогло: сеть всё равно под нагрузкой падает.

Причём, с подобным эффектом столкнулись не только мы. Потом уже нашли на форумах аналогичные проблемы у других. Но они рапортуют, что им помогло шейпирование трафика corosync-а средствами iptables. Мы попробовали, не помогло. Да и объемы трафика у нас намного меньше. Но доходит до смешного. 28 машин в кластере: всё нормально. Добавляешь 29-ую: всё рушится. "П" — "предсказуемость". Какой-то закономерности, при которой оно начинает падать, выявлено не было.

Еще сильно усложняет ситуацию то, что на проде особо не поэкспериментируешь, а в лабораторных условиях не воспроизведешь. Где ты возьмешь 30 свободных железок и чем нагрузишь? Непонятно.

Пока что решили вынести служебный трафик Corosync-а в отдельную физическую сеть. По крайней мере, можно будет проверять какие-то версии без боязни уронить всё и на хрен. Но это какой-то трындец, товарищи. Я в замешательстве. А главное, "всё понятно, что ничего не понятно".

И чтоб два раза не вставать, странный вопрос. Кто-нибудь где-нибудь видел в России хостера, чтобы давал отдельный тенант vSphere, но при этом позволял бы самостоятельно "раскивдывать" свои виртуалки по физическим ящикам? Если видели такого, скажите пожалуйста как его зовут. Спасибо.

Всем хороших хостеров и стабильной сети.