drbd split brain on Centos6

Я поймал 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, если у вас по другому (или их больше одного), то меняйте на свое.

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed