Cluster MariaDB (MySQL) - Esercitazione su AzureMariaDB (MySQL) cluster: Azure tutorial

Importante

Azure offre due diversi modelli di distribuzione per creare e usare le risorse: Azure Resource Manager e la distribuzione classica.Azure has two different deployment models for creating and working with resources: Azure Resource Manager and classic. In questo articolo viene illustrato il modello di distribuzione classica.This article covers the classic deployment model. Microsoft consiglia di usare il modello di Azure Resource Manager per le distribuzioni più recenti.Microsoft recommends that most new deployments use the Azure Resource Manager model.

Nota

Il cluster MariaDB Enterprise è ora disponibile in Azure Marketplace.MariaDB Enterprise cluster is now available in the Azure Marketplace. La nuova offerta distribuirà automaticamente un cluster MariaDB Galera su Azure Resource Manager.The new offering will automatically deploy a MariaDB Galera cluster on Azure Resource Manager. È consigliabile usare la nuova offerta da Azure Marketplace.You should use the new offering from Azure Marketplace.

Questo articolo illustra come creare un cluster multi-master Galera di database MariaDBs, un sostituto pronto all'uso per MySQL, per lavorare in un ambiente a disponibilità elevata in macchine virtuali di Azure.This article shows you how to create a multi-Master Galera cluster of MariaDBs (a robust, scalable, and reliable drop-in replacement for MySQL) to work in a highly available environment on Azure virtual machines.

Panoramica dell'architetturaArchitecture overview

In questo articolo viene descritto come completare i passaggi seguenti:This article describes how to complete the following steps:

  • Creare un cluster a tre nodi.Create a three-node cluster.
  • Separare i dischi dati dal disco del sistema operativo.Separate the data disks from the OS disk.
  • Creare i dischi dati in configurazione RAID 0/striping per aumentare il numero di IOPS.Create the data disks in RAID-0/striped setting to increase IOPS.
  • Usare Azure Load Balancer per bilanciare il carico dei 3 nodi.Use Azure Load Balancer to balance the load for the three nodes.
  • Per ridurre le operazioni ripetitive, creare un'immagine di macchina virtuale contenente MariaDB e Galera e usarla per creare le altre macchine virtuali del cluster.To minimize repetitive work, create a VM image that contains MariaDB + Galera and use it to create the other cluster VMs.

Architettura di sistema

Nota

In questo argomento vengono usati gli strumenti dell'interfaccia della riga di comando di Azure; accertarsi quindi di scaricarli e connetterli alla sottoscrizione di Azure in base alle istruzioni.This topic uses the Azure CLI tools, so make sure to download them and connect them to your Azure subscription according to the instructions. Per informazioni sui comandi disponibili nell’interfaccia della riga di comando di Azure, vedere il riferimento all'interfaccia della riga di comando di Azure.If you need a reference to the commands available in the Azure CLI, see the Azure CLI command reference. Sarà inoltre necessario creare una chiave SSH per l'autenticazione e prendere nota del percorso del file .pem.You will also need to create an SSH key for authentication and make note of the .pem file location.

Creare il modelloCreate the template

InfrastrutturaInfrastructure

  1. Creare un gruppo di affinità per contenere le risorse.Create an affinity group to hold the resources together.

     azure account affinity-group create mariadbcluster --location "North Europe" --label "MariaDB Cluster"
    
  2. Creare una rete virtuale.Create a virtual network.

     azure network vnet create --address-space 10.0.0.0 --cidr 8 --subnet-name mariadb --subnet-start-ip 10.0.0.0 --subnet-cidr 24 --affinity-group mariadbcluster mariadbvnet
    
  3. Creare un account di archiviazione per ospitare tutti i dischi.Create a storage account to host all our disks. Non è consigliabile inserire più di 40 dischi molto usati nello stesso account di archiviazione, per evitare di raggiungere il limite di 20.000 IOPS per account.You shouldn't place more than 40 heavily used disks on the same storage account to avoid hitting the 20,000 IOPS storage account limit. Nel caso di questo esempio si è molto lontani da tale valore, dunque per motivi di semplicità verrà archiviato tutto nello stesso account.In this case, you're well below that limit, so you'll store everything on the same account for simplicity.

     azure storage account create mariadbstorage --label mariadbstorage --affinity-group mariadbcluster
    
  4. Individuare il nome dell'immagine di macchina virtuale CentOS 7.Find the name of the CentOS 7 virtual machine image.

     azure vm image list | findstr CentOS
    

    Il risultato sarà simile a 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20140926.The output will be something like 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20140926.

    Usare il nome nel passaggio successivo.Use that name in the following step.

  5. Creare il modello di macchina virtuale sostituendo /path/to/key.pem con il percorso in cui è stata archiviata la chiave SSH .pem generata.Create the VM template and replace /path/to/key.pem with the path where you stored the generated .pem SSH key.

     azure vm create --virtual-network-name mariadbvnet --subnet-names mariadb --blob-url "http://mariadbstorage.blob.core.windows.net/vhds/mariadbhatemplate-os.vhd"  --vm-size Medium --ssh 22 --ssh-cert "/path/to/key.pem" --no-ssh-password mariadbtemplate 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20140926 azureuser
    
  6. Collegare 4 dischi dati da 500 GB alla macchina virtuale da usare in configurazione RAID.Attach four 500-GB data disks to the VM for use in the RAID configuration.

     FOR /L %d IN (1,1,4) DO azure vm disk attach-new mariadbhatemplate 512 http://mariadbstorage.blob.core.windows.net/vhds/mariadbhatemplate-data-%d.vhd
    
  7. Usare SSH per accedere al modello di macchina virtuale creato all'indirizzo mariadbhatemplate.cloudapp.net:22 e connettersi usando la chiave privata.Use SSH to sign in to the template VM that you created at mariadbhatemplate.cloudapp.net:22, and connect by using your private key.

SoftwareSoftware

  1. Ottenere la radice.Get the root.

     sudo su
    
  2. Installare il supporto RAID:Install RAID support:

    a.a. Installare mdadm.Install mdadm.

           yum install mdadm
    

    b.b. Creare la configurazione RAID 0/striping con un file system EXT4.Create the RAID0/stripe configuration with an EXT4 file system.

           mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=4 /dev/sdc /dev/sdd /dev/sde /dev/sdf
           mdadm --detail --scan >> /etc/mdadm.conf
           mkfs -t ext4 /dev/md0
    

    c.c. Creare la directory del punto di montaggio.Create the mount point directory.

           mkdir /mnt/data
    

    d.d. Recuperare l'UUID del dispositivo RAID appena creato.Retrieve the UUID of the newly created RAID device.

           blkid | grep /dev/md0
    

    e.e. Modificare /etc/fstab.Edit /etc/fstab.

           vi /etc/fstab
    

    f.f. Aggiungere il dispositivo per abilitare il montaggio automatico al riavvio sostituendo l'UUID con il valore ottenuto dal comando blkid precedente.Add the device to enable auto mounting on reboot, replacing the UUID with the value obtained from the previous blkid command.

           UUID=<UUID FROM PREVIOUS>   /mnt/data ext4   defaults,noatime   1 2
    

    g.g. Montare la nuova partizione.Mount the new partition.

           mount /mnt/data
    
  3. Installare MariaDB.Install MariaDB.

    a.a. Creare il file MariaDB.repo.Create the MariaDB.repo file.

             vi /etc/yum.repos.d/MariaDB.repo
    

    b.b. Inserire nel file repo il contenuto seguente:Fill the repo file with the following content:

           [mariadb]
           name = MariaDB
           baseurl = http://yum.mariadb.org/10.0/centos7-amd64
           gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
           gpgcheck=1
    

    c.c. Rimuovere postfix e mariadb-libs per evitare conflitti.To avoid conflicts, remove existing postfix and mariadb-libs.

        yum remove postfix mariadb-libs-*
    

    d.d. Installare MariaDB con Galera.Install MariaDB with Galera.

        yum install MariaDB-Galera-server MariaDB-client galera
    
  4. Spostare la directory dati MySQL nel dispositivo a blocchi RAID.Move the MySQL data directory to the RAID block device.

    a.a. Copiare la directory MySQL nel nuovo percorso e rimuovere la vecchia directory.Copy the current MySQL directory into its new location and remove the old directory.

        cp -avr /var/lib/mysql /mnt/data  
        rm -rf /var/lib/mysql
    

    b.b. Impostare di conseguenza le autorizzazioni per la nuova directory.Set permissions for the new directory accordingly.

        chown -R mysql:mysql /mnt/data && chmod -R 755 /mnt/data/
    

    c.c. Creare un collegamento simbolico che punti la vecchia directory al nuovo percorso nella partizione RAID.Create a symlink that points the old directory to the new location on the RAID partition.

        ln -s /mnt/data/mysql /var/lib/mysql
    
  5. Poiché SELinux interferisce con le operazioni cluster, è necessario disabilitarlo per la sessione corrente.Because SELinux interferes with the cluster operations, it is necessary to disable it for the current session. Modificare /etc/selinux/config per disabilitarlo per i riavvii successivi.Edit /etc/selinux/config to disable it for subsequent restarts.

         setenforce 0
    
         then editing `/etc/selinux/config` to set `SELINUX=permissive`
    
  6. Convalidare le esecuzioni di MySQL.Validate MySQL runs.

    a.a. Avviare MySQL.Start MySQL.

        service mysql start
    

    b.b. Proteggere l'installazione di MySQL impostando la password radice, rimuovendo gli utenti anonimi per disabilitare la connessione da remoto come utente radice e rimuovendo il database di test.Secure the MySQL installation, set the root password, remove anonymous users to disable remote root login, and remove the test database.

        mysql_secure_installation
    

    c.c. Creare un utente nel database per le operazioni cluster e, facoltativamente, le applicazioni.Create a user on the database for cluster operations, and optionally for your applications.

        mysql -u root -p
        GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'%' IDENTIFIED BY 'p@ssw0rd' WITH GRANT OPTION; FLUSH PRIVILEGES;
        exit
    

    d.d. Arrestare MySQL.Stop MySQL.

         service mysql stop
    
  7. Creare un segnaposto di configurazione.Create a configuration placeholder.

    a.a. Modificare la configurazione di MySQL per creare un segnaposto per le impostazioni del cluster.Edit the MySQL configuration to create a placeholder for the cluster settings. Non sostituire <Variables> né rimuovere simboli di commento in questa fase.Do not replace the <Variables> or uncomment now. L'operazione va eseguita dopo la creazione di una macchina virtuale dal modello.That will happen after you create a VM from this template.

         vi /etc/my.cnf.d/server.cnf
    

    b.b. Modificare la sezione galera e cancellarla.Edit the galera section and clear it out.

    c.c. Modificare la sezione [mariadb].Edit the [mariadb] section.

        wsrep_provider=/usr/lib64/galera/libgalera_smm.so
        binlog_format=ROW
        wsrep_sst_method=rsync
        bind-address=0.0.0.0 # When set to 0.0.0.0, the server listens to remote connections
        default_storage_engine=InnoDB
        innodb_autoinc_lock_mode=2
    
        wsrep_sst_auth=cluster:p@ssw0rd # CHANGE: Username and password you created for the SST cluster MySQL user
        #wsrep_cluster_name='mariadbcluster' # CHANGE: Uncomment and set your desired cluster name
        #wsrep_cluster_address="gcomm://mariadb1,mariadb2,mariadb3" # CHANGE: Uncomment and Add all your servers
        #wsrep_node_address='<ServerIP>' # CHANGE: Uncomment and set IP address of this server
        #wsrep_node_name='<NodeName>' # CHANGE: Uncomment and set the node name of this server
    
  8. Aprire le porte necessarie sul firewall usando FirewallD su CentOS 7.Open required ports on the firewall by using FirewallD on CentOS 7.

    • MySQL: firewall-cmd --zone=public --add-port=3306/tcp --permanentMySQL: firewall-cmd --zone=public --add-port=3306/tcp --permanent
    • GALERA: firewall-cmd --zone=public --add-port=4567/tcp --permanentGALERA: firewall-cmd --zone=public --add-port=4567/tcp --permanent
    • GALERA IST: firewall-cmd --zone=public --add-port=4568/tcp --permanentGALERA IST: firewall-cmd --zone=public --add-port=4568/tcp --permanent
    • RSYNC: firewall-cmd --zone=public --add-port=4444/tcp --permanentRSYNC: firewall-cmd --zone=public --add-port=4444/tcp --permanent
    • Ricaricare il firewall: firewall-cmd --reloadReload the firewall: firewall-cmd --reload
  9. Ottimizzare le prestazioni del sistema.Optimize the system for performance. Per altre informazioni, vedere la strategia di ottimizzazione delle prestazioni.For more information, see performance tuning strategy.

    a.a. Modificare di nuovo il file di configurazione di MySQL.Edit the MySQL configuration file again.

         vi /etc/my.cnf.d/server.cnf
    

    b.b. Modificare la sezione [mariadb] e aggiungere quanto segue:Edit the [mariadb] section and append the following content:

    Nota

    innodb_buffer_pool_size dovrebbe essere il 70% della memoria della macchina virtuale.We recommend that innodb_buffer_pool_size is 70 percent of your VM's memory. In questo esempio il valore è stato impostato su 2,45 GB per una macchina virtuale di Azure media con 3,5 GB di RAM.In this example, it has been set at 2.45 GB for the medium Azure VM with 3.5 GB of RAM.

        innodb_buffer_pool_size = 2508M # The buffer pool contains buffered data and the index. This is usually set to 70 percent of physical memory.
        innodb_log_file_size = 512M #  Redo logs ensure that write operations are fast, reliable, and recoverable after a crash
        max_connections = 5000 # A larger value will give the server more time to recycle idled connections
        innodb_file_per_table = 1 # Speed up the table space transmission and optimize the debris management performance
        innodb_log_buffer_size = 128M # The log buffer allows transactions to run without having to flush the log to disk before the transactions commit
        innodb_flush_log_at_trx_commit = 2 # The setting of 2 enables the most data integrity and is suitable for Master in MySQL cluster
        query_cache_size = 0
    
  10. Arrestare MySQL, disabilitare l'esecuzione all'avvio del servizio MySQL per evitare di rovinare il cluster quando si aggiunge un nodo ed eseguire il deprovisioning della macchina.Stop MySQL, disable MySQL service from running on startup to avoid disrupting the cluster when adding a node, and deprovision the machine.

    service mysql stop
    chkconfig mysql off
    waagent -deprovision
    
  11. Acquisire la macchina virtuale tramite il portale.Capture the VM through the portal. (Attualmente il problema noto n. 1268 nell’interfaccia della riga di comando di Azure descrive il fatto che le immagini acquisite dagli strumenti di tale interfaccia non acquisiscono i dischi dati collegati.)(Currently, issue #1268 in the Azure CLI tools describes the fact that images captured by the Azure CLI tools do not capture the attached data disks.)

    a.a. Arrestare la macchina tramite il portale.Shut down the machine through the portal.

    b.b. Fare clic su Acquisisci e specificare il nome dell'immagine come mariadb-galera-image.Click Capture and specify the image name as mariadb-galera-image. Fornire una descrizione e selezionare "Il comando waagent è stato eseguito."Provide a description and check "I have run waagent."

    Acquisizione della macchina virtuale

Creare il clusterCreate the cluster

Creare tre macchine virtuali sulla base del modello creato e quindi configurare e avviare il cluster.Create three VMs with the template you created, and then configure and start the cluster.

  1. Creare la prima macchina virtuale di CentOS 7 dall'immagine mariadb-galera-image creata, fornendo le informazioni seguenti:Create the first CentOS 7 VM from the mariadb-galera-image image you created, providing the following information:

    • Nome rete virtuale: mariadbvnetVirtual network name: mariadbvnet
    • Subnet: mariadbSubnet: mariadb
    • Dimensioni della macchina: medieMachine size: medium
    • Nome del servizio cloud: mariadbha (o un nome a cui si desidera accedere tramite mariadbha.cloudapp.net)Cloud service name: mariadbha (or whatever name you want to be accessed through mariadbha.cloudapp.net)
    • Nome del computer: mariadb1Machine name: mariadb1
    • Nome utente: azureuserUsername: azureuser
    • Accesso SSH: abilitatoSSH access: enabled
    • Trasferimento del file .pem con certificato SSH e sostituzione di /path/to/key.pem con il percorso in cui è stata archiviata la chiave SSH .pem generata.Passing the SSH certificate .pem file and replacing /path/to/key.pem with the path where you stored the generated .pem SSH key.

    Nota

    I comandi riportati di seguito sono suddivisi su più righe per maggiore chiarezza, ma è necessario immetterli in un'unica riga.The following commands are split over multiple lines for clarity, but you should enter each as one line.

     azure vm create
     --virtual-network-name mariadbvnet
     --subnet-names mariadb
     --availability-set clusteravset
     --vm-size Medium
     --ssh-cert "/path/to/key.pem"
     --no-ssh-password
     --ssh 22
     --vm-name mariadb1
     mariadbha mariadb-galera-image azureuser
    
  2. Creare altre due macchine virtuali collegandole al servizio cloud mariadbha.Create two more virtual machines by connecting them to the mariadbha cloud service. Modificare il nome della macchina virtuale e la porta SSH in una porta univoca non in conflitto con altre macchine virtuali nello stesso servizio cloud.Change the VM name and the SSH port to a unique port not conflicting with other VMs in the same cloud service.

     azure vm create
     --virtual-network-name mariadbvnet
     --subnet-names mariadb
     --availability-set clusteravset
     --vm-size Medium
     --ssh-cert "/path/to/key.pem"
     --no-ssh-password
     --ssh 23
     --vm-name mariadb2
     --connect mariadbha mariadb-galera-image azureuser
    

    Per MariaDB3:For MariaDB3:

     azure vm create
     --virtual-network-name mariadbvnet
     --subnet-names mariadb
     --availability-set clusteravset
     --vm-size Medium
     --ssh-cert "/path/to/key.pem"
     --no-ssh-password
     --ssh 24
     --vm-name mariadb3
     --connect mariadbha mariadb-galera-image azureuser
    
  3. Per il passaggio successivo è necessario ottenere l'indirizzo IP interno di ognuna delle tre macchine virtuali:You will need to get the internal IP address of each of the three VMs for the next step:

    Recupero dell'indirizzo IP virtuale

  4. Usare SSH per accedere alle tre macchine virtuali e modificare il file di configurazione in ognuna di esse.Use SSH to sign in to the three VMs and edit the configuration file on each of them.

     sudo vi /etc/my.cnf.d/server.cnf
    

    Rimuovere simboli di commento in wsrep_cluster_name e wsrep_cluster_address rimuovendo # a inizio riga.Uncomment wsrep_cluster_name and wsrep_cluster_address by removing the # at the beginning of the line. Inoltre, sostituire <ServerIP> in wsrep_node_address e <NodeName> in wsrep_node_name rispettivamente con l'indirizzo IP e il nome della macchina virtuale, quindi rimuovere i simboli di commento dalle righe di codice.Additionally, replace <ServerIP> in wsrep_node_address and <NodeName> in wsrep_node_name with the VM's IP address and name, respectively, and uncomment those lines as well.

  5. Avviare il cluster in MariaDB1 e lasciare che venga eseguito all'avvio.Start the cluster on MariaDB1 and let it run at startup.

     sudo service mysql bootstrap
     chkconfig mysql on
    
  6. Avviare MySQL in MariaDB2 e MariaDB3 e lasciare che venga eseguito all'avvio.Start MySQL on MariaDB2 and MariaDB3 and let it run at startup.

     sudo service mysql start
     chkconfig mysql on
    

Bilanciare il carico del clusterLoad balance the cluster

Durante la creazione, le macchine virtuali in cluster sono state aggiunte a un set di disponibilità denominato clusteravset, per garantire che vengano inserite in domini di errore e di aggiornamento diversi e che Azure non esegua mai contemporaneamente la manutenzione su tutte le macchine.When you created the clustered VMs, you added them into an availability set called clusteravset to ensure that they were put on different fault and update domains and that Azure never does maintenance on all machines at once. Questa configurazione soddisfa i requisiti di idoneità per il contratto di servizio di Azure.This configuration meets the requirements to be supported by the Azure service level agreement (SLA).

Ora è possibile usare Azure Load balancer per bilanciare le richieste tra i tre nodi.Now use Azure Load Balancer to balance requests between the three nodes.

Eseguire i comandi seguenti nel computer tramite l'interfaccia della riga di comando di Azure.Run the following commands on your machine by using the Azure CLI.

La struttura dei parametri di comando è: azure vm endpoint create-multiple <MachineName> <PublicPort>:<VMPort>:<Protocol>:<EnableDirectServerReturn>:<Load Balanced Set Name>:<ProbeProtocol>:<ProbePort>The command parameters structure is: azure vm endpoint create-multiple <MachineName> <PublicPort>:<VMPort>:<Protocol>:<EnableDirectServerReturn>:<Load Balanced Set Name>:<ProbeProtocol>:<ProbePort>

azure vm endpoint create-multiple mariadb1 3306:3306:tcp:false:MySQL:tcp:3306
azure vm endpoint create-multiple mariadb2 3306:3306:tcp:false:MySQL:tcp:3306
azure vm endpoint create-multiple mariadb3 3306:3306:tcp:false:MySQL:tcp:3306

L'interfaccia della riga di comando imposta l'intervallo dei probe del servizio di bilanciamento carico su 15 secondi, un tempo che potrebbe rivelarsi eccessivamente lungo.The CLI sets the load balancer probe interval to 15 seconds, which might be a bit too long. Modificare il valore nel portale in Endpoint per tutte le macchine virtuali.Change it in the portal under Endpoints for any of the VMs.

Modificare l'endpoint

Selezionare Riconfigura il set con carico bilanciato.Select Reconfigure the Load-Balanced Set.

Riconfigurare il set con carico bilanciato

Modificare Intervallo probe a 5 secondi e salvare le modifiche.Change Probe Interval to 5 seconds and save your changes.

Modificare l'intervallo di probe

Convalidare il clusterValidate the cluster

Il più è fatto.The hard work is done. Il cluster dovrebbe essere accessibile all'indirizzo mariadbha.cloudapp.net:3306 che raggiunge il servizio di bilanciamento del carico e instrada le richieste tra le tre macchine virtuali in modo semplice ed efficiente.The cluster should be now accessible at mariadbha.cloudapp.net:3306, which hits the load balancer and route requests between the three VMs smoothly and efficiently.

Usare il client MySQL di propria scelta per connettersi oppure connettersi tramite una delle macchine virtuali per verificare il funzionamento corretto di questo cluster.Use your favorite MySQL client to connect, or connect from one of the VMs to verify that this cluster is working.

 mysql -u cluster -h mariadbha.cloudapp.net -p

Creare quindi un nuovo database e popolarlo con una serie di dati.Then create a database and populate it with some data.

CREATE DATABASE TestDB;
USE TestDB;
CREATE TABLE TestTable (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value VARCHAR(255));
INSERT INTO TestTable (value)  VALUES ('Value1');
INSERT INTO TestTable (value)  VALUES ('Value2');
SELECT * FROM TestTable;

Il database creato restituisce la tabella seguente:The database you created returns the following table:

+----+--------+
| id | value  |
+----+--------+
|  1 | Value1 |
|  4 | Value2 |
+----+--------+
2 rows in set (0.00 sec)

Passaggi successiviNext steps

In questo articolo è stato creato un cluster a disponibilità elevata MariaDB + Galera a tre nodi in macchine virtuali di Azure con CentOS 7.In this article, you created a three-node MariaDB + Galera highly available cluster on Azure virtual machines running CentOS 7. Il bilanciamento del carico delle macchine virtuali viene eseguito mediante Azure Load Balancer.The VMs are load balanced with Azure Load Balancer.

Può essere utile consultare gli articoli sul metodo alternativo per creare un cluster MySQL su Linux e sui metodi per ottimizzare e testare le prestazioni di MySQL in macchine virtuali Linux di Azure.You might want to look at another way to cluster MySQL on Linux and ways to optimize and test MySQL performance on Azure Linux VMs.