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

MariaDB MaxScale Load Balancing on Docker:Deployment:Part One

MariaDB MaxScale je pokročilý zásuvný databázový proxy server pro databázové servery MariaDB. Nachází se mezi klientskými aplikacemi a databázovými servery, směruje klientské dotazy a odpovědi serveru. MaxScale také monitoruje servery, takže rychle zaznamená jakékoli změny stavu serveru nebo topologie replikace. Díky tomu je MaxScale přirozenou volbou pro řízení převzetí služeb při selhání a podobných funkcí.

V této dvoudílné sérii blogů poskytneme kompletní návod, jak spustit MariaDB MaxScale na Dockeru. Tato část pokrývá nasazení jako samostatný kontejner Docker a clustering MaxScale prostřednictvím Docker Swarm pro vysokou dostupnost.

MariaDB MaxScale na Dockeru

V Docker Hub je k dispozici řada obrazů MariaDB Docker. V tomto blogu budeme používat oficiální obrázek spravovaný a publikovaný MariaDB s názvem „mariadb/maxscale“ (tag:nejnovější). Obrázek má velikost cca 71 MB. V době psaní tohoto článku je obraz předinstalován s MaxScale 2.3.4 jako součást jeho požadovaných balíčků.

Obecně jsou ke spuštění MaxScale s tímto obrazem v prostředí kontejneru vyžadovány následující kroky:

  1. Spuštěná replikace MariaDB (master-slave nebo master-master) / Galera Cluster nebo NDB Cluster
  2. Vytvořte a udělte databázi uživatele určeného pro monitorování MaxScale
  3. Připravte konfigurační soubor MaxScale
  4. Namapujte konfigurační soubor do kontejneru nebo načtěte do Kubernetes ConfigMap nebo Docker Swarm Configs
  5. Spusťte kontejner/pod/službu/replikaset

Všimněte si, že MaxScale je produktem MariaDB, což znamená, že je přizpůsoben serveru MariaDB. Většina funkcí je stále kompatibilní s MySQL kromě některých částí, jako je například zpracování GTID, konfigurace Galera Cluster a interní datové soubory. Verze, kterou budeme používat, je 2.3.4, která je vydána pod licencí Business Source License (BSL). Umožňuje, aby byl veškerý kód otevřený a použití na TŘECH serverech je zdarma. Když využití překročí tři backendové servery, musí společnost, která jej používá, zaplatit za komerční předplatné. Po určité době (2 roky v případě MaxScale) se vydání přesune pod GPL a veškeré použití je zdarma.

Aby bylo jasno, protože se jedná o testovací prostředí, můžeme mít více než 2 uzly. Jak je uvedeno na stránce MariaDB BSL FAQ:

O:Mohu používat produkty MariaDB licencované pod BSL v testovacím a vývojovém prostředí?
A:Ano, v neprodukčním testovacím a vývojovém prostředí můžete používat produkty licencované pod BSL, aniž byste potřebovali předplatné od MariaDB

V tomto návodu již máme tříuzlovou replikaci MariaDB nasazenou pomocí ClusterControl. Následující diagram znázorňuje nastavení, které se chystáme nasadit:

Architektura našeho systému se skládá z:

  • mariadb1 – 192.168.0.91 (master)
  • mariadb2 – 192.168.0.92 (otrok)
  • mariadb3 – 192.168.0.93 (otrok)
  • docker1 – 192.168.0.200 (hostitel Docker pro kontejnery – maxscale, aplikace)

Příprava uživatele MaxScale

Nejprve vytvořte uživatele databáze MySQL pro MaxScale a povolte všem hostitelům v síti 192.168.0.0/24:

MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';

Poté udělte požadovaná oprávnění. Pokud chcete pouze monitorovat backendové servery pomocí vyvažování zátěže, stačí následující granty:

MariaDB> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'192.168.0.%';
MariaDB> GRANT SELECT ON `mysql`.* TO 'maxscale'@'192.168.0.%';

MaxScale však umí mnohem více než jen směrování dotazů. Má schopnost provádět přepnutí při selhání a přepnutí, například povýšení slave na nového mastera. To vyžaduje oprávnění SUPER a REPLICATION CLIENT. Chcete-li použít tuto funkci, přidělte uživateli místo toho VŠECHNA PRIVILEGIE:

mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';

To je pro uživatelskou část vše.

Příprava konfiguračního souboru MaxScale

Obrázek vyžaduje, aby byl funkční konfigurační soubor namapován do kontejneru před jeho spuštěním. Minimální konfigurační soubor poskytnutý v kontejneru nám nepomůže vytvořit reverzní proxy, kterou chceme. Proto musí být konfigurační soubor připraven předem.

Následující seznam nám může pomoci při shromažďování požadovaných základních informací pro vytvoření našeho konfiguračního souboru:

  • Typ clusteru – MaxScale podporuje replikaci MariaDB (master-slave, master-master), Galera Cluster, Amazon Aurora, MariaDB ColumnStore a NDB Cluster (aka MySQL Cluster).
  • Backend IP adresa a/nebo název hostitele – dostupná IP adresa nebo název hostitele pro všechny backendové servery.
  • Směrovací algoritmus – MaxScale podporuje dva typy směrování dotazů – dělení na čtení a zápis a vyvažování zátěže v koloběhu.
  • Port pro naslouchání pomocí MaxScale – Ve výchozím nastavení používá MaxScale port 4006 pro připojení typu round-robin a 4008 pro rozdělená připojení pro čtení a zápis. Pokud chcete, můžete použít UNIX socket.

V aktuálním adresáři vytvořte textový soubor s názvem maxscale.cnf, abychom jej mohli namapovat do kontejneru při spuštění. Do souboru vložte následující řádky:

########################
## Server list
########################

[mariadb1]
type            = server
address         = 192.168.0.91
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

[mariadb2]
type            = server
address         = 192.168.0.92
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

[mariadb3]
type            = server
address         = 192.168.0.93
port            = 3306
protocol        = MariaDBBackend
serv_weight     = 1

#########################
## MaxScale configuration
#########################

[maxscale]
threads                 = auto
log_augmentation        = 1
ms_timestamp            = 1
syslog                  = 1

#########################
# Monitor for the servers
#########################

[monitor]
type                    = monitor
module                  = mariadbmon
servers                 = mariadb1,mariadb2,mariadb3
user                    = maxscale
password                = my_s3cret
auto_failover           = true
auto_rejoin             = true
enforce_read_only_slaves = 1

#########################
## Service definitions for read/write splitting and read-only services.
#########################

[rw-service]
type            = service
router          = readwritesplit
servers         = mariadb1,mariadb2,mariadb3
user            = maxscale
password        = my_s3cret
max_slave_connections           = 100%
max_sescmd_history              = 1500
causal_reads                    = true
causal_reads_timeout            = 10
transaction_replay              = true
transaction_replay_max_size     = 1Mi
delayed_retry                   = true
master_reconnection             = true
master_failure_mode             = fail_on_write
max_slave_replication_lag       = 3

[rr-service]
type            = service
router          = readconnroute
servers         = mariadb1,mariadb2,mariadb3
router_options  = slave
user            = maxscale
password        = my_s3cret

##########################
## Listener definitions for the service
## Listeners represent the ports the service will listen on.
##########################

[rw-listener]
type            = listener
service         = rw-service
protocol        = MariaDBClient
port            = 4008

[ro-listener]
type            = listener
service         = rr-service
protocol        = MariaDBClient
port            = 4006

Trochu vysvětlení pro každou sekci:

  • Seznam serverů – Backendové servery. Definujte každý server MariaDB tohoto klastru v jeho vlastní stanze. Jméno stanzy se použije, když zadáme definici služby níže. Typ komponenty musí být „server“.
  • Konfigurace MaxScale – Zde definujte všechny konfigurace související s MaxScale.
  • Modul Monitor – Jak by měl MaxScale monitorovat backendové servery. Typ součásti musí být „monitor“ následovaný jedním z monitorovacích modulů. Seznam podporovaných monitorů naleznete v části Monitory MaxScale 2.3.
  • Služba – Kam směrovat dotaz. Typ součásti musí být "servisní". Seznam podporovaných směrovačů naleznete v části Směrovače MaxScale 2.3.
  • Posluchač – Jak by měl MaxScale naslouchat příchozím připojením. Může to být soubor portu nebo soketu. Typ komponenty musí být "posluchač". Posluchači jsou běžně vázáni na služby.

V zásadě bychom tedy chtěli, aby MaxScale naslouchal na dvou portech, 4006 a 4008. Port 4006 je speciálně pro připojení typu round-robin, vhodný pro pracovní zátěže pouze pro čtení pro naši replikaci MariaDB, zatímco port 4008 je speciálně pro kritické úlohy čtení a zápisu. Chceme také použít MaxScale k provedení akce s naší replikací v případě selhání, přepnutí nebo opětovného připojení slave, proto používáme modul monitoru pro tzv. "mariadbmon".

Spuštění kontejneru

Nyní jsme připraveni spustit náš samostatný kontejner MaxScale. Namapujte konfigurační soubor pomocí -v a ujistěte se, že publikujete oba porty posluchače 4006 a 4008. Volitelně můžete povolit rozhraní MaxScale REST API na portu 8989:

$ docker run -d \
--name maxscale \
--restart always \
-p 4006:4006 \
-p 4008:4008 \
-p 8989:8989 \
-v $PWD/maxscale.cnf:/etc/maxscale.cnf \
mariadb/maxscale

Ověřte pomocí:

$ docker logs -f maxscale
...
2019-06-14 07:15:41.060   notice : (main): Started REST API on [127.0.0.1]:8989
2019-06-14 07:15:41.060   notice : (main): MaxScale started with 8 worker threads, each with a stack size of 8388608 bytes.

Ujistěte se, že při prohlížení výše uvedených protokolů nevidíte žádnou chybu. Ověřte, zda procesy docker-proxy naslouchají na publikovaných portech - 4006, 4008 a 8989:

$ netstat -tulpn | grep docker-proxy
tcp6       0      0 :::8989                 :::*                    LISTEN      4064/docker-proxy
tcp6       0      0 :::4006                 :::*                    LISTEN      4092/docker-proxy
tcp6       0      0 :::4008                 :::*                    LISTEN      4078/docker-proxy

V tomto okamžiku je naše MaxScale spuštěna a je schopna zpracovávat dotazy.

MaxCtrl

MaxCtrl je administrační klient příkazového řádku pro MaxScale, který ke komunikaci používá MaxScale REST API. Má být náhradním softwarem pro staršího klienta příkazového řádku MaxAdmin.

Chcete-li vstoupit do konzoly MaxCtrl, proveďte příkaz "maxctrl" uvnitř kontejneru:

$ docker exec -it maxscale maxctrl
 maxctrl: list servers
┌──────────┬──────────────┬──────┬─────────────┬─────────────────┬─────────────┐
│ Server   │ Address      │ Port │ Connections │ State           │ GTID        │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb1 │ 192.168.0.91 │ 3306 │ 0           │ Master, Running │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb2 │ 192.168.0.92 │ 3306 │ 0           │ Slave, Running  │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb3 │ 192.168.0.93 │ 3306 │ 0           │ Slave, Running  │ 0-5001-1012 │
└──────────┴──────────────┴──────┴─────────────┴─────────────────┴─────────────┘

Chcete-li ověřit, zda je vše v pořádku, jednoduše spusťte následující příkazy:

maxctrl: list servers
maxctrl: list services
maxctrl: list filters
maxctrl: list sessions

Chcete-li získat další informace o každé komponentě, použijte místo toho předponu příkazu "show", například:

maxctrl: show servers
┌──────────────────┬──────────────────────────────────────────┐
│ Server           │ mariadb3                                 │
├──────────────────┼──────────────────────────────────────────┤
│ Address          │ 192.168.0.93                             │
├──────────────────┼──────────────────────────────────────────┤
│ Port             │ 3306                                     │
├──────────────────┼──────────────────────────────────────────┤
│ State            │ Slave, Running                           │
├──────────────────┼──────────────────────────────────────────┤
│ Last Event       │ new_slave                                │
├──────────────────┼──────────────────────────────────────────┤
│ Triggered At     │ Mon, 17 Jun 2019 08:57:59 GMT            │
├──────────────────┼──────────────────────────────────────────┤
│ Services         │ rw-service                               │
│                  │ rr-service                               │
├──────────────────┼──────────────────────────────────────────┤
│ Monitors         │ monitor                                  │
├──────────────────┼──────────────────────────────────────────┤
│ Master ID        │ 5001                                     │
├──────────────────┼──────────────────────────────────────────┤
│ Node ID          │ 5003                                     │
├──────────────────┼──────────────────────────────────────────┤
│ Slave Server IDs │                                          │
├──────────────────┼──────────────────────────────────────────┤
│ Statistics       │ {                                        │
│                  │     "connections": 0,                    │
│                  │     "total_connections": 0,              │
│                  │     "persistent_connections": 0,         │
│                  │     "active_operations": 0,              │
│                  │     "routed_packets": 0,                 │
│                  │     "adaptive_avg_select_time": "0ns"    │
│                  │ }                                        │
├──────────────────┼──────────────────────────────────────────┤
│ Parameters       │ {                                        │
│                  │     "address": "192.168.0.93",           │
│                  │     "protocol": "MariaDBBackend",        │
│                  │     "port": 3306,                        │
│                  │     "extra_port": 0,                     │
│                  │     "authenticator": null,               │
│                  │     "monitoruser": null,                 │
│                  │     "monitorpw": null,                   │
│                  │     "persistpoolmax": 0,                 │
│                  │     "persistmaxtime": 0,                 │
│                  │     "proxy_protocol": false,             │
│                  │     "ssl": "false",                      │
│                  │     "ssl_cert": null,                    │
│                  │     "ssl_key": null,                     │
│                  │     "ssl_ca_cert": null,                 │
│                  │     "ssl_version": "MAX",                │
│                  │     "ssl_cert_verify_depth": 9,          │
│                  │     "ssl_verify_peer_certificate": true, │
│                  │     "disk_space_threshold": null,        │
│                  │     "type": "server",                    │
│                  │     "serv_weight": "1"                   │
│                  │ }                                        │
└──────────────────┴──────────────────────────────────────────┘

Připojování k databázi

Uživatel databáze aplikace musí mít uděleno hostitele MaxScale, protože z pohledu serveru MariaDB vidí pouze hostitele MaxScale. Zvažte následující příklad bez MaxScale na obrázku:

  • Název databáze:myapp
  • Uživatel:myapp_user
  • Hostitel:192.168.0.133 (aplikační server)

Chcete-li uživateli umožnit přístup k databázi na serveru MariaDB, musíte spustit následující příkaz:

MariaDB> CREATE USER 'myapp_user'@'192.168.0.133' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.133';

S MaxScale na obrázku je třeba místo toho spustit následující příkaz (nahraďte IP adresu aplikačního serveru IP adresou MaxScale, 192.168.0.200):

MariaDB> CREATE USER 'myapp_user'@'192.168.0.200' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.200';

Z aplikace existují dva porty, které můžete použít pro připojení k databázi:

  • 4006 – Round-robin posluchač, vhodný pro pracovní zátěže pouze pro čtení.
  • 4008 – Rozdělený posluchač pro čtení a zápis, vhodný pro zápis.

Pokud má vaše aplikace povoleno zadat pouze jeden port MySQL (např. Wordpress, Joomla atd.), vyberte místo toho port RW 4008. Toto je nejbezpečnější připojení ke koncovému bodu bez ohledu na typ clusteru. Pokud však vaše aplikace zvládá připojení k více portům MySQL, můžete načtené hodnoty odeslat do cyklického naslouchání. Tento posluchač má menší režii a je mnohem rychlejší ve srovnání s posluchačem rozděleným na čtení a zápis.

Pro naše nastavení replikace MariaDB se připojte k jednomu z těchto koncových bodů jako kombinace hostitele databáze/portu:

  • 192.168.0.200 port 4008 – MaxScale – pouze pro čtení/zápis nebo zápis
  • 192.168.0.200 port 4006 – MaxScale – vyvážený pouze pro čtení
  • 192.168.0.91 port 3306 – server MariaDB (hlavní) – čtení/zápis
  • 192.168.0.92 port 3306 – MariaDB Server (slave) – pouze pro čtení
  • 192.168.0.93 port 3306 – MariaDB Server (slave) – pouze pro čtení

Poznámka pro typ clusteru s více mastery, jako je Galera Cluster a NDB Cluster, lze port 4006 použít jako vyvážená připojení pro více zápisů. S MaxScale máte při připojování k databázi na výběr z mnoha možností, přičemž každá z nich poskytuje vlastní sadu výhod.

MaxScale Clustering s Docker Swarm

S Docker Swarm můžeme vytvořit skupinu instancí MaxScale prostřednictvím služby Swarm s více než jednou replikou společně s Swarm Configs. Nejprve importujte konfigurační soubor do Swarm:

$ cat maxscale.conf | docker config create maxscale_config -

Ověřte pomocí:

$ docker config inspect --pretty maxscale_config

Poté povolte uživateli databáze MaxScale připojení z libovolného hostitele Swarm v síti:

MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';

Při spouštění služby Swarm pro MaxScale můžeme vytvořit mapování více kontejnerů (nazývaných repliky) do stejného konfiguračního souboru, jak je uvedeno níže:

$ docker service create \
--name maxscale-cluster  \
--replicas=3 \
--publish published=4008,target=4008 \
--publish published=4006,target=4006 \
--config source=maxscale_config,target=/etc/maxscale.cnf \
mariadb/maxscale

Výše uvedené vytvoří tři kontejnery MaxScale rozmístěné mezi uzly Swarm. Ověřte pomocí:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                     PORTS
yj6u2xcdj7lo        maxscale-cluster    replicated          3/3                 mariadb/maxscale:latest   *:4006->4006/tcp, *:4008->4008/tcp

Pokud aplikace běží v síti Swarm, můžete jednoduše použít název služby "maxscale-cluster" jako hostitele databáze pro vaše aplikace. Externě se můžete připojit k jakémukoli hostiteli Docker na publikovaných portech a síť Swarm bude směrovat a vyvažovat připojení ke správným kontejnerům způsobem kruhového provozu. V tomto bodě lze naši architekturu ilustrovat následovně:

Ve druhé části se podíváme na pokročilé případy použití MaxScale na Dockeru, jako je řízení služeb, správa konfigurace, zpracování dotazů, zabezpečení a odsouhlasení clusteru.


  1. Ustanovení WHERE vs ON při použití JOIN

  2. Jak vybrat poskytovatele Oracle pro aplikaci .Net?

  3. Jak nasadit Percona XtraDB Cluster 8 pro vysokou dostupnost

  4. Podmínka WHERE v MySQL s 16 různými příklady dotazů