sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB MaxScale Load Balancing på Docker:Implementering:Part One

MariaDB MaxScale er en avanceret plug-in-databaseproxy til MariaDB-databaseservere. Den sidder mellem klientapplikationer og databaseservere og dirigerer klientforespørgsler og serversvar. MaxScale overvåger også serverne, så det vil hurtigt bemærke eventuelle ændringer i serverstatus eller replikeringstopologi. Dette gør MaxScale til et naturligt valg til styring af failover og lignende funktioner.

I denne todelte blogserie vil vi give en komplet gennemgang af, hvordan man kører MariaDB MaxScale på Docker. Denne del dækker implementeringen som en selvstændig Docker-container og MaxScale-klyngning via Docker Swarm for høj tilgængelighed.

MariaDB MaxScale på Docker

Der er en række MariaDB Docker-billeder tilgængelige i Docker Hub. I denne blog vil vi bruge det officielle billede, der vedligeholdes og udgives af MariaDB kaldet "mariadb/maxscale" (tag:seneste). Billedet er omkring 71MB i størrelse. I skrivende stund er billedet forudinstalleret med MaxScale 2.3.4 som en del af dets nødvendige pakker.

Generelt kræves følgende trin for at køre en MaxScale med dette billede i containermiljøet:

  1. En kørende MariaDB (master-slave eller master-master) replikering/Galera Cluster eller NDB Cluster
  2. Opret og tildel en databasebruger dedikeret til MaxScale-overvågning
  3. Forbered MaxScale-konfigurationsfilen
  4. Kortér konfigurationsfilen til container eller indlæs i Kubernetes ConfigMap eller Docker Swarm Configs
  5. Start containeren/pod/service/replikaset

Bemærk, at MaxScale er et produkt af MariaDB, hvilket betyder, at det er skræddersyet til MariaDB-serveren. De fleste af funktionerne er stadig kompatible med MySQL undtagen nogle dele som for eksempel GTID-håndtering, Galera Cluster-konfiguration og interne datafiler. Den version, vi skal bruge, er 2.3.4, som er udgivet under Business Source License (BSL). Det giver mulighed for at al koden er åben, og brugen under TRE servere er gratis. Når brugen går over tre backend-servere, skal den virksomhed, der bruger det, betale for et kommercielt abonnement. Efter en bestemt tidsperiode (2 år i tilfælde af MaxScale) flyttes udgivelsen til GPL, og al brug er gratis.

Bare for at være klar, da dette er et testmiljø, er vi okay at have mere end 2 noder. Som angivet på MariaDB BSL FAQ-siden:

Sp:Kan jeg bruge MariaDB-produkter, der er licenseret under BSL i test- og udviklingsmiljø?
Sv.:Ja, i et ikke-produktions-test- og udviklingsmiljø kan du bruge produkter, der er licenseret under BSL uden at skulle have et abonnement fra MariaDB

I denne gennemgang har vi allerede en tre-node MariaDB-replikering implementeret ved hjælp af ClusterControl. Følgende diagram illustrerer den opsætning, som vi vil implementere:

Vores systemarkitektur består af:

  • mariadb1 - 192.168.0.91 (master)
  • mariadb2 - 192.168.0.92 (slave)
  • mariadb3 - 192.168.0.93 (slave)
  • docker1 - 192.168.0.200 (Docker-vært til containere - maxscale, app)

Forberedelse af MaxScale-brugeren

For det første skal du oprette en MySQL-databasebruger til MaxScale og tillade alle værter i netværket 192.168.0.0/24:

MariaDB> OPRET BRUGER 'maxscale'@'192.168.0.%' IDENTIFICERET AF 'my_s3cret'; 

Giv derefter de nødvendige rettigheder. Hvis du blot ønsker at overvåge backend-serverne med belastningsbalancering, ville følgende bevillinger være tilstrækkeligt:

MariaDB> TILDEL VIS DATABASER PÅ *.* TIL 'maxscale'@'192.168.0.%';MariaDB> TILDEL VALG PÅ 'mysql'.* TIL 'maxscale'@'192.168.0.%'; 

MaxScale kan dog meget mere end at dirigere forespørgsler. Den har evnen til at udføre failover og switchover, for eksempel at promovere en slave til en ny master. Dette kræver SUPER- og REPLICATION CLIENT-rettigheder. Hvis du gerne vil bruge denne funktion, skal du i stedet tildele ALLE PRIVILEGIER til brugeren:

mysql> TILDEL ALLE PRIVILEGIER PÅ *.* TIL [email protected]'192.168.0.%'; 

Det er det for brugerens del.

Forberedelse af MaxScale-konfigurationsfil

Billedet kræver, at en fungerende konfigurationsfil tilknyttes containeren, før den startes. Den minimale konfigurationsfil, der findes i containeren, vil ikke hjælpe os med at bygge den omvendte proxy, som vi ønsker. Derfor skal konfigurationsfilen forberedes på forhånd.

Følgende liste kan hjælpe os med at indsamle nødvendige grundlæggende oplysninger for at konstruere vores konfigurationsfil:

  • Klyngetype - MaxScale understøtter MariaDB-replikering (master-slave, master-master), Galera Cluster, Amazon Aurora, MariaDB ColumnStore og NDB Cluster (alias MySQL Cluster).
  • Backend IP-adresse og/eller værtsnavn - IP-adresse eller værtsnavn, der kan nås for alle backend-servere.
  • Routingalgoritme - MaxScale understøtter to typer forespørgselsrouting - læse-skriveopdeling og belastningsbalancering i round-robin.
  • Port til at lytte med MaxScale - Som standard bruger MaxScale port 4006 til round-robin-forbindelser og 4008 til læse-skrive-delte forbindelser. Du kan bruge UNIX-socket, hvis du vil.

I den aktuelle mappe skal du oprette en tekstfil kaldet maxscale.cnf, så vi kan tilknytte den til containeren ved opstart. Indsæt følgende linjer i filen:

######################### Serverliste################ ########[mariadb1]type =serveradresse =192.168.0.91port =3306protocol =MariaDBBackendserv_weight =1[mariadb2]type =serveradresse =192.168.0.92port =3306protokol =MariaDBBackendserv_weight =MariaDBBackendserv_weight1 .0.93port =3306protocol =MariaDBBackendserv_weight =1########################## MaxScale-konfiguration############ ############[maxscale]tråde =autolog_augmentation =1ms_timestamp =1syslog =1######################## # Monitor for serverne########################[monitor]type =monitormodule =mariadbmonservers =mariadb1,mariadb2,mariadb3user =maxscalepassword =my_s3cretauto_failover =trueauto_rejoin=trueenforce_read_only_slaves =1########################## Tjenestedefinitioner for læse/skriveopdeling og skrivebeskyttede tjenester.###### ##################[rw-service]type =servicerouter =readwritesplitservers =mariadb1,mariadb2,mariadb3user =maxscalepassword =my_s3cretmax_slave_connections =100%max_sescmd_history =sandt_sescmd_history =sann_læst1afspilning0afspilningstid =150afspilningstid =150 truetransaction_replay_max_size =1Midelayed_retry =truemaster_reconnection =truemaster_failure_mode =fail_on_writemax_slave_replication_lag =3[rr-service]type =servicerouter =readconnrouteservers =mariadb1,mariadb2,mariadb32,mariadb3password3,mariadb3password3######maxsslave########s =max#########s =max. ########### Lytterdefinitioner for tjenesten## Lyttere repræsenterer portene Tjenesten vil lytte videre.#########################[rw-listener]type =listenerservice =rw-serviceprotocol =MariaDBClientport =4008[ro -listener]type =listenerservice =rr-serviceprotocol =MariaDBClientport =4006

Lidt forklaringer til hvert afsnit:

  • Serverliste - Backend-serverne. Definer hver MariaDB-server i denne klynge i sin egen strofe. Strofenavnet vil blive brugt, når vi specificerer tjenestedefinitionen længere nede. Komponenttypen skal være "server".
  • MaxScale-konfiguration - Definer alle MaxScale-relaterede konfigurationer der.
  • Monitormodul - Hvordan MaxScale skal overvåge backend-serverne. Komponenttypen skal være "monitor" efterfulgt af et af overvågningsmodulerne. For en liste over understøttede skærme henvises til MaxScale 2.3-skærme.
  • Tjeneste - Hvor skal forespørgslen dirigeres. Komponenttypen skal være "service". For en liste over understøttede routere henvises til MaxScale 2.3-routere.
  • Lytter - Hvordan MaxScale skal lytte til indgående forbindelser. Det kan være port eller socket fil. Komponenttypen skal være "lytter". Som regel er lyttere bundet til tjenester.

Så grundlæggende vil vi gerne have MaxScale til at lytte på to porte, 4006 og 4008. Port 4006 er specifikt til round-robin-forbindelse, velegnet til skrivebeskyttede arbejdsbelastninger til vores MariaDB-replikering, mens port 4008 er specifikt til kritiske læse- og skrivebelastninger. Vi ønsker også at bruge MaxScale til at udføre handlinger til vores replikering i tilfælde af en failover, switchover eller slave-rejoining, derfor bruger vi monitormodulet til kaldet "mariadbmon".

Kørsel af containeren

Vi er nu klar til at køre vores selvstændige MaxScale container. Kortlæg konfigurationsfilen med -v og sørg for at publicere begge lytteporte 4006 og 4008. Du kan eventuelt aktivere MaxScale REST API-grænseflade ved port 8989:

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

Bekræft med:

$ docker logs -f maxscale...2019-06-14 07:15:41.060 notice :(main):Startede REST API på [127.0.0.1]:89892019-06-14 07:15:41.060 meddelelse:(hoved):MaxScale startede med 8 arbejdertråde, hver med en stackstørrelse på 8388608 bytes. 

Sørg for, at du ikke ser nogen fejl, når du ser på ovenstående logfiler. Bekræft, om docker-proxy-processerne lytter på de offentliggjorte porte - 4006, 4008 og 8989:

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

På dette tidspunkt kører vores MaxScale og er i stand til at behandle forespørgsler.

MaxCtrl

MaxCtrl er en kommandolinjeadministrativ klient til MaxScale, som bruger MaxScale REST API til kommunikation. Det er beregnet til at være erstatningssoftwaren til den ældre MaxAdmin-kommandolinjeklient.

For at gå ind i MaxCtrl-konsollen skal du udføre kommandoen "maxctrl" inde i containeren:

$ docker exec -it maxscale maxctrl maxctrl:liste servere┌──────────┬─────────────────── ┬────essene Adresse │ Port │ Forbindelser │ Tilstanden │ Gtid │├────ept. Out ─ ovearat │ Master, Running │ 0-5001-1012 │├──────────┼───────────└────────────── ───Æte──eptarat┼─────essen ──out 0 │ Slave, Løb │ 0-5001-1012 │├──────────┼──────└──────────────── ─ Hver ─ 0 │ Slave, Løb │ 0-5001-1012 │└──────────┴────┴┴───┴──────────────── ──────────┵ 

For at kontrollere, om alt er i orden, skal du blot køre følgende kommandoer:

maxctrl:list serversmaxctrl:list servicesmaxctrl:list filtersmaxctrl:list sessioner 

For at få yderligere information om hver komponent, præfiks med kommandoen "show" i stedet, for eksempel:

maxctrl:vis servere┌──────────────────┬─────────────────── ─ ovearat ─ Hver ─ Hver ─ ovearat │ ─ Hver Sidste begivenhed │ new_slave │├───eptarat eptarat ─────────────────┤│ Udløst kl. │ Man, 17. juni 2019 08:57:59 GMT ───┼──── den eptesseomtaratarat rw-service ││ │ rr-service │├──────────────────┼─── ─ ovearat ──── den appearats───eptarat ─ ┼─essene ─ ovearat ─ Hver ──┼─────────────────────────────────────── │ │├───eptarats───eptarats───eptarat ──────────────┤│ Statistik │ { ││ │ "forbindelser":0, ││ ││"│"│ions, 0-forbindelser":0 active_operations":0, ││ │ "routed_packets":0, ││ │ "adaptive_avg_select_time":"0ns" ││ │} │├───eptarats───eptaratarats────essen ───────────────┤│ Parametre │ { ││ │ "adresse":"192.168.0.93", "││" ││-port", "││" :3306, ││ │ "extra_port":0, ││ │ "authenticator":null, ││ │ "monitoruser":null, ││ │ "monitorpw":"│pers, │pool":null, │pool:│ "persistmaxtime":0, ││ │ "proxy_protocol":false, ││ │ "ssl":"false", ││ │ "ssl_cert":null, ││ │ "ssl_key":│ "ssl_ca_cert":null, ││ │ "ssl_version":"MAX", ││ │ "ssl_cert_verify_depth":9, ││ │ "ssl_verify_peer_hold certificate":"│ressource certifikat":"│ │" ":"server", ││ │ "serv_weight":"1" ││ │ } │└─────────────────────────── ───────────────────────────────── 

Opretter forbindelse til databasen

Applikationens databasebruger skal have MaxScale-værten, da den fra MariaDB-serverens synsvinkel kun kan se MaxScale-værten. Overvej følgende eksempel uden MaxScale på billedet:

  • Databasenavn:minapp
  • Bruger:myapp_user
  • Vært:192.168.0.133 (applikationsserver)

For at give brugeren adgang til databasen inde i MariaDB-serveren, skal man køre følgende sætning:

MariaDB> OPRET BRUGER 'myapp_user'@'192.168.0.133' IDENTIFICERET VED 'mypassword';MariaDB> GIV ALLE PRIVILEGIER PÅ minapp.* til 'myapp_user'@'192.168.0.133'; 

Med MaxScale på billedet skal man køre følgende sætning i stedet (erstat applikationsserverens IP-adresse med MaxScale IP-adressen, 192.168.0.200):

MariaDB> OPRET BRUGER 'myapp_user'@'192.168.0.200' IDENTIFICERET VED 'mypassword';MariaDB> GIV ALLE PRIVILEGIER PÅ minapp.* til 'myapp_user'@'192.168.0.200'; 

Fra applikationen er der to porte, du kan bruge til at oprette forbindelse til databasen:

  • 4006 – Round-robin lytter, velegnet til skrivebeskyttede arbejdsbelastninger.
  • 4008 - Læs-skriv-delt lytter, velegnet til skrive-arbejdsbelastninger.

Hvis din applikation kun må angive én MySQL-port (f.eks. Wordpress, Joomla osv.), skal du vælge RW-porten 4008 i stedet. Dette er den sikreste slutpunktforbindelse uanset klyngetype. Men hvis din applikation kan håndtere forbindelser til flere MySQL-porte, kan du sende læsningerne til round-robin-lytteren. Denne lytter har mindre overhead og meget hurtigere sammenlignet med den opdelte læse-skrivelytter.

For vores MariaDB-replikeringsopsætning skal du oprette forbindelse til et af disse endepunkter som databasevært/portkombination:

  • 192.168.0.200 port 4008 - MaxScale - kun læse/skrive eller skrive
  • 192.168.0.200 port 4006 - MaxScale - balanceret skrivebeskyttet
  • 192.168.0.91 port 3306 - MariaDB Server (master) - læs/skriv
  • 192.168.0.92 port 3306 - MariaDB Server (slave) - skrivebeskyttet
  • 192.168.0.93 port 3306 - MariaDB Server (slave) - skrivebeskyttet

Bemærk for multi-master cluster type som Galera Cluster og NDB Cluster, port 4006 kan bruges som multi-write balancerede forbindelser i stedet. Med MaxScale har du mange muligheder at vælge imellem, når du opretter forbindelse til databasen, og hver af dem giver sit eget sæt af fordele.

MaxScale Clustering med Docker Swarm

Med Docker Swarm kan vi oprette en gruppe af MaxScale-instanser via Swarm-tjeneste med mere end én replika sammen med Swarm Configs. Importer først konfigurationsfilen til Swarm:

$ kat maxscale.conf | docker config opret maxscale_config - 

Bekræft med:

$ docker config inspect --pretty maxscale_config 

Giv derefter MaxScale-databasebrugeren til at oprette forbindelse fra enhver Swarm-vært på netværket:

MariaDB> OPRET BRUGER 'maxscale'@'192.168.0.%' IDENTIFICERET AF 'my_s3cret';MariaDB> GIV ALLE PRIVILEGIER PÅ *.* TIL [email protected]'192.168.0.%';  

Når vi starter Swarm-tjenesten til MaxScale, kan vi oprette flere containere (kaldet replikaer) tilknytning til den samme konfigurationsfil som nedenfor:

$ docker-tjeneste opret \--navn maxscale-cluster \--replicas=3 \--publish public=4008,target=4008 \--publish published=4006,target=4006 \--config source =maxscale_config,target=/etc/maxscale.cnf \mariadb/maxscale 

Ovenstående vil skabe tre MaxScale-beholdere spredt over Swarm-noder. Bekræft med:

$ docker service lsID NAVN MODE REPLICAS IMAGE PORTSyj6u2xcdj7lo maxscale-cluster replikeret 3/3 mariadb/maxscale:latest *:4006->4006/tcp, *:4008->4008/tcp 

Hvis applikationerne kører inden for Swarm-netværket, kan du blot bruge tjenestenavnet "maxscale-cluster" som databasevært for dine applikationer. Eksternt kan du oprette forbindelse til en hvilken som helst Docker-vært på de offentliggjorte porte, og Swarm-netværket vil rute og afbalancere forbindelserne til de korrekte containere på round-robin-måde. På dette tidspunkt kan vores arkitektur illustreres som nedenfor:

I den anden del skal vi se på avancerede brugssager af MaxScale på Docker som servicekontrol, konfigurationsstyring, forespørgselsbehandling, sikkerhed og klyngeafstemning.


  1. Begrundelse for den nye Mac Pro

  2. opdatering og komprimering af sqlite-database i Android

  3. MySQL DROP TABEL

  4. Tak, Amazon, for at inspirere os til at levere en bedre DBaaS:SkySQL