GTID nebo Globální identifikátor transakce byl představen v MySQL 5.6.5. GTID je globálně jedinečné ID přidělované všem transakcím prováděným na hostitelském serveru MySQL s povoleným GTID. GTID jsou kombinací UUID serveru, kde byla konkrétní transakce potvrzena, a pořadového čísla této transakce na tomto konkrétním serveru. Díky tomu je GTID celosvětově jedinečné.
Replikace MySQL
Replikace založená na GTID je mnohem flexibilnější ve srovnání se starší replikací založenou na binlogu. V nastavení založeném na GTID nepotřebuje slave hlavní binlogový soubor a pozici ke spuštění replikace. Přečtěte si více o replikaci založené na GTID. V tomto příspěvku na blogu probereme některé běžné problémy s replikací MySQL způsobené při nasazení sady replik na bázi GTID.
Chybné transakce jsou transakce, které jsou aplikovány na jednoho nebo více podřízených zařízení, které není třeba replikovat na jiných uzlech. Může se jednat o občasné opravy aplikované na podřízeném zařízení nebo náhodné zápisy do podřízeného zařízení aplikací.
Problém s těmito chybnými transakcemi nastává, když je slave, který obsahuje chybnou transakci, povýšen na hlavní. V případě replikace založené na GTID by to způsobilo problém. Nový pán si nyní uvědomuje, že otroci neprovedli chybnou transakci. Může se stát jedna ze dvou věcí:
(1) Chybná transakce je stále přítomna v hlavním binlogu a odešle ji podřízeným zařízením, což může poškodit data nebo způsobit chybu.
(2) Transakce není přítomna v binlogu, a proto nelze odeslat podřízenému zařízení, což způsobí chybu replikace.
Prevence
Chybným transakcím lze aktivně zabránit pomocí následujících kroků. Pokud musíte použít opravu na slave zařízení, jedním ze způsobů, jak zmírnit chybné transakce, je dočasné vypnutí binárního protokolování na slave zařízení. Spuštění sql_bin_log =0 před provedením chybného dotazu by mělo stačit. Později můžete povolit binlog spuštěním sql_bin_log =1. Chcete-li zabránit jakékoli aplikaci zapisovat do slave zařízení, mělo by být na serveru povoleno pouze pro čtení, když je nakonfigurován jako slave.
Detekce
Detekce chybné transakce v sadě replik MySQL založené na GTID je snadná. MySQL ukládá všechna provedená GTID ve své tabulce Performance Schema/Information Schema podle toho, jakou verzi MySQL používáte. Když vezmete GTID provedené aktuálním otrokem a odečtete je od GTID provedených na aktuálním hlavním zařízení, získáte všechny chybné transakce na tomto konkrétním otroku. Nástroje jako mysqlfailover nebo mysqlrpladmin mohou také pomoci při odhalování chybných transakcí.
Řešení
Jakmile byla zjištěna chybná transakce, existují dva způsoby, jak opravit chyby replikace způsobené po převzetí služeb při selhání. Jedním ze způsobů je odstranit GTID chybné transakce z historie provedených podřízených GTID. Tímto způsobem, když se slave povýší na master, chybná transakce nebude replikována do všech uzlů. Dalším způsobem, jak zvládnout chybnou transakci, je říct všem ostatním otrokům, aby chybnou transakci vynechali. To by zahrnovalo vložení prázdné transakce se stejným GTID jako chybná transakce do všech ostatních uzlů v sadě replik. Všechny ostatní uzly si tak budou myslet, že již tuto transakci aplikovaly, a proto ji přeskočí. MySQL má k tomu určen nástroj s názvem Mysqlslavetrx. Pomocí této utility lze vkládat prázdné transakce s daným GTID. Přidání prázdných transakcí může mít i jiné využití, jak je popsáno zde.