Как стать автором
Обновить

Комментарии 14

В двух словах, а как split brain решается в условиях двух нод?

Для начала определим что такое split-brain. Каждая реплика может быть как connected так и disconnected по отношению к другой. Если реплика самопроизвольно переходит в StandAlone. Значит что она отказывается принимать состояние и синхронизироваться с другой. Это классический split-brain.

Решение split-brain для двух реплик производится точно так же, как и в случае с несколькими репликами.

Для начала определим с какой реплики мы хотим синхронизироваться. Для этого смотрим в

drbdadm status <res>

Если нужная нам реплика находится в состоянии StandAlone или Outdated/Inconsistent её нужно сначала перевести в UpToDate, для этого заходим на ноду с этой репликой и выполняем:

drbdadm primary --force <res>
drbdadm secondary <res>

А для того чтобы заставить остальные реплики забыть о своём состоянии и синхронизировать данные с UpToDate-реплик, логинимся на ноду с ними и выполняем:

drbdadm disconnect <res>
drbdadm connect <res> --discard-my-data

Стоит признать что в последних версиях LINSTOR включена по умолчанию функция auto-tiebreaker, которая при создании ресурса в двух репликах автоматически добавляет третью diskless-реплику, которая является своего рода арбитром для поддержания кворума. Таким образом решать split-brain в наши дни приходится всё реже.

Это вы рассказываете, как отрезать гангренозные конечности.

Мой вопрос был, как вы живёте со split brain. Ответ: отрезая всё, что испортится. Лично мне, и по опыту работы в drbd, и по опыту работы с более устойчивыми решениями, дико представлять себе СХД, которая может принять операцию записи, будучи в неконсистентом состоянии. В тот момент, когда вы отрезаете split brain, вы нарушаете гарантии целостности у базы данных, которая на этой конструкции лежит. База данных думала, что она обновила журнал, но на самом деле ей не повезло, и её ответ ушёл на ноду, которая потом обнаружила себя в disconnected состоянии и ей пришлось сделать discard-my-data. Вместе с журналом от базы данных. После чего база данных из вершины консистентности превращается в обычную овсянку. Липкая, бесформенная, и точно не являющаяся базой данных.

Сама идея DRBD "давайте сделаем две равноправные копии" наткнулась на простой факт: для двух копий единственный метод сделать partitioning tolerance - это умирать при отваливании соседней головы. Достойный метод, кстати (т.к. данные в двух копиях), но жадность сгубила - давайте "два мастера" делать. Получается, что партиционирование в полный рост и единственный выход из него - нарушение консистентности (`--discard-someones-data`).

Появление третьей ноды радикально решает проблему, но... На трёх нодах уже становится интересным поднять (условный) ceph и не мучать бабушку.

TL;DR; Негодная технология. Закапывайте.

Это вы рассказываете, как отрезать гангренозные конечности.

Но ведь вопрос был как решить, а не как предотвратить split brain в условиях двух нод. В целом наличие кворума решает поставленную задачу.


давайте "два мастера" делать.

Мультимастер в DRBD существует всего-лишь для одной простой цели — лайфмиграция, использование опции allow-two-primaries для чего-то ещё на постоянной основе, крайне нерекомендуется даже самим LINBIT.


То есть включать allow-two-primaries и поднимать какой-нибудь OCFS поверх DRBD на двух нодах, как в большинстве статей на хабре — это ужасный антипатерн и так делать никогда не надо :)


Появление третьей ноды радикально решает проблему, но… На трёх нодах уже становится интересным поднять (условный) ceph и не мучать бабушку.

Вы немного застряли в прошлом, когда было принято делать одно большое DRBD-устройство и его нарезать на части, а так же холить и лелеять его.


С девятой версии DRBD поменял курс на "по отдельному DRBD-устройству на виртуалку", стал поддердживать diskless-реплики, появился оркестратор и в целом мазать его по большому кластеру стало намного проще и удобнее.

