0006 — Hostování kopírování je koordinováno atomátem pronájmu DB
Kontext
Běžící profil kopírování musí být hostován přesně jedním uzlem — dva hostitelé na stejném profilu znamená každý zdrojový obchod je zrcadlen dvakrát (ztráta skutečných peněz). Uzly přicházejí a odcházejí (škálování, selhání, valcování aktualizace) a nechceme, aby běžela samostatná služba koordinátora.
Rozhodnutí
Každý CopyEngineSupervisor si nárokovává profily s atomárním pronájmem DB na tabulce CopyProfiles:
- Tvrzení — atomární
ExecuteUpdate(neboFOR UPDATE SKIP LOCKEDpři limitování na uzel) bere profily, které jsou nepřiřazeny nebo jejichž pronájem vypršel. Atomicita znamená dva závodící nadřízení nikdy nemohou oba tvrdit stejný řádek. - Obnovení — živý uzel obnovuje svůj pronájem každý cyklus, takže si udržuje tvrzení.
- Nový nárok — pronájem havarovaného uzlu vyprší a přeživší si profil vezme v následujícím cyklu (samo-léčení). Při řádném vypnutí uzel uvolní své pronájmy okamžitě, takže převzetí je rychlé.
- Hlídka — hostitel, jehož úloha skončila, zatímco profil je stále náš, se restartuje.
- Sladění je náhodně rozptýleno, aby se zabránilo kápání
UPDATEů v měřítku.
Důsledky
- Žádný samostatný koordinátor k nasazení nebo udržování v pořádku — Postgres je jediný zdroj pravdy.
- Dvojitému kopírování se brání atomicitou na úrovni řádku, nikoli aplikací uzamykáním.
- Latence převzetí je ohraničena TTL pronájmu (mínus cesta s řádným uvolněním).
- Toto je peněžní cesta; je chráněna deterministickou stresovou suitu (DST) — nikdy neoslabujte DST scénář, aby prošel.