Portál AbcLinuxu, 30. dubna 2025 10:21
Zatím jen sen, těch výpadků jsme ale už zažili tolik, že Stickfish plánuje nasadit Abíčko do clusteru. No a já trochu chladím jejich nadšení soupisem možných problémů. Rád bych slyšel vaše názory a postřehy, jak byste je řešili vy.
Poslední výpadek byl způsoben hard diskem, který se poroučel do věčných lovišť. RAID nám sice zachránil kůži (už poněkolikráté), ale nemůžeme se spoléhat na jeden server. V nárazech nemusí stíhat požadavkům, ale hlavně jeho výpadek znamená desítky minut či hodiny nefunkčnosti Abíčka. A to si prostě nemůžeme dovolit. Takže se koupila další našlapaná mašina, na kterou se přesunou všechny servery (webové) a z původního stroje vznikne druhý uzel pidi clusteru. Na obou strojích by měly být nainstalovány stejné webové aplikace i databáze, která se bude mezi nimi replikovat. Požadavky bude na uzly rozhazovat buď specializovaná mašina nebo nějaká síťová komponenta (nejspíše round robin algoritmus, nic sofistikovaného).
Život mě naučil jisté skepse a tak dopředu hledám rizika, ať se na ně mohu připravit. Za prvé databáze. Abíčko teď jede na MySQL 4.1, která clusterování neumí. Přechod na pětku snad nebude tak bolet, jako na 4.1 (důsledkem jsou duplicitní loginy, které tento víkend budeme fixovat). Jaké máte zkušenosti? Je možné rozjet MySQL na dvou počítačích tak, aby databáze byly v obou okamžicích rovnocenné a vzájemně zastupitelné? Aby měly stejné data a když jeden uzel spadne, druhý jede v pohodě dál a po obnovení spojení ten první uzel jen načetl změny? (Nechci mít dedikovaný databázový server, stejně bychom jej museli dát do clusteru.)
Dalším rizikem je souborový systém. Abíčko má spoustu souborů na disku, uživatelé nahrávají screenshoty či obrázky. Jak efektivně ale zajistit, ať oba uzly mají stejná data při požadavku na co nejmenší riziko zatuhnutí? Připojit disk ze třetího stroje (třeba NFS) nepovažuji za dobrý nápad, jeho výpadek by zasáhl oba uzly. Takže spíše nějakým skriptem neustále synchronizovat adresáře na obou strojích. Ale to bude asi dost náročné na výkon počítače.
Další problém vidím v Abíčku jako aplikaci. Abíčko je nesmírně optimalizovaná aplikace (kvůli jedné hloupé chybě - vypnutí JIT - jsem dělal divy), jenže všechny ty cache jsou stavěny na tom, že Abíčko běží na jediném stroji. Kdyby běželo na dvou strojích, rychle by byly cache nesynchronizovány a data by se mohly poškodit či přepsat, různě ztrácet atd. Například uzly A a B načtou softwarový záznam. Uzel A jej pak upraví, změní třeba licenci a uloží jej. Nicméně uzel B o tom nic neví a má v cache původní hodnotu, takže když má změnit třeba popisek, uloží do databáze řádek se starou licencí a novým popiskem. Což se ale nedozví uzel A a tak bude všem čtenářům ukazovat starý popisek a novou licenci, zatímco uzel B bude ukazovat starou licenci a nový popisek. Schíza, že?
Co teď? Jak toto vyřešit? Udělat komunikaci mezi cachemi, aby se vzájemně informovaly, když je třeba něco načíst z databáze? Nebo zahodit současnou cache a najít nějakou distribuovanou cache? Máte v této oblasti zkušenosti? Co byste doporučili?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.