sql >> Databáze >  >> RDS >> MariaDB

Pokročilé převzetí služeb při selhání pomocí háčků Post/Pre Script

Význam převzetí služeb při selhání

Failover je jedním z nejdůležitějších postupů pro správu databází. Je to užitečné nejen při správě velkých databází v produkci, ale také v případě, že chcete mít jistotu, že váš systém bude vždy dostupný, kdykoli k němu přistoupíte – zejména na úrovni aplikace.

Než může dojít k převzetí služeb při selhání, musí instance vaší databáze splňovat určité požadavky. Tyto požadavky jsou ve skutečnosti velmi důležité pro vysokou dostupnost. Jedním z požadavků, které musí instance vaší databáze splňovat, je redundance. Redundance umožňuje pokračovat v převzetí služeb při selhání, ve kterém je redundance nastavena tak, aby měl kandidáta na převzetí služeb při selhání, kterým může být replika (sekundární) uzel nebo z fondu replik fungujících jako pohotovostní nebo horké pohotovostní uzly. Kandidát je vybírán buď ručně, nebo automaticky na základě nejpokročilejšího nebo nejaktuálnějšího uzlu. Obvykle byste chtěli repliku v pohotovostním režimu, protože může zachránit vaši databázi před stahováním indexů z disku, protože pohotovostní režim často zaplňuje indexy do fondu vyrovnávací paměti databáze.

Failover je termín používaný k popisu, že došlo k procesu obnovy. Před procesem obnovy k tomu dochází, když primární (nebo hlavní) databázový uzel selže po havárii, po přírodních katastrofách, po selhání hardwaru nebo může utrpět rozdělení sítě; toto jsou nejčastější případy, kdy může dojít k převzetí služeb při selhání. Proces obnovy obvykle pokračuje automaticky a poté hledá nejžádanější a nejaktuálnější sekundární (repliku), jak bylo uvedeno výše.

Pokročilé převzetí služeb při selhání

I když je proces obnovy během převzetí služeb při selhání automatický, existují určité případy, kdy není nutné proces automatizovat a řízení musí převzít ruční proces. Složitost je často hlavním hlediskem spojeným s technologiemi zahrnujícími celý zásobník vaší databáze – automatické převzetí služeb při selhání lze také kombinovat s manuálním převzetím služeb při selhání.

Ve většině každodenních úvah o správě databází není většina obav souvisejících s automatickým převzetím služeb při selhání skutečně triviální. Často přijde vhod implementovat a nastavit automatické převzetí služeb při selhání v případě problémů. Ačkoli to zní slibně, protože to pokrývá složitosti, přichází pokročilé mechanismy převzetí služeb při selhání, které zahrnují události „před“ a „po“ události, které jsou v softwaru nebo technologii pro přepnutí při selhání spojeny jako háčky.

Tyto před a po události přicházejí buď s kontrolami, nebo s určitými akcemi, které je třeba provést, než bude moci definitivně pokračovat s převzetím služeb při selhání, a poté, co je provedeno převzetí služeb při selhání, s některými vyčištěními, aby bylo zajištěno, že převzetí služeb při selhání je konečně úspěšné jeden. Naštěstí jsou k dispozici nástroje, které umožňují nejen automatické převzetí služeb při selhání, ale mají i schopnost aplikovat háčky před a po skriptu.

V tomto blogu použijeme automatické převzetí služeb při selhání ClusterControl (CC) a vysvětlíme, jak používat háky před a po skriptu a na který cluster se vztahují.

ClusterControl Replication Failover

Mechanismus převzetí služeb při selhání ClusterControl je efektivně použitelný přes asynchronní replikaci, která je použitelná pro varianty MySQL (MySQL/Percona Server/MariaDB). Je použitelný i pro clustery PostgreSQL/TimescaleDB – ClusterControl podporuje streamingovou replikaci. Klastry MongoDB a Galera mají svůj vlastní mechanismus pro automatické převzetí služeb při selhání zabudovaný do vlastní databázové technologie. Přečtěte si více o tom, jak ClusterControl provádí automatickou obnovu databáze a převzetí služeb při selhání.

Převzetí selhání ClusterControl nefunguje, pokud není povoleno obnovení uzlu a clusteru (automatické obnovení). To znamená, že tato tlačítka by měla být zelená.

V dokumentaci je uvedeno, že tyto možnosti konfigurace lze také použít k povolení / zakázat následující:

enable_cluster_autorecovery=

  • Pokud není definováno, CMON má výchozí hodnotu 0 (false) a NEPROVEDE automatické obnovení, pokud zjistí selhání clusteru. Podporovaná hodnota je 1 (obnovení klastru je povoleno) nebo 0 (obnovení klastru je zakázáno).

enable_node_autorecovery=

  • Pokud není definováno, CMON má výchozí hodnotu 0 (false) a NEPROVEDE automatické obnovení, pokud zjistí selhání uzlu. Podporovaná hodnota je 1 (obnovení uzlů je povoleno) nebo 0 (obnovení uzlů je zakázáno).

Tyto volby, pokud jsou nastaveny v /etc/cmon.d/cmon_.cnf, vyžadují restart cmon. Proto musíte restartovat pomocí následujícího příkazu:

$ systemctl restart cmon

Pro tento blog se zaměřujeme hlavně na to, jak používat háky před/po skriptu, což je v podstatě velká výhoda pro pokročilé převzetí služeb při selhání replikace.

Podpora před/po skriptu replikace při selhání klastru

Jak již bylo zmíněno, tento mechanismus podporují varianty MySQL, které používají asynchronní (včetně semisynchronní) replikaci a streamingovou replikaci pro PostgreSQL/TimescaleDB. ClusterControl má následující možnosti konfigurace, které lze použít pro háky před a po skriptu. V zásadě lze tyto možnosti konfigurace nastavit prostřednictvím jejich konfiguračních souborů nebo je lze nastavit prostřednictvím webového uživatelského rozhraní (tím se budeme zabývat později).

Naše dokumentace uvádí, že toto jsou následující možnosti konfigurace, které mohou změnit mechanismus převzetí služeb při selhání pomocí háčků před/po skriptu:

replication_pre_failover_script=

  • Cesta ke skriptu převzetí služeb při selhání v uzlu ClusterControl. Tento skript se spustí před převzetím služeb při selhání, ale poté, co byl zvolen kandidát a je možné pokračovat v procesu převzetí služeb při selhání. Pokud skript vrátí nenulovou hodnotu, vynutí přerušení převzetí služeb při selhání. Pokud je skript definován, ale nenalezen, převzetí služeb při selhání bude přerušeno.

  • Skriptu jsou dodány 4 argumenty:

    • arg1=”Všechny servery v replikaci”

    • arg2=”Neúspěšný mistr”

    • arg3=”Vybraný kandidát”

    • arg4=”Otroci starého pána”

  • Argumenty budou předány takto:pre_failover_script.sh "arg1" "arg2" "arg3" "arg4 ". Skript musí být přístupný na ovladači a musí být spustitelný.

  • Příklad:replication_pre_failover_script=/usr/local/bin/pre_failover_script.sh

replication_post_failover_script=

  • Cesta ke skriptu převzetí služeb při selhání v uzlu ClusterControl. Tento skript se spustí po převzetí služeb při selhání. Pokud skript vrátí nenulovou hodnotu, do protokolu úlohy se zapíše varování. Skript musí být přístupný a spustitelný na ovladači.

  • Skriptu jsou dodány 4 argumenty:

    • arg1=”Všechny servery v replikaci”

    • arg2=”Neúspěšný mistr”

    • arg3=”Vybraný kandidát”

    • arg4=”Otroci starého pána”

  • Argumenty budou předány takto:post_failover_script.sh "arg1" "arg2" "arg3" "arg4 ". Skript musí být přístupný na ovladači a musí být spustitelný.

  • Příklad:replication_post_failover_script=/usr/local/bin/post_failover_script.sh

replication_post_unsuccessful_failover_script=

  • Cesta ke skriptu v uzlu ClusterControl. Tento skript se spustí po neúspěšném pokusu o převzetí služeb při selhání. Pokud skript vrátí nenulovou hodnotu, do protokolu úlohy se zapíše Varování. Skript musí být přístupný na ovladači a musí být spustitelný.

  • Skriptu jsou dodány 4 argumenty:

    • arg1=”Všechny servery v replikaci”

    • arg2=”Neúspěšný mistr”

    • arg3=”Vybraný kandidát”

    • arg4=”Otroci starého pána”

  • Argumenty budou předány takto:post_fail_failover_script.sh "arg1" "arg2" "arg3" "arg4 ". Skript musí být přístupný na ovladači a musí být spustitelný.

  • Příklad:replikace_post_unsuccessful_failover_script=post_fail_failover_script.sh

Technicky platí, že jakmile v konfiguračním souboru /etc/cmon.d/cmon_.cnf nastavíte následující možnosti konfigurace, bude nutné restartovat cmon, tj. spustit následující příkaz:

$ systemctl restart cmon

Případně můžete také nastavit možnosti konfigurace tak, že přejdete do → Nastavení → Konfigurace za běhu. Viz snímek obrazovky níže:

Tento přístup by stále vyžadoval restartování služby cmon, než se projeví změny provedené pro tyto možnosti konfigurace pro háky před/po skriptu.

Příklad háčků před/po skriptu

V ideálním případě jsou háčky před/po skriptu vyhrazeny, když potřebujete pokročilé převzetí služeb při selhání, pro které ClusterControl nezvládne složitost nastavení vaší databáze. Pokud například provozujete různá datová centra se zpřísněným zabezpečením a chcete zjistit, zda upozornění na nedostupnost sítě není falešným pozitivním poplachem. Musí zkontrolovat, zda se primární a slave mohou navzájem dosáhnout a naopak, a také se mohou dostat z databázových uzlů jdoucích do hostitele ClusterControl.

Pojďme to udělat v našem příkladu a ukázat, jak z toho můžete mít prospěch.

Podrobnosti o serveru a skripty

V tomto příkladu používám klastr replikace MariaDB pouze s primární a replikou. Spravuje ClusterControl pro správu převzetí služeb při selhání.

ClusterControl =192.168.40.110

primární (debnode5) =192.168.30.50

replika (debnode9) =192.168.30.90

V primárním uzlu vytvořte skript, jak je uvedeno níže,

[email protected]:~# cat /opt/pre_failover.sh
#!/bin/bash

date -u +%s | ssh -i /home/vagrant/.ssh/id_rsa [email protected] -T "cat >> /tmp/debnode5.tmp"

Ujistěte se, že soubor /opt/pre_failover.sh je spustitelný, tj.

$ chmod +x /opt/pre_failover.sh

Potom použijte tento skript k zapojení přes cron. V tomto příkladu jsem vytvořil soubor /etc/cron.d/ccfailover s následujícím obsahem:

[email protected]:~# cat /etc/cron.d/ccfailover
#!/bin/bash

* * * * * vagrant /opt/pre_failover.sh

Ve své replice použijte následující kroky, které jsme provedli pro primární, kromě změny názvu hostitele. Podívejte se na to, co mám níže ve své replice:

[email protected]:~# tail -n+1 /etc/cron.d/ccfailover /opt/pre_failover.sh
==> /etc/cron.d/ccfailover <==
#!/bin/bash
* * * * * vagrant /opt/pre_failover.sh

==> /opt/pre_failover.sh <==
#!/bin/bash

date -u +%s | ssh -i /home/vagrant/.ssh/id_rsa [email protected] -T "cat > /tmp/debnode9.tmp"

a ujistěte se, že skript vyvolaný v našem cronu je spustitelný,

[email protected]:~# ls -alth /opt/pre_failover.sh
-rwxr-xr-x 1 root root 104 Jun 14 05:09 /opt/pre_failover.sh

Před/post skripty ClusterControl

V této ukázce je moje cluster_id 3. Jak je uvedeno dříve v naší dokumentaci, vyžaduje to, aby tyto skripty byly umístěny v našem hostiteli řadiče CC. Takže v mém /etc/cmon.d/cmon_3.cnf mám následující:

[[email protected] cmon.d]# tail -n3 /etc/cmon.d/cmon_3.cnf
replication_pre_failover_script = /etc/cmon.d/failover/replication_failover_pre_clus3.sh
replication_post_failover_script = /etc/cmon.d/failover/replication_failover_post_clus3.sh
replication_post_unsuccessful_failover_script = /etc/cmon.d/failover/replication_unsuccessful_failover_post_clus3.sh

Následující skript „před“ převzetí služeb při selhání určuje, zda byly oba uzly schopny dosáhnout hostitele řadiče CC. Viz následující:

[[email protected] cmon.d]# tail -n+1 /etc/cmon.d/failover/replication_failover_pre_clus3.sh
#!/bin/bash

arg1=$1
debnode5_tstamp=$(tail /tmp/debnode5.tmp)
debnode9_tstamp=$(tail /tmp/debnode9.tmp)
cc_tstamp=$(date -u +%s)
diff_debnode5=$(expr $cc_tstamp - $debnode5_tstamp)
diff_debnode9=$(expr $cc_tstamp - $debnode5_tstamp)

if [[ "$diff_debnode5" -le  60 && "$diff_debnode9" -le 60 ]]; then
   echo "failover cannot proceed. It's just a false alarm. Checkout the firewall in your CC host";
   exit 1;
elif [[ "$diff_debnode5" -gt 60 || "$diff_debnode9" -gt 60 ]]; then
        echo "Either both nodes ($arg1) or one of them  were not able to connect the CC host. One can be unreachable. Failover proceed!";
    exit 0;
else
   echo "false alarm. Failover discarded!"
   exit 1;
fi
Whereas my post scripts just simply echoes and redirects the output to a file, just for the test.
[[email protected] failover]# tail -n+1 replication_*_post*3.sh
==> replication_failover_post_clus3.sh <==
#!/bin/bash
echo "post failover script on cluster 3 with args: [email protected]" > /tmp/post_failover_script_cid3.txt
==> replication_unsuccessful_failover_post_clus3.sh <==
#!/bin/bash
echo "post unsuccessful  failover script on cluster 3 with args: [email protected]" > /tmp/post_unsuccessful_failover_script_cid3.txt

Ukázka převzetí služeb při selhání

Nyní se pokusíme simulovat výpadek sítě na primárním uzlu a uvidíme, jak bude reagovat. V mém primárním uzlu vyřazuji síťové rozhraní, které se používá ke komunikaci s replikou a řadičem CC.

[email protected]:~# ip link set enp0s8 down

Během prvního pokusu o převzetí služeb při selhání se CC podařilo spustit můj předběžný skript, který se nachází na adrese /etc/cmon.d/failover/replication_failover_pre_clus3.sh. Níže se podívejte, jak to funguje:

Je zřejmé, že se to nezdaří, protože časové razítko, které bylo zaznamenáno, ještě není delší než minuta nebo to bylo jen před několika sekundami, kdy se primární jednotka stále dokázala spojit s CC řadičem. Je zřejmé, že to není dokonalý přístup, když se zabýváte skutečným scénářem. ClusterControl však dokázal vyvolat a spustit skript perfektně podle očekávání. A co když to skutečně dosáhne více než minuty (tj.> 60 sekund)?

Při našem druhém pokusu o převzetí služeb při selhání, protože časové razítko dosáhlo více než 60 sekund, se to považuje za skutečně pozitivní, a to znamená, že musíme provést převzetí služeb při selhání, jak bylo zamýšleno. CC to dokázalo dokonale vykonat a dokonce provést post skript tak, jak bylo zamýšleno. To lze vidět v protokolu úloh. Viz snímek obrazovky níže:

Ověřením, zda byl spuštěn můj skript příspěvku, bylo možné vytvořit protokol soubor v adresáři CC /tmp podle očekávání,

[[email protected] tmp]# cat /tmp/post_failover_script_cid3.txt

skript po převzetí služeb při selhání na clusteru 3 s argumenty:192.168.30.50 192.168.30.90  192.168.30.50 192.168.30.90 192.168.30.90

Moje topologie byla změněna a převzetí služeb při selhání bylo úspěšné!

Závěr

Pro jakékoli komplikované nastavení databáze, které můžete mít, když je vyžadováno pokročilé převzetí služeb při selhání, mohou být velmi užitečné skripty pre/post, aby bylo možné věci dosáhnout. Protože ClusterControl tyto funkce podporuje, ukázali jsme, jak je výkonný a užitečný. I přes svá omezení vždy existují způsoby, jak učinit věci dosažitelnými a užitečnými, zejména v produkčním prostředí.


  1. Vložení aktuálního data a času do databáze SQLite

  2. postgres sloupec X neexistuje

  3. Zabránění poklesu tabulky u cílového schématu v Oracle Streams

  4. MySQL a NoSQL:Pomozte mi vybrat ten správný