sql >> Database >  >> RDS >> Mysql

MySQL InnoDB Cluster 8.0 - Een complete implementatie-walk-through:deel één

MySQL InnoDB Cluster bestaat uit 3 componenten:

  • MySQL-groepsreplicatie (een groep databaseservers die naar elkaar repliceren met fouttolerantie).
  • MySQL Router (query router naar de gezonde databaseknooppunten)
  • MySQL Shell (helper, client, configuratietool)

In het eerste deel van deze walkthrough gaan we een MySQL InnoDB-cluster implementeren. Er zijn een aantal praktische tutorials online beschikbaar, maar deze walkthrough behandelt alle noodzakelijke stappen/opdrachten om het cluster op één plek te installeren en uit te voeren. In het tweede deel van deze blogpost gaan we in op monitoring-, beheer- en schalingsoperaties, evenals enkele valkuilen bij het omgaan met MySQL InnoDB Cluster.

Het volgende diagram illustreert onze post-implementatie-architectuur:

We gaan in totaal 4 knooppunten inzetten; Een MySQL-groepsreplicatie met drie knooppunten en één MySQL-routerknooppunt op dezelfde locatie binnen de toepassingsserver. Alle servers draaien op Ubuntu 18.04 Bionic.

MySQL installeren

De volgende stappen moeten worden uitgevoerd op alle databaseknooppunten db1, db2 en db3.

Ten eerste moeten we wat hostmapping doen. Dit is cruciaal als u de hostnaam als host-ID in InnoDB Cluster wilt gebruiken en dit is de aanbevolen manier om dat te doen. Wijs alle hosts toe als de volgende in /etc/hosts:

$ vi /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Stop en schakel AppArmor uit:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

Download de nieuwste APT-configuratierepository van de MySQL Ubuntu-repositorywebsite op https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/ . Op het moment van schrijven is de laatste van 15 oktober 2019, namelijk mysql-apt-config_0.8.14-1_all.deb:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb

Installeer het pakket en configureer het voor "mysql-8.0":

$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

Installeer de GPG-sleutel:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Werk de repolist bij:

$ apt-get update

Installeer Python en gevolgd door MySQL-server en MySQL-shell:

$ apt-get -y install mysql-server mysql-shell

U krijgt de volgende configuratiewizards te zien:

  1. Stel een root-wachtwoord in - Geef een sterk wachtwoord op voor de MySQL-rootgebruiker.
  2. Stel de verificatiemethode in - Kies "Verouderde verificatiemethode gebruiken (Behoud MySQL 5.x-compatibiliteit)"

MySQL zou op dit punt geïnstalleerd moeten zijn. Verifieer met:

$ systemctl status mysql

Zorg ervoor dat u een "actieve (actieve)" status krijgt.

De server voorbereiden voor InnoDB-cluster

De volgende stappen moeten worden uitgevoerd op alle databaseknooppunten db1, db2 en db3.

Configureer de MySQL-server om groepsreplicatie te ondersteunen. De gemakkelijkste en aanbevolen manier om dit te doen, is door de nieuwe MySQL Shell te gebruiken:

$ mysqlsh

Verifieer u als de lokale rootgebruiker en volg de configuratiewizard dienovereenkomstig, zoals weergegeven in het onderstaande voorbeeld:

MySQL  JS > dba.configureLocalInstance("[email protected]:3306");

Na authenticatie zou u een aantal vragen moeten krijgen, zoals de volgende:

Antwoorden op die vragen met de volgende antwoorden:

  • Kies 2 - Maak een nieuw beheerdersaccount voor InnoDB-cluster met minimaal vereiste subsidies
  • Accountnaam:[email protected]%
  • Wachtwoord:mys3cret&&
  • Bevestig wachtwoord:mys3cret&&
  • Wilt u de vereiste configuratiewijzigingen doorvoeren?:y
  • Wilt u de instantie opnieuw opstarten nadat u deze hebt geconfigureerd?:y

Vergeet niet het bovenstaande te herhalen op alle databaseknooppunten. Op dit moment zou de MySQL-daemon naar alle IP-adressen moeten luisteren en is groepsreplicatie ingeschakeld. We kunnen nu doorgaan met het maken van het cluster.

Cluster maken

Nu zijn we klaar om een ​​cluster te maken. Maak op db1 verbinding als clusterbeheerder vanuit MySQL Shell:

MySQL|JS> shell.connect('[email protected]:3306');
Creating a session to '[email protected]:3306'
Please provide the password for '[email protected]:3306': ***********
Save password for '[email protected]:3306'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:[email protected]:3306>

U zou verbonden moeten zijn als [email protected] (u kunt dit zien door naar de promptreeks voor '>' te kijken). We kunnen nu een nieuw cluster maken:

MySQL|db1:3306 ssl|JS> cluster = dba.createCluster('my_innodb_cluster');

Controleer de clusterstatus:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Op dit moment maakt alleen db1 deel uit van het cluster. De standaard topologiemodus is Single-Primary, vergelijkbaar met een replicasetconcept waarbij slechts één knooppunt tegelijk schrijver is. De overige knooppunten in het cluster zijn lezers.

Let op de clusterstatus die zegt OK_NO_TOLERANCE, en verdere uitleg onder de statusText-toets. In een replicasetconcept biedt één knooppunt geen fouttolerantie. Er zijn minimaal 3 knoop punten vereist om de failover van het primaire knoop punt te automatiseren. We gaan hier later naar kijken.

Voeg nu het tweede knooppunt toe, db2 en accepteer de standaard herstelmethode, "Clone":

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

De volgende schermafbeelding toont de voortgang van de initialisatie van db2 nadat we de bovenstaande opdracht hebben uitgevoerd. De synchronisatiebewerking wordt automatisch uitgevoerd door MySQL:

Controleer de cluster- en db2-status:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Op dit moment hebben we twee knooppunten in het cluster, db1 en db2. De status toont nog steeds OK_NO_TOLERANCE met verdere uitleg onder statusText-waarde. Zoals hierboven vermeld, vereist MySQL Group Replication ten minste 3 nodes in een cluster voor fouttolerantie. Daarom moeten we het derde knooppunt toevoegen, zoals hierna wordt weergegeven.

Voeg het laatste knooppunt, db3, toe en accepteer de standaard herstelmethode, "Clone", vergelijkbaar met db2:

MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');

De volgende schermafbeelding toont de voortgang van de initialisatie van db3 nadat we de bovenstaande opdracht hebben uitgevoerd. De synchronisatiebewerking wordt automatisch uitgevoerd door MySQL:

Controleer de cluster- en db3-status:

MySQL|db1:3306 ssl|JS> cluster.status()
{
    "clusterName": "my_innodb_cluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "db1:3306",
        "ssl": "REQUIRED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "db3:3306": {
                "address": "db3:3306",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "db1:3306"
}

Het cluster ziet er nu goed uit, de status is OK en het cluster kan maximaal één storingsknooppunt tegelijk verdragen. Het primaire knooppunt is db1 waar het "primary":"db1:3306" en "mode":"R/W" toont, terwijl andere knooppunten zich in de status "R/O" bevinden. Als u de read_only en super_read_only waarden op RO-knooppunten aanvinkt, worden beide als true weergegeven.

Onze MySQL Group Replication-implementatie is nu voltooid en gesynchroniseerd.

De router implementeren

Zorg ervoor dat de hosttoewijzing correct is op de app-server waarop we onze applicatie gaan uitvoeren:

$ vim /etc/hosts
192.168.10.40   router apps
192.168.10.41   db1 db1.local
192.168.10.42   db2 db2.local
192.168.10.43   db3 db3.local
127.0.0.1       localhost localhost.localdomain

Stop en schakel AppArmor uit:

$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor

Installeer vervolgens het MySQL-repositorypakket, vergelijkbaar met wat we hebben gedaan bij het uitvoeren van de database-installatie:

$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb
$ dpkg -i mysql-apt-config_0.8.14-1_all.deb

GPG-sleutel toevoegen:

$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5

Werk de repolijst bij:

$ apt-get update

Installeer MySQL-router en client:

$ apt-get -y install mysql-router mysql-client

MySQL Router is nu geïnstalleerd onder /usr/bin/mysqlrouter. MySQL-router biedt een bootstrap-vlag om de routerwerking automatisch te configureren met een MySQL InnoDB-cluster. Wat we moeten doen, is de string-URI opgeven voor een van de databaseknooppunten als de InnoDB-clusterbeheerder (clusteradmin).

Om de configuratie te vereenvoudigen, zullen we het mysqlrouter-proces als rootgebruiker uitvoeren:

$ mysqlrouter --bootstrap [email protected]:3306 --directory myrouter --user=root

Dit is wat we zouden moeten krijgen nadat we het wachtwoord voor de clusteradmin-gebruiker hebben opgegeven:

Het bootstrap-commando helpt ons bij het genereren van het routerconfiguratiebestand op /root/myrouter/mysqlrouter.conf. Nu kunnen we de mysqlrouter-daemon starten met het volgende commando vanuit de huidige map:

$ myrouter/start.sh

Controleer of de verwachte poorten correct luisteren:

$ netstat -tulpn | grep mysql
tcp        0 0 0.0.0.0:6446            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:6447            0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64470           0.0.0.0:* LISTEN   14726/mysqlrouter
tcp        0 0 0.0.0.0:64460           0.0.0.0:* LISTEN   14726/mysqlrouter

Onze applicatie kan nu poort 6446 gebruiken voor lezen/schrijven en 6447 voor alleen-lezen MySQL-verbindingen.

Verbinding maken met het cluster

Laten we een databasegebruiker maken op het hoofdknooppunt. Maak op db1 verbinding met de MySQL-server via MySQL-shell:

$ mysqlsh [email protected]:3306

Overschakelen van Javascript-modus naar SQL-modus:

MySQL|localhost:3306 ssl|JS> \sql

Switching to SQL mode... Commands end with ;

Maak een database:

MySQL|localhost:3306 ssl|SQL> CREATE DATABASE sbtest;

Maak een databasegebruiker aan:

MySQL|localhost:3306 ssl|SQL> CREATE USER [email protected]'%' IDENTIFIED BY 'password';

Geef de gebruiker toegang tot de database:

MySQL|localhost:3306 ssl|SQL> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'%';

Nu is onze database en gebruiker klaar. Laten we sysbench installeren om wat testgegevens te genereren. Doe op de app-server:

$ apt -y install sysbench mysql-client

Nu kunnen we testen op de app-server om verbinding te maken met de MySQL-server via MySQL-router. Maak voor een schrijfverbinding verbinding met poort 6446 van de routerhost:

$ mysql -usbtest -p -h192.168.10.40 -P6446 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db1        | 0           | 0                 |
+---------------+------------+-------------+-------------------+

Voor alleen-lezen verbinding, maak verbinding met poort 6447 van de routerhost:

$ mysql -usbtest -p -h192.168.10.40 -P6447 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user()        | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db3        | 1           | 1                 |
+---------------+------------+-------------+-------------------+

Ziet er goed uit. We kunnen nu enkele testgegevens genereren met sysbench. Genereer op de app-server 20 tabellen met 100.000 rijen per tabel door verbinding te maken met poort 6446 van de app-server:

$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--mysql-port=6446 \
--mysql-host=192.168.10.40 \
--tables=20 \
--table-size=100000 \
prepare

Als u een eenvoudige lees-schrijftest wilt uitvoeren op poort 6446 gedurende 300 seconden, voert u het volgende uit:

$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=8 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6446 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

Voor alleen-lezen workloads kunnen we de MySQL-verbinding naar poort 6447 sturen:

$ sysbench \
/usr/share/sysbench/oltp_read_only.lua \
--report-interval=2 \
--threads=1 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6447 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run

Conclusie

Dat is het. Onze MySQL InnoDB Cluster-installatie is nu compleet en alle componenten zijn actief en getest. In het tweede deel gaan we kijken naar beheer, monitoring en schaalactiviteiten van het cluster, evenals oplossingen voor een aantal veelvoorkomende problemen bij het omgaan met MySQL InnoDB Cluster. Blijf op de hoogte!


  1. Kardinaliteitsschatting:dichtheidsstatistieken combineren

  2. Hoe RANK() werkt in SQL Server

  3. Query invoegen om rijen in MySQL in te voegen

  4. Welke functie voor gegevensmaskering moet ik gebruiken?