Можете ли вы использовать веса, чтобы избежать разделения мозгов в кворуме?

Мы рассматриваем возможность развертывания кластерной базы данных и хотели бы масштабировать количество узлов вверх и вниз в системе с некоторыми системами, имеющими один, два или три узла. Percona Clustered DB имеет механизм взвешенного кворума. Я думаю, что можно выбрать веса, чтобы нарушить симметрию, чтобы всегда избегать разделения мозга. Однако я не могу найти литературу, в которой бы говорилось, что это так, что заставляет меня сомневаться в себе.

Вот идея. Назначьте каждому узлу один из следующих весов: 127 + 0, 127 + 1, 127 + 2, 127 + 4, 127 + 8, 127 + 16, .. и так далее.

Учитывая два непересекающихся подмножества, a и b, узлов в кластере, два требования, которые, по моему мнению, должны быть соблюдены:

1) если подмножество a имеет больше узлов, чем другое b, то сумма его весов, w(a), всегда будет быть больше суммы весов другого набора.

|a| > |b| --> w(a) > w(b)

2) Нарушение симметрии. При любых двух подмножествах веса не будут равны. Это требование позволяет избежать разделения мозга с четным числом узлов.

|a| = |b| --> w(a) != w(b)

Есть ли проблемы с этим подходом? Если так, то кто они?

Подробное описание проблемы...

  1. В идеале у нас было бы одно и то же решение для нескольких конфигураций узлов, чтобы сэкономить на тестировании.
  2. Веса узлов не могут быть изменены динамически (могут... но это не совсем безопасно... ограничение кластера Percona и, возможно, алгоритма кворума?).
  3. Percona пересчитает общий вес узла после полного отключения узла.

person demented hedgehog    schedule 03.02.2018    source источник
comment
Вы ограничены в количестве подмножеств размером числа, используемого для подмножества. По сути, вы назначаете один бит для каждого узла. Является ли это ограничением, зависит от вашей конфигурации.   -  person Gordon Linoff    schedule 04.02.2018
comment
Да... Но на практике количество узлов в кластере не будет огромным. По мере роста размера кластеров также растут накладные расходы кластеров, взаимодействующих друг с другом для поддержания синхронизации. Таким образом, размер кластера ограничен другими способами (в зависимости от того, как все настроено). Я также мог бы выбрать больший начальный вес, чем 127. Так что ограничение по размеру в данном случае не проблема   -  person demented hedgehog    schedule 04.02.2018


Ответы (1)


Похоже, это будет действовать так, как вы описываете, но кажется излишне сложным для того, что вы описываете. Насколько я могу судить из веб-поиска (https://www.percona.com/blog/2015/06/12/percona-xtradb-cluster-quorum-availability-cluster/), когда система работает нормально, она знает, что сумма весов на каждом узле. После потери соединения подключенное подмножество разрешает запись только в том случае, если оно по-прежнему имеет БОЛЕЕ 50% весов. В потенциальной ситуации разделения мозга обе стороны не могут поверить, что они обе имеют БОЛЕЕ 50 % весов, потому что тогда сумма весов каждой половины должна была бы составлять в сумме больше, чем сумма всех весов, что невозможно.

Вы действительно избегаете чтения обеих сторон, только если разделение происходит ровно посередине, но это не то, что обычно подразумевается под разделением мозга. https://en.wikipedia.org/wiki/Split-brain_(computing)< /а>. Если ваша цель состоит в том, чтобы максимизировать вероятность того, что какой-то остаток все еще сможет записывать после сбоя, или максимизировать доступность записи для клиентов после сбоя, я предполагаю, что вам лучше всего начать рассматривать возможные сбои. учитывая топологию вашей физической сети, и учтите это в своих расчетах. Кажется маловероятным, что каждый из возможных шаблонов недоступности одинаково вероятен.

Если у вас есть нечетное количество узлов и вы присвоите каждому из них вес, равный единице, никакое разделение не оставит равный вес на каждой стороне, потому что общий вес должен быть нечетным. Если у вас четное количество узлов, присвойте одному узлу вес, равный двум, а остальным — по одному. Тогда у вас снова есть общий вес, который является нечетным, поэтому никакое разделение не может дать каждой половине одинаковый вес. Конечно, если вы потеряете один узел при разделении, то оставшаяся часть может быть разделена поровну, например. А | Б, С, Д| E, F, G, но я не уверен, хотите ли вы, чтобы E, F, G продолжались в этой ситуации, потому что, если разделение было только двусторонним, как A, B, C, D | E, F, G вы, вероятно, захотите, чтобы A, B, C, D продолжились, а E, F, G не могут сказать, является ли разделение A | Б, В, Г | E,F,G или A,B,C,D | Э, Ф, Г

person mcdowella    schedule 04.02.2018
comment
Вы, безусловно, правы. Однако то, над чем мы работаем, развертывается в нескольких местах с разными топологиями (вероятно, на 1, 2 или 3 узлах, но возможно и на 5 или 7 узлах). Я пытаюсь использовать одну и ту же архитектуру с одним решением для всех топологий, чтобы уменьшить количество конфигураций, которые мы должны тестировать по отдельности. Например. мы можем начать с 1 узла, добавить еще 2, а затем вернуться к 2 узлам или сбою в сети и дойти до трех партий по одному. - person demented hedgehog; 04.02.2018
comment
Percona пересчитывает веса кворума, когда узел выполняет чистое отключение. Это означает, что случай 3 к 2 произойдет во время горячей замены. Также изменение веса узла во время выполнения немного небезопасно и действительно должно выполняться с перезапуском. Поэтому в идеале я хочу выбрать веса при запуске. Поэтому я ищу универсальное решение, которое будет работать для трех, двух или одного узла (например, кластер из трех узлов превращается в ведущий-ведомый). - person demented hedgehog; 04.02.2018
comment
Я отредактировал вопрос, чтобы добавить эти ограничения к проблеме. - person demented hedgehog; 04.02.2018
comment
Я пытаюсь сказать, что ваши равные веса для решения с нечетным числом узлов будут иметь разделенный мозг после полного отключения одного узла. - person demented hedgehog; 04.02.2018
comment
В случае, когда вы хотите сохранить фиксированные веса для каждого узла, но иметь возможность начать с разных подмножеств узлов, ваше решение действительно имеет преимущество перед более простым. - person mcdowella; 04.02.2018