STONITH – když se oba nody HA clusteru nedohodnout a musí se vzájemně sestřelit
STONITH je mechanismus k řešení sporů ohledně přístupu ke zdrojům/službám clusteru. V rámci clusteru se musí vždy jednotlivé uzly dohodnout kde která služba poběží – tzv. fencing. Pokud se uzly dohodnou, vše je v pořádku. Když se náhodou nedohodnou, přijde ke slovu STONITH – sestřelení protějšího uzlu, který danou službu zadržuje a nechce vydat.
Konkrétní případ:
STONITH je mechanismus k řešení sporů ohledně přístupu ke zdrojům/službám clusteru. V rámci clusteru se musí vždy jednotlivé uzly dohodnout kde která služba poběží – tzv. fencing. Pokud se uzly dohodnou, vše je v pořádku. Když se náhodou nedohodnou, přijde ke slovu STONITH – sestřelení protějšího uzlu, který danou službu zadržuje a nechce vydat.
Konkrétní případ:
Při konfiguraci NFS clusteru jsem nastavil všechny potřebné služby – spouštění DRDB, LVM, Filesystem, IP adresy pro NFS a NFS samotné. DRBD je v režimu primary/slave = služba může běžet pouze na jednom z uzlů clusteru. Při studeném startu clusteru vše naběhlo správně a fungovalo, ovšem při migraci služby mezi uzly clusteru vždy nastala situace, že stávající aktivní uzel nechtěl uvolnit souborový systém aby se odmountoval a proto nešlo přehodit DRBD na druhý uzel. Cluster to vyřešil jednoduše – několikrát zkusil zda umount projde a když zjistil, že ne tak odstřelil porouchaný uzel (ten který nechtěl uvolnit filesystem).
Cluster po odstřelení vadného uzlu mohl správně nahodit DRDB, LVM, přimountovat souborový systém, nahodit IP a nfsd a vše bylo v pořádku. Tedy dokud jsem nechtěl zase přemigrovat služby zpátky po naběhnutí odstřeleného uzlu – vše se opakovalo.
STONITH mechanismus v tomto případě “řešil” situaci rozbitého skriptu pro nfs. Závadu jsem vyřešil – opravil jsem rozbitý skript pro ovládání NFS. Skript pro ovládání NFS totiž při ukončení nechal běžet některé procesy a ty neuvolnily souborový systém. Na tom všem to selhávalo.
Má konfigurace STONITH je následující:
Servery a jejich management rozhraní přístupné po síti přes IPMI:
- server: node0.domain.tld, IPMI: 179.100.1.72
- server: node1.domain.tld, IPMI: 179.100.1.70
V management rozhraní každého serveru jsem vytvořil uživatele “stonith” s právy pro restart serveru.
Přes program crmadmin jsem v konfiguraci CRM vytvořil 2x stonith resource – vždy pro daný server. Pomocí pravidel (location) jsem každý resource umístil na protější uzel – tak aby služba pro restart barzini.klenot.eu běžela na uzlu tommasino a naopak.
primitive stonith-node1 stonith:external/ipmi \ params hostname="node1.domain.tld" ipaddr="179.100.1.70"\ userid="stonith" passwd="HESLO" interface="lan" primitive stonith-node0 stonith:external/ipmi \ params hostname="node0.domain.tld" ipaddr="179.100.1.72"\ userid="stonith" passwd="HESLO" interface="lan" location loc-stonith-node1 stonith-node1 \ rule $id="loc-stonith-node1-rule" -inf: #uname ne node0.domain.tld location loc-stonith-node0 stonith-node0 \ rule $id="loc-stonith-node0-rule" -inf: #uname ne node1.domain.tld
Postup úpravy konfigurace clusteru
Nejdříve si vypíšu dostupné stonith moduly:
[root@barzini ~]# crm ra list stonith apcmaster apcsmart baytech bladehpi cyclades external/drac5 external/hmchttp external/ibmrsa external/ibmrsa-telnet external/ipmi external/kdumpcheck external/rackpdu external/riloe external/sbd external/ssh external/vmware external/xen0 external/xen0-ha ibmhmc ipmilan meatware null nw_rpc100s rcd_serial rps10 ssh suicide wti_nps
Protože mám dostupné IPMI na serverech přes lokální síť, použiju external/ipmi modul. Možnosti konfigurace modulu zjistím následujícím příkazem:
[root@barzini ~]# crm ra meta external/ipmi stonith IPMI STONITH external device (stonith:external/ipmi) IPMI-based host reset Parameters (* denotes required, [] the default): hostname (string): Hostname The name of the host to be managed by this STONITH device ipaddr (string): IP Address The IP address of the STONITH device userid (string): Login The username used for logging in to the STONITH device passwd (string): Password The password used for logging in to the STONITH device interface (string): IPMI interface IPMI interface to use, such as "lan" or "lanplus" Operations' defaults (advisory minimum): start timeout=15 stop timeout=15 status timeout=15 monitor timeout=15 interval=15
Spustím tedy konfiguraci a napíši potřebné “příkazy” pro vytvoření stonith zařízení, výsledek mohu ověřovat příkazem “show”, který vypíše aktuální stav. Konfiguraci potvrdím příkazem “commit” a protože pracuji na živé konfiguraci běžícího clusteru, budou okamžitě nově vytvořená zařízení stonith spuštěna na správných uzlech clusteru:
[root@barzini ~]# crm configure crm(live)configure# primitive stonith... ... ... crm(live)configure# commit
Na závěr by bylo vhodné STONITH otestovat – pro základní test stačí na jednom z uzlů násilně zabít heartbeat pomocí “pkill -9 heartbeat”.