Я поймал split brain в drbd на Centos6 в результате того, что у меня он настроен между двумя виртуалками на разных гипервизорах, и вот в результате штатных работ по модернизации сети GW был недоступен некоторое время, а соответственно связь между виртуалками была временно нарушена.
Обе виртуалки решили что «вторая выключилась», heartbeat отработал штатно и обе виртуалки смонтировали себе drbd-раздел и обе повесили на себя «общий» адрес.
Когда GW вернулся виртуалки друг друга увидели, поняли что были неправы и обе сделали «ой», то есть в /proc/drbd получилось примерно так:
[root@host1 ~]# cat /proc/drbd version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- ns:21603172 nr:0 dw:1202172 dr:20972858 al:67 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:198540
И так:
[root@host2 ~]# cat /proc/drbd version: 8.3.16 (api:88/proto:86-97) GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown B r----- ns:0 nr:0 dw:76 dr:821 al:4 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:64
(хотя конечно могло и получиться «ro:Secondary/Unknown» на обоих виртуалках).
Как это чинить:
1) В моем случае первый хост (потому что он Primary) назначаем «более правильным» и host2 будем синкать с ним, если бы обе машины стали бы «ro:Secondary/Unknown», то «более правильную» машину выбирает админ исходя из своих соображений (целостность фс, время изменения файлов, куда шли запросы от клиентов и тп).
2) На обоих машинах на всякий случай делаем «drbdadm disconnect r0» (на всякий случай принудительно выключаем связь между инстасами)
3) На «более правильной» делаем «drbdadm invalidate-remote r0»
4) На «менее правильной» делаем «drbdadm invalidate r0»
5) Проверяем /proc/drbd на обоих машинах. «cs» должен быть «StandAlone», а
ro должен быть «Primary/Unknown» (на «более правильное») и «Secondary/Unknown» (на «менее правильной»).
6) Если в предыдущем пункте «что-то не так» или «вы не уверенны», то лучше убедиться что role Primary (поле ro в файле /proc/drbd) именно у той машины, данные который вы хотите оставить, а машина с role Secondary будет синхронизирована с Primary, при этом все локальные изменения будут утеряны.
7) Говорим «drbdadm connect r0» на обоих машинах и командой «cat /proc/drbd» убеждаемся что drbd начал синхронизироваться («ro» поменялся на «Primary/Secondary» или «Secondary/Primary» в зависимости от машины, на которой выполняется команда, появилась шкала синхронизации похожая на аналогичную в mdadm, cs и ds выставились в какое-то вменяемое значение).
Подробнее о значении полей файла /proc/drbd читаем тут
Ps у меня drbd-ресурс называется r0, если у вас по другому (или их больше одного), то меняйте на свое.