MariaDB MaxScale is een geavanceerde, plug-in databaseproxy voor MariaDB-databaseservers. Het bevindt zich tussen clienttoepassingen en de databaseservers, waarbij clientquery's en serverreacties worden gerouteerd. MaxScale bewaakt ook de servers, zodat het snel eventuele wijzigingen in de serverstatus of replicatietopologie opmerkt. Dit maakt MaxScale een natuurlijke keuze voor het regelen van failover en soortgelijke functies.
In deze tweedelige blogserie gaan we een complete uitleg geven over het uitvoeren van MariaDB MaxScale op Docker. Dit deel behandelt de implementatie als een zelfstandige Docker-container en MaxScale-clustering via Docker Swarm voor hoge beschikbaarheid.
MariaDB MaxScale op Docker
Er zijn een aantal MariaDB Docker-images beschikbaar in Docker Hub. In deze blog gaan we de officiële afbeelding gebruiken die wordt onderhouden en gepubliceerd door MariaDB genaamd "mariadb/maxscale" (tag:nieuwste). De afbeelding is ongeveer 71 MB groot. Op dit moment van schrijven is de afbeelding vooraf geïnstalleerd met MaxScale 2.3.4 als onderdeel van de vereiste pakketten.
Over het algemeen zijn de volgende stappen vereist om een MaxScale met deze afbeelding in een containeromgeving uit te voeren:
- Een draaiende MariaDB (master-slave of master-master) replicatie/Galera-cluster of NDB-cluster
- Een databasegebruiker maken en toewijzen die speciaal is bedoeld voor MaxScale-monitoring
- Bereid het MaxScale-configuratiebestand voor
- Wijs het configuratiebestand toe aan een container of laad het in Kubernetes ConfigMap of Docker Swarm Configs
- Start de container/pod/service/replicaset
Merk op dat MaxScale een product van MariaDB is, wat betekent dat het is afgestemd op de MariaDB-server. De meeste functies zijn nog steeds compatibel met MySQL, behalve enkele onderdelen zoals bijvoorbeeld GTID-verwerking, Galera Cluster-configuratie en interne gegevensbestanden. De versie die we gaan gebruiken is 2.3.4, deze is uitgebracht onder Business Source License (BSL). Hiermee kan alle code open zijn en is het gebruik onder DRIE servers gratis. Wanneer het gebruik over drie backend-servers gaat, moet het bedrijf dat het gebruikt een commercieel abonnement betalen. Na een bepaalde tijdsperiode (2 jaar in het geval van MaxScale) gaat de release naar GPL en is al het gebruik gratis.
Voor alle duidelijkheid, aangezien dit een testomgeving is, mogen we meer dan 2 nodes hebben. Zoals vermeld op de MariaDB BSL FAQ-pagina:
V:Kan ik MariaDB-producten met een BSL-licentie gebruiken in een test- en ontwikkelomgeving?
A:Ja, in een niet-productie-test- en ontwikkelomgeving, kunt u producten met een BSL-licentie gebruiken zonder dat u een abonnement van MariaDB nodig hebt
/em>
In deze walkthrough hebben we al een MariaDB-replicatie met drie knooppunten geïmplementeerd met ClusterControl. Het volgende diagram illustreert de setup die we gaan implementeren:
Onze systeemarchitectuur bestaat uit:
- mariadb1 - 192.168.0.91 (master)
- mariadb2 - 192.168.0.92 (slaaf)
- mariadb3 - 192.168.0.93 (slaaf)
- docker1 - 192.168.0.200 (Docker-host voor containers - maxscale, app)
De MaxScale-gebruiker voorbereiden
Maak eerst een MySQL-databasegebruiker voor MaxScale en sta alle hosts in het netwerk 192.168.0.0/24 toe:
MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
Verleen vervolgens de vereiste rechten. Als u alleen de backend-servers wilt bewaken met taakverdeling, zijn de volgende subsidies voldoende:
MariaDB> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'192.168.0.%';
MariaDB> GRANT SELECT ON `mysql`.* TO 'maxscale'@'192.168.0.%';
MaxScale kan echter veel meer dan het routeren van query's. Het heeft de mogelijkheid om failover en omschakeling uit te voeren, bijvoorbeeld het promoveren van een slave naar een nieuwe master. Hiervoor zijn SUPER- en REPLICATION CLIENT-privileges vereist. Als u deze functie wilt gebruiken, wijst u in plaats daarvan ALLE PRIVILEGES toe aan de gebruiker:
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';
Dat is het voor het gebruikersgedeelte.
MaxScale-configuratiebestand voorbereiden
De afbeelding vereist dat een werkend configuratiebestand wordt toegewezen aan de container voordat deze wordt gestart. Het minimale configuratiebestand in de container zal ons niet helpen de reverse proxy te bouwen die we willen. Daarom moet het configuratiebestand vooraf worden voorbereid.
De volgende lijst kan ons helpen bij het verzamelen van de benodigde basisinformatie om ons configuratiebestand samen te stellen:
- Clustertype - MaxScale ondersteunt MariaDB-replicatie (master-slave, master-master), Galera Cluster, Amazon Aurora, MariaDB ColumnStore en NDB Cluster (ook bekend als MySQL-cluster).
- Backend IP-adres en/of hostnaam - Bereikbaar IP-adres of hostnaam voor alle backend-servers.
- Routeringsalgoritme - MaxScale ondersteunt twee soorten queryrouting:splitsen van lezen en schrijven en taakverdeling in round-robin.
- Luisterpoort door MaxScale - Standaard gebruikt MaxScale poort 4006 voor round-robin-verbindingen en 4008 voor gesplitste lees-schrijfverbindingen. Je kunt de UNIX-socket gebruiken als je wilt.
Maak in de huidige map een tekstbestand met de naam maxscale.cnf, zodat we het bij het opstarten aan de container kunnen toewijzen. Plak de volgende regels in het bestand:
########################
## 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
Een beetje uitleg voor elke sectie:
- Serverlijst - De back-endservers. Definieer elke MariaDB-server van dit cluster in zijn eigen strofe. De strofenaam wordt gebruikt wanneer we de servicedefinitie verderop specificeren. Het componenttype moet "server" zijn.
- MaxScale-configuratie - Definieer daar alle MaxScale-gerelateerde configuraties.
- Monitormodule - Hoe MaxScale de backend-servers moet bewaken. Het componenttype moet "monitor" zijn, gevolgd door een van de monitoringmodules. Raadpleeg MaxScale 2.3 Monitors voor de lijst met ondersteunde monitoren.
- Service - Waarheen de query moet worden geleid. Het componenttype moet "service" zijn. Raadpleeg MaxScale 2.3 Routers voor de lijst met ondersteunde routers.
- Luisteraar - Hoe MaxScale naar inkomende verbindingen moet luisteren. Het kan een poort- of socketbestand zijn. Het componenttype moet "luisteraar" zijn. Gewoonlijk zijn luisteraars gebonden aan diensten.
Dus eigenlijk willen we dat MaxScale luistert op twee poorten, 4006 en 4008. Poort 4006 is specifiek voor round-robin-verbindingen, geschikt voor alleen-lezen workloads voor onze MariaDB-replicatie, terwijl poort 4008 specifiek is voor kritieke lees- en schrijfworkloads. We willen MaxScale ook gebruiken om actie uit te voeren voor onze replicatie in het geval van een failover, omschakeling of slave-rejoin, daarom gebruiken we de monitormodule voor genaamd "mariadbmon".
De container laten draaien
We zijn nu klaar om onze zelfstandige MaxScale-container te gebruiken. Wijs het configuratiebestand toe met -v en zorg ervoor dat u beide listenerpoorten 4006 en 4008 publiceert. Optioneel kunt u de MaxScale REST API-interface inschakelen op poort 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
Verifieer met:
$ 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.
Zorg ervoor dat u geen fout ziet wanneer u de bovenstaande logboeken bekijkt. Controleer of de docker-proxy-processen luisteren naar de gepubliceerde poorten - 4006, 4008 en 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
Op dit moment is onze MaxScale actief en kan deze query's verwerken.
MaxCtrl
MaxCtrl is een opdrachtregelbeheerclient voor MaxScale die de MaxScale REST API gebruikt voor communicatie. Het is bedoeld als vervangende software voor de oudere MaxAdmin-opdrachtregelclient.
Om de MaxCtrl-console te openen, voert u de opdracht "maxctrl" in de container uit:
$ 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 │
└──────────┴──────────────┴──────┴─────────────┴─────────────────┴─────────────┘
Voer de volgende opdrachten uit om te controleren of alles in orde is:
maxctrl: list servers
maxctrl: list services
maxctrl: list filters
maxctrl: list sessions
Voor meer informatie over elk onderdeel, voeg in plaats daarvan het commando "show" toe, bijvoorbeeld:
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" │
│ │ } │
└──────────────────┴──────────────────────────────────────────┘
Verbinding maken met de database
De databasegebruiker van de toepassing moet de MaxScale-host hebben, aangezien deze vanuit het oogpunt van de MariaDB-server alleen de MaxScale-host kan zien. Beschouw het volgende voorbeeld zonder MaxScale in de afbeelding:
- Databasenaam:mijnapp
- Gebruiker:myapp_user
- Host:192.168.0.133 (toepassingsserver)
Om de gebruiker toegang te geven tot de database binnen de MariaDB-server, moet men de volgende instructie uitvoeren:
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';
Met MaxScale in de afbeelding moet men in plaats daarvan de volgende instructie uitvoeren (vervang het IP-adres van de applicatieserver door het MaxScale IP-adres, 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';
Vanuit de applicatie zijn er twee poorten die u kunt gebruiken om verbinding te maken met de database:
- 4006 - Round-robin luisteraar, geschikt voor alleen-lezen workloads.
- 4008 - Lees-schrijf gesplitste luisteraar, geschikt voor schrijfwerkbelastingen.
Als uw toepassing slechts één MySQL-poort mag specificeren (bijv. Wordpress, Joomla, enz.), kiest u in plaats daarvan de RW-poort 4008. Dit is de veiligste eindpuntverbinding, ongeacht het clustertype. Als uw toepassing echter verbindingen met meerdere MySQL-poorten aankan, kunt u de reads naar de round-robin-listener sturen. Deze luisteraar heeft minder overhead en is veel sneller in vergelijking met de gesplitste lees-schrijfluisteraar.
Maak voor onze MariaDB-replicatie-installatie verbinding met een van deze eindpunten als databasehost/poort-combinatie:
- 192.168.0.200 poort 4008 - MaxScale - lezen/schrijven of alleen schrijven
- 192.168.0.200 poort 4006 - MaxScale - gebalanceerd alleen-lezen
- 192.168.0.91 poort 3306 - MariaDB Server (master) - lezen/schrijven
- 192.168.0.92 poort 3306 - MariaDB Server (slave) - alleen-lezen
- 192.168.0.93 poort 3306 - MariaDB Server (slave) - alleen-lezen
Opmerking voor multi-master clustertypes zoals Galera Cluster en NDB Cluster, poort 4006 kan in plaats daarvan worden gebruikt als gebalanceerde multi-write verbindingen. Met MaxScale heb je veel opties om uit te kiezen wanneer je verbinding maakt met de database, waarbij elk van hen zijn eigen reeks voordelen biedt.
MaxScale-clustering met Docker Swarm
Met Docker Swarm kunnen we een groep MaxScale-instanties maken via Swarm-service met meer dan één replica samen met Swarm Configs. Importeer eerst het configuratiebestand in Swarm:
$ cat maxscale.conf | docker config create maxscale_config -
Verifieer met:
$ docker config inspect --pretty maxscale_config
Geef vervolgens de MaxScale-databasegebruiker om verbinding te maken vanaf alle Swarm-hosts in het netwerk:
MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';
Bij het opstarten van de Swarm-service voor MaxScale kunnen we meerdere containers (replica's genaamd) maken die aan hetzelfde configuratiebestand worden toegewezen, zoals hieronder:
$ 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
Het bovenstaande creëert drie MaxScale-containers verspreid over Swarm-knooppunten. Verifieer met:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
yj6u2xcdj7lo maxscale-cluster replicated 3/3 mariadb/maxscale:latest *:4006->4006/tcp, *:4008->4008/tcp
Als de applicaties binnen het Swarm-netwerk worden uitgevoerd, kunt u eenvoudig de servicenaam "maxscale-cluster" gebruiken als de databasehost voor uw applicaties. Extern kunt u verbinding maken met een van de Docker-hosts op de gepubliceerde poorten en het Swarm-netwerk zal de verbindingen naar de juiste containers routeren en balanceren op round-robin-manier. Op dit punt kan onze architectuur als volgt worden geïllustreerd:
In het tweede deel gaan we kijken naar geavanceerde use-cases van MaxScale op Docker, zoals servicecontrole, configuratiebeheer, queryverwerking, beveiliging en clusterafstemming.