Я рад, что они задумались о кворуме, но сам факт существования состояния в СХД, когда есть две активные копии... Даже в контексте миграции. Вот у нас VISA'вская база переезжала. Там постоянно транзакции. Очень важные транзакции. Сделали вы master-master на время переезда, и вот виза записала транзакцию №665 на устройство 1, в момент переключения активной головы, записала транзакцию №666 на устройство 2, и тут миграция обломилась по независящим от нас причинам.

Что мы будем дискардить? Транзакцию № 666 или транзакцию № 665? Сама постановка вопроса делает базу данных не базой данных.

Тут ещё интереснее вопрос возникает. Если у нас бездисковый арбитр, то если у нас была авария (питание отключали), то при старте кто победит? Грубо говоря, чья реплика правильная?

В таких условиях, условный ceph, например, просто не будет работать. Осталась одна копия данных? Всё, остановка в обслуживании. Данные важнее, чем сиюминутность их доступности. Для надёжного хранения нам надо кворум мониторов (хотя бы два монитора из трёх, которые договорились о том, кто главный) и хотя бы два хранилища, способные подчиняться мониторам, чтобы в случае разногласий при старте с третьим хранилищем, разобраться, чьи данные правильнее.

сделали вы master-master на время переезда

Так всё же опционально, опция allow-two-primaries по умолчанию не включена и не позволяет делать больше одного мастера в DRBD-кластере.


Тут ещё интереснее вопрос возникает. Если у нас бездисковый арбитр, то если у нас была авария (питание отключали), то при старте кто победит? Грубо говоря, чья реплика правильная?

Наличие кворума определяет разрешено ресурсу переходить в Primary или нет. Так же при потере кворума, блокируется весь I/O. Таким образом у нас просто не получится завести устройство, до того момента пока не будет восстановлен кворум.


Правильность устройств определяется с помощью DRBD-битмапа. Каждое устройство "помнит" о состоянии каждого. То есть при старте победит тот, кто находится в кворуме и тот кто был в UpToDate на момент инцидента с отключением питания.


Так же полагаю, но не могу быть точно уверен, что так как в нашем случае diskless-реплика потеряет своё состояние, она не сможет проголосовать в кворуме за того или иного кандидата. То есть кластер будет ждать обе diskful-реплики.

Честно говоря DRBD так себе инструмент. Я пытался поднять кластер на этой штуке несколько раз, но тщетно. Перерыл кучу доков в том числе от Рэдхата. Друг посоветовал ceph, а точнее коробочное решение PetaSAN. Все поставилось без проблем. Ноды, вольюмы и прочее добавляются на лету. Дальнейшего смысла в использовании DRBD не вижу.

Считаю что выбирать технологию нужно исходя от задачи. Да, Ceph простой, но медленный, а также за него приходится много платить вычислительными ресурсами.

У DRBD есть несколько киллер-фич:

  • Во первых это сравнительно дешёвая производительность. В отличие от аналогов он реально быстрый и почти не потребляет ресурсов.

  • Дата-локалити. То есть мы можем запускать рабочую нагрузку там же где и хранятся данные, получая ещё большую производительность.

  • А отказ отдельных устройств или всей плоскости управления не приводит к отказу всей системы.

  • Дополнительные фичи вроде шифрования, снапшотов и дедупликации добавляются с использованием уже существующих технологий: LUKS, ZFS/LVM, VDO

К сожалению за всё это приходится платить удобством использования (обновлять модуль ядра на большом количестве нод - это то ещё удовольствие) и невозможностью создать блочное устройство размером большим чем пул хранения на одной ноде.

Кому нужна дешёвая производительность, просто набивают сервер NVME'шками без рейда, и имеют самую большую производительность, какую могут.

Дальше у людей, обычно, запрос на надёжность.

Надёжность я воспринял by default, мы же сетевой сторадж выбираем :)

Задачи разные бывают, но я бы не хотел быть админом в компании, где критические данные лежат на drbd. В принципе, при правильном подходе к disaster recovery выжить можно, главное, прослоечку с чексуммами держать.

может у вас есть рабочий пошаговый мануал по развертыванию простейшего DRBD кластера?

Есть, даже парочка, правда они уже несколько устарели.
На самом деле я бы советовал обратиться к официальной документации LINSTOR. Там всё более-менее понятно расписано.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации