Днес изслушах една лекция за “Oracle RAC Internals” на Барб Лъндхилд. Направи ми впечатление, че когато обяснява за изгонване на нод от клъстера (node eviction) спомена, че използват STONITH алгоритъм.
Ще започна от малко по-рано. Както, предполагам, всички читатели на моя блог знаят, RAC е технология на Oracle, при която много сървъри работят като един. За целта те имат едновременен и равноправен достъп до общ дисков масив, на който се помещава самата БД. За да не стават сакатлъци с данните, всички заявки за писане (че даже и за четене) на общия дисков масив са синхронизирани между нодовете. Тази синхронизация става през мрежовата връзка, която е изградена специално за това (private interconnect). През нея, освен всичко друго, постоянно летят и един съобщения между всички участници в къстера: „Жив ли си” – „Жива съм. А ти жив ли си?” – „И аз съм жив. А ти жив ли си?”…
Така… Когато се случи да отпадне мрежовата връзка към възел Х, той започва да не чува останалите (важи и обратното – останалите не чуват Х). Тогава освен „Жив ли си” започват да се губят и другите мрежови пакети, които служат за синхронизация на писането върху общия дисков масив: „Аз смятам да пиша сега блокчето с данни по номер ХХХХХХ” или „Трябва ми блокчето YYYYYY, някой променял ли го е (да ми го изпрати) или да го чета от диска?”. Когато се загубят тези съобщения за синхронизация, има реална опасност да се повреди базата – примерно ако 2 нода запишат различни версии на един блок. Това се нарича split-brain (шизофрения?).
За да се избегне split-brain ситуацията, когато прекъсне връзката между нодовете, веднага всичките се събират на специално направения за такива цели Voting disk (препоръчва се да не е само 1, а 3, за по-сигурно) и гласуват кой е жив и кой кого вижда. Формира се мнозинство от най-голямата група от нодове, които се виждат по между си (Барб Лъндхилд спомена, че ако са равни по брой участници групите, печели тази група, в която нодовете имат по-малки номерца). Тази група оцелява, другите биват изгонени (node eviction). Точно това „изгонване“ се случвало по STONITH алгоритъма.
И, в крайна сметка, какъв е този STONITH алгоритъм? Проверих в wikipedia…Оказа се, че STONITH не е име на някои умен професор, който го е измислил. Това е просто абревиатура от Shoot The Other Node In The Head, или Застреляй Другия Сървър В Главата (ЗДСВГ). Е нека някой ме убеди, че клъстернте решения се измислят само от скучновати вратовръзковци (има и едно доста вселяшко обяснение на STONITH тук)