sql >> Databasteknik >  >> RDS >> Mysql

MySQL InnoDB Cluster 8.0 - En komplett implementeringsgenomgång:del ett

MySQL InnoDB Cluster består av tre komponenter:

  • MySQL Group Replication (en grupp av databasservrar som replikerar till varandra med feltolerans).
  • MySQL-router (frågerouter till de sunda databasnoderna)
  • MySQL Shell (hjälp, klient, konfigurationsverktyg)

I den första delen av denna genomgång kommer vi att distribuera ett MySQL InnoDB-kluster. Det finns ett antal praktiska handledningar tillgängliga online men den här genomgången täcker alla nödvändiga steg/kommandon för att installera och köra klustret på ett ställe. Vi kommer att täcka övervakning, hantering och skalningsoperationer samt några gotchas när vi hanterar MySQL InnoDB Cluster i den andra delen av det här blogginlägget.

Följande diagram illustrerar vår efterinstallationsarkitektur:

Vi kommer att distribuera totalt 4 noder; En MySQL-gruppreplikering med tre noder och en MySQL-routernod samlokaliserad inom applikationsservern. Alla servrar körs på Ubuntu 18.04 Bionic.

Installera MySQL

Följande steg bör utföras på alla databasnoder db1, db2 och db3.

För det första måste vi göra lite värdkartläggning. Detta är avgörande om du vill använda värdnamn som värdidentifierare i InnoDB Cluster och detta är det rekommenderade sättet att göra. Mappa alla värdar som följande inuti /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

Stoppa och inaktivera AppArmor:

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

Ladda ner det senaste APT-konfigurationsförrådet från MySQL Ubuntu-förvarets webbplats på https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/ . När detta skrivs är den senaste daterad 15 oktober 2019 vilket är 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

Installera paketet och konfigurera det för "mysql-8.0":

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

Installera GPG-nyckeln:

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

Uppdatera ompolisen:

$ apt-get update

Installera Python och följt av MySQL-server och MySQL-skal:

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

Du kommer att presenteras med följande konfigurationsguider:

  1. Ställ in ett root-lösenord - Ange ett starkt lösenord för MySQL-rootanvändaren.
  2. Ställ in autentiseringsmetoden - Välj "Använd äldre autentiseringsmetod (Behåll MySQL 5.x-kompatibilitet)"

MySQL borde ha installerats vid denna tidpunkt. Verifiera med:

$ systemctl status mysql

Se till att du får ett "aktivt (kör)"-tillstånd.

Förbereder servern för InnoDB-kluster

Följande steg bör utföras på alla databasnoder db1, db2 och db3.

Konfigurera MySQL-servern för att stödja gruppreplikering. Det enklaste och rekommenderade sättet att göra detta är att använda det nya MySQL-skalet:

$ mysqlsh

Autentisera som den lokala rotanvändaren och följ konfigurationsguiden enligt exemplet nedan:

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

När du har autentiserats bör du få ett antal frågor som följande:

Svar på dessa frågor med följande svar:

  • Välj 2 - Skapa ett nytt administratörskonto för InnoDB-klustret med minimala nödvändiga bidrag
  • Kontonamn:[email protected]%
  • Lösenord:mys3cret&&
  • Bekräfta lösenord:mys3cret&&
  • Vill du utföra de nödvändiga konfigurationsändringarna?:y
  • Vill du starta om instansen efter att ha konfigurerat den?:y

Glöm inte att upprepa ovanstående på alla databasnoder. Vid denna tidpunkt bör MySQL-demonen lyssna på alla IP-adresser och gruppreplikering är aktiverad. Vi kan nu fortsätta att skapa klustret.

Skapa klustret

Nu är vi redo att skapa ett kluster. På db1, anslut som klusteradmin från 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>

Du bör vara ansluten som [email protected] (du kan se det genom att titta på promptsträngen före '>'). Vi kan nu skapa ett nytt kluster:

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

Kontrollera klusterstatusen:

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"
}

I det här läget är endast db1 en del av klustret. Standardtopologiläget är Single-Primary, liknande ett replikuppsättningskoncept där endast en nod är en skribent åt gången. De återstående noderna i klustret kommer att vara läsare.

Var uppmärksam på klusterstatusen som säger OK_NO_TOLERANCE, och ytterligare förklaring under statusText-nyckel. I ett replikuppsättningskoncept ger en nod ingen feltolerans. Minst 3 noder krävs för att automatisera den primära nodens failover. Vi kommer att undersöka detta senare.

Lägg nu till den andra noden, db2 och acceptera standardåterställningsmetoden, "Clone":

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

Följande skärmdump visar initialiseringsförloppet för db2 efter att vi kört kommandot ovan. Synkroniseringen utförs automatiskt av MySQL:

Kontrollera klustret och 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"
}

Vid det här laget har vi två noder i klustret, db1 och db2. Statusen visar fortfarande OK_NO_TOLERANCE med ytterligare förklaring under statusText-värde. Som nämnts ovan kräver MySQL Group Replication minst 3 noder i ett kluster för feltolerans. Det är därför vi måste lägga till den tredje noden som visas härnäst.

Lägg till den sista noden, db3 och acceptera standardåterställningsmetoden, "Clone" liknande db2:

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

Följande skärmdump visar initialiseringsförloppet för db3 efter att vi utfört kommandot ovan. Synkroniseringen utförs automatiskt av MySQL:

Kontrollera klustret och 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"
}

Nu ser klustret bra ut, där statusen är OK och klustret kan tolerera upp till en felnod åt gången. Den primära noden är db1 där den visar "primary":"db1:3306" och "mode":"R/W", medan andra noder är i "R/O"-tillstånd. Om du kontrollerar skrivskyddade och super_läsbara värden på RO-noder, visas båda som sanna.

Vår MySQL Group Replication-distribution är nu klar och synkroniserad.

Distribuera routern

Se till att värdmappningen är korrekt på appservern som vi ska köra vår applikation:

$ 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

Stoppa och inaktivera AppArmor:

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

Installera sedan MySQL repository-paketet, liknande vad vi har gjort när vi utförde databasinstallation:

$ 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

Lägg till GPG-nyckel:

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

Uppdatera repolistan:

$ apt-get update

Installera MySQL-router och klient:

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

MySQL Router är nu installerad under /usr/bin/mysqlrouter. MySQL-router tillhandahåller en bootstrap-flagga för att automatiskt konfigurera routerdriften med ett MySQL InnoDB-kluster. Vad vi behöver göra är att specificera strängen URI till en av databasnoderna som InnoDB klusteradminanvändare (clusteradmin).

För att förenkla konfigurationen kommer vi att köra mysqlrouter-processen som root-användare:

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

Här är vad vi bör få efter att ha angett lösenordet för clusteradmin-användare:

Bootstrap-kommandot hjälper oss att generera routerns konfigurationsfil på /root/myrouter/mysqlrouter.conf. Nu kan vi starta mysqlrouter-demonen med följande kommando från den aktuella katalogen:

$ myrouter/start.sh

Kontrollera om de förväntade portarna lyssnar korrekt:

$ 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

Nu kan vår applikation använda port 6446 för läs/skriv och 6447 för skrivskyddade MySQL-anslutningar.

Ansluter till klustret

Låt oss skapa en databasanvändare på masternoden. På db1, anslut till MySQL-servern via MySQL-skal:

$ mysqlsh [email protected]:3306

Växla från Javascript-läge till SQL-läge:

MySQL|localhost:3306 ssl|JS> \sql

Switching to SQL mode... Commands end with ;

Skapa en databas:

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

Skapa en databasanvändare:

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

Ge användaren till databasen:

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

Nu är vår databas och användare redo. Låt oss installera sysbench för att generera lite testdata. På appservern gör du:

$ apt -y install sysbench mysql-client

Nu kan vi testa på appservern att ansluta till MySQL-servern via MySQL-router. För skrivanslutning, anslut till port 6446 på routervärden:

$ 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                 |
+---------------+------------+-------------+-------------------+

För skrivskyddad anslutning, anslut till port 6447 på routervärden:

$ 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                 |
+---------------+------------+-------------+-------------------+

Ser bra ut. Vi kan nu generera lite testdata med sysbench. På appservern genererar du 20 tabeller med 100 000 rader per tabell genom att ansluta till port 6446 på appservern:

$ 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

För att utföra ett enkelt läs-skrivtest på port 6446 i 300 sekunder, kör:

$ 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

För skrivskyddade arbetsbelastningar kan vi skicka MySQL-anslutningen till port 6447:

$ 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

Slutsats

Det var allt. Vår MySQL InnoDB Cluster-installation är nu komplett med alla dess komponenter körda och testade. I den andra delen kommer vi att titta på hantering, övervakning och skalningsoperationer av klustret samt lösningar på ett antal vanliga problem när vi hanterar MySQL InnoDB Cluster. Håll utkik!


  1. Hur man installerar MariaDB på CentOS 7 / RHEL 7

  2. Lägg till Ordinal Indicator till ett datum i PostgreSQL

  3. postgresql-sekvens nextval i schema

  4. Ta bort dubblettrader från tabell i Oracle