Dotazy se musí ukládat do mezipaměti v každé silně zatížené databázi, prostě neexistuje způsob, jak by databáze zvládla veškerý provoz s přiměřeným výkonem. Existují různé mechanismy, ve kterých lze implementovat mezipaměť dotazů. Počínaje mezipamětí dotazů MySQL, která dříve fungovala dobře pro většinou jen pro čtení, s nízkou souběžností a která nemá místo ve velkých souběžných úlohách (do té míry, do jaké ji Oracle odstranil v MySQL 8.0), až po externí úložiště klíč–hodnota jako Redis, memcached nebo CouchBase.
Hlavním problémem používání externího vyhrazeného úložiště dat (protože bychom nikomu nedoporučovali používat mezipaměť dotazů MySQL) je to, že jde o další úložiště dat, které je třeba spravovat. Je to další prostředí, které je třeba udržovat, řešit problémy se škálováním, ladit chyby a tak dále.
Proč tedy nezabít dvě mouchy jednou ranou využitím svého proxy? Zde se předpokládá, že ve svém produkčním prostředí používáte proxy, protože pomáhá vyvažovat zatížení dotazů napříč instancemi a maskuje základní topologii databáze tím, že poskytuje aplikacím jednoduchý koncový bod. ProxySQL je skvělý nástroj pro tuto práci, protože může navíc fungovat jako cachovací vrstva. V tomto příspěvku na blogu vám ukážeme, jak ukládat dotazy do mezipaměti v ProxySQL pomocí ClusterControl.
Jak mezipaměť dotazů funguje v ProxySQL?
Nejprve trochu pozadí. ProxySQL spravuje provoz prostřednictvím pravidel dotazů a může provádět ukládání dotazů do mezipaměti pomocí stejného mechanismu. ProxySQL ukládá dotazy uložené v mezipaměti do struktury paměti. Data uložená v mezipaměti jsou odstraněna pomocí nastavení doby životnosti (TTL). TTL lze definovat pro každé pravidlo dotazu individuálně, takže je na uživateli, aby se rozhodl, zda mají být pravidla dotazu definována pro každý jednotlivý dotaz, s odlišným TTL, nebo zda potřebuje vytvořit několik pravidel, která budou odpovídat většině dotazů. provoz.
Existují dvě nastavení konfigurace, která definují, jak by se měla mezipaměť dotazů používat. Nejprve mysql-query_cache_size_MB který definuje měkký limit velikosti mezipaměti dotazů. Není to pevný limit, takže ProxySQL může používat o něco více paměti, ale stačí to k udržení využití paměti pod kontrolou. Druhé nastavení, které můžete vyladit, je mysql-query_cache_stores_empty_result . Definuje, zda je prázdná sada výsledků uložena do mezipaměti nebo ne.
Mezipaměť dotazů ProxySQL je navržena jako úložiště klíč-hodnota. Hodnota je výsledná sada dotazu a klíč se skládá ze zřetězených hodnot jako:uživatel, schéma a text dotazu. Poté se z tohoto řetězce vytvoří hash a tento hash se použije jako klíč.
Nastavení ProxySQL jako Query Cache pomocí ClusterControl
Jako počáteční nastavení máme replikační cluster s jedním hlavním a jedním podřízeným zařízením. Máme také jeden ProxySQL.
V žádném případě se nejedná o nastavení na produkční úrovni, protože bychom museli implementovat nějaký druh vysoké dostupnosti pro vrstvu proxy (například nasazením více než jedné instance ProxySQL a poté udržováním naživu nad nimi pro plovoucí virtuální IP), ale pro naše testy to bude více než dost.
Nejprve ověříme konfiguraci ProxySQL, abychom se ujistili, že nastavení mezipaměti dotazů je takové, jaké chceme.
256 MB mezipaměti dotazů by mělo být v pořádku a my chceme ukládat do mezipaměti také prázdné sady výsledků – někdy dotaz, který nevrací žádná data, musí ještě udělat hodně práce, abychom si ověřili, že není co vrátit.
Dalším krokem je vytvoření pravidel dotazů, která budou odpovídat dotazům, které chcete ukládat do mezipaměti. V ClusterControl to lze provést dvěma způsoby.
Ruční přidání pravidel dotazu
První způsob vyžaduje trochu více ručních akcí. Pomocí ClusterControl můžete snadno vytvořit libovolné pravidlo dotazu, včetně pravidel dotazu, která ukládají do mezipaměti. Nejprve se podívejme na seznam pravidel:
V tomto okamžiku máme sadu pravidel dotazu pro provedení rozdělení čtení/zápisu. První pravidlo má ID 100. Naše nové pravidlo dotazu musí být zpracováno před tímto, takže použijeme nižší ID pravidla. Pojďme vytvořit pravidlo dotazu, které bude provádět ukládání dotazů do mezipaměti podobné tomuto:
SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c
Existují tři způsoby přiřazování dotazu:Digest, Match Digest a Match Pattern. Pojďme si o nich zde něco říct. Nejprve Match Digest. Můžeme zde nastavit regulární výraz, který bude odpovídat zobecněnému řetězci dotazu, který představuje nějaký typ dotazu. Například pro náš dotaz:
SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c
Obecná reprezentace bude:
SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN ? AND ? ORDER BY c
Jak vidíte, odebral argumenty do klauzule WHERE, takže všechny dotazy tohoto typu jsou reprezentovány jako jeden řetězec. Tato možnost se docela dobře používá, protože odpovídá celému typu dotazu, a co je ještě důležitější, jsou odstraněny všechny mezery. Díky tomu je psaní regulárního výrazu mnohem snazší, protože nemusíte počítat s podivnými zalomeními řádků, mezerami na začátku nebo na konci řetězce a tak dále.
Digest je v podstatě hash, který ProxySQL vypočítává přes formulář Match Digest.
Nakonec se Match Pattern shoduje s úplným textem dotazu, jak byl odeslán klientem. V našem případě bude mít dotaz tvar:
SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c
Budeme používat Match Digest, protože chceme, aby všechny tyto dotazy byly pokryty pravidlem dotazu. Pokud bychom chtěli ukládat do mezipaměti pouze tento konkrétní dotaz, dobrou možností by bylo použít Match Pattern.
Regulární výraz, který používáme, je:
SELECT DISTINCT c FROM sbtest[0-9]+ WHERE id BETWEEN \? AND \? ORDER BY c
Porovnáváme doslova přesný zobecněný řetězec dotazu s jednou výjimkou – víme, že tento dotaz zasáhl více tabulek, a proto jsme přidali regulární výraz, který bude odpovídat všem.
Jakmile to uděláme, uvidíme, zda je pravidlo dotazu platné nebo ne.
Vidíme, že počet požadavků na server se zvyšuje, což znamená, že se používá naše pravidlo dotazu. Dále se podíváme na jiný způsob, jak vytvořit pravidlo dotazu.
Použití ClusterControl k vytvoření pravidel dotazu
ProxySQL má užitečnou funkcionalitu shromažďování statistik dotazů, které směrovala. Můžete sledovat data, jako je doba provádění, kolikrát byl daný dotaz proveden a tak dále. Tato data jsou také přítomna v ClusterControl:
A co je ještě lepší, pokud ukážete na daný typ dotazu, můžete vytvořit pravidlo dotazu související s ním. Tento konkrétní typ dotazu můžete také snadno uložit do mezipaměti.
Jak vidíte, některá data jako Rule IP, Cache TTL nebo Schema Name jsou již vyplněna. ClusterControl také vyplní data na základě toho, jaký mechanismus porovnávání jste se rozhodli použít. Můžeme snadno použít buď hash pro daný typ dotazu, nebo můžeme použít Match Digest nebo Match Pattern, pokud bychom chtěli regulární výraz doladit (například udělat to samé jako dříve a rozšířit regulární výraz tak, aby odpovídal všem tabulky ve schématu sbtest).
To je vše, co potřebujete ke snadnému vytváření pravidel mezipaměti dotazů v ProxySQL. Stáhněte si ClusterControl a vyzkoušejte to ještě dnes.