Я читаю о плоте, но я немного запутался, когда дело доходит до консенсуса после сетевого раздела.
Итак, рассмотрим кластер из 2 узлов, 1 лидера, 1 ведомого.
Перед разбиением там, где X сообщений были записаны, успешно реплицированы, а затем представьте, что проблема с сетью вызвала разбиение, поэтому есть 2 раздела, A (бывший лидер) и B (бывший ведомый), которые теперь оба являются ведущими (получающие записи). ):
before partition | Messages |x| Partition | Messages
Leader | 0 1 2 3 4 |x| Partition A | 5 6 7 8 9
Follower | 0 1 2 3 4 |x| Partition B | 5' 6' 7' 8' 9'
После события раздела мы разобрались, что происходит?
а) Выбираем 1 нового лидера и считаем его журнал? (отбрасывание сообщений нового подписчика? например:
0 1 2 3 4 5 6 7 8 9 (total of 10 messages, 5 dropped)
или даже:
0 1 2 3 4 5' 6' 7' 8' 9' (total of 10 messages, 5 dropped)
(в зависимости от того, какой узел должен быть лидером)
б) Мы выбираем нового лидера и находим способ согласовать все сообщения?
0 1 2 3 4 5 5' 6 6' 7 7' 8 8' 9 9' (total of 15 messages, 0 dropped)
если b, есть ли какой-то конкретный способ сделать это? или это зависит от реализации клиента? (например, временная метка сообщения...)
Журнал лидеров считается «журналом», когда лидер избран и успешно записал свою первоначальную запись в журнале на срок. Однако в вашем случае исходная посылка неверна. В кластере из 2 узлов узлу нужно 2 голоса, чтобы стать лидером, а не 1. Таким образом, при наличии сетевого раздела ни один узел не будет лидером.