юни 152007
 

Днес изслушах една лекция за “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 тук)

 Posted by at 14:52

Abject-Oriented Programming

 Общи  Коментарите са изключени за Abject-Oriented Programming
юни 152007
 

Попадна ми тази брилянтна статия относно Abject-Oriented Programming. Много добро описание на най-разпространената техника за програмиране по цял свят. Пълна с мъдри дефиниции като:

Polymorphism
… Code is polymorphic when it gives different outputs for different kinds of inputs…

или

A virtual class or function is code that the application will eventually need, but it isn’t written yet.

или

A fragile base class is a class or module that has been in the application for a long time, and any change to it will break the rest of the application.

Има и мъдри съвети относно добрите практики на писане на код:

Overloading is when a module or chunk of code does more than one thing. An example would be a subroutine to get a customer’s name, email address, and state sales tax rate. Using overloaded functions cuts down on method dispatching, which is one of the reasons other programming styles can result in slow code.

и

… overloading is when data is passed to a function or module in globals because too many function parameters overload the compiler … when variables are kept in globals there’s no need for garbage collection.

Брилянтно! Просто задължително настолно четиво за всички минали, настоящи и бъдещи програмисти

 Posted by at 13:54