Usare set con bilanciamento del carico per creare un cluster MySQL su LinuxUse load-balanced sets to clusterize MySQL on Linux

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. Questo articolo illustra l'uso del modello di distribuzione classica.This article covers using the classic deployment model. Microsoft consiglia di usare il modello di Gestione risorse per le distribuzioni più recenti.Microsoft recommends that most new deployments use the Resource Manager model. È disponibile un modello di Resource Manager per la distribuzione di un cluster MySQL.A Resource Manager template is available if you need to deploy a MySQL cluster.

A partire dal 15 novembre 2017, le macchine virtuali saranno disponibili solo nel portale di Azure.Starting November 15, 2017, Virtual Machines will be available only in the Azure portal.

Questo articolo esplora e illustra i diversi approcci disponibili per distribuire servizi basati su Linux con disponibilità elevata su Microsoft Azure, esaminando principalmente l'elevata disponibilità del server MySQL.This article explores and illustrates the different approaches available to deploy highly available Linux-based services on Microsoft Azure, exploring MySQL Server high availability as a primer. Su Channel 9è disponibile un video che illustra questo approccio.A video illustrating this approach is available on Channel 9.

Sarà descritta una soluzione con disponibilità elevata MySQL a master singolo, con due nodi e nessuna condivisione, basata su DRBD, Corosync e Pacemaker.We will outline a shared-nothing, two-node, single-master MySQL high availability solution based on DRBD, Corosync, and Pacemaker. MySQL viene eseguito solo su un nodo alla volta.Only one node runs MySQL at a time. Anche la lettura e la scrittura dalla risorsa DRBD sono limitate a un solo nodo alla volta.Reading and writing from the DRBD resource is also limited to only one node at a time.

Non è necessaria una soluzione IP virtuale come LVS, in quanto si useranno i set con carico bilanciato in Microsoft Azure per garantire la funzionalità round robin e il rilevamento dell'endpoint, la rimozione e il ripristino gestito automaticamente dell'indirizzo VIP.There's no need for a VIP solution like LVS, because you'll use load-balanced sets in Microsoft Azure to provide round-robin functionality and endpoint detection, removal, and graceful recovery of the VIP. L'indirizzo VIP è un indirizzo IPv4 instradabile a livello globale assegnato da Microsoft Azure durante la creazione del servizio cloud.The VIP is a globally routable IPv4 address assigned by Microsoft Azure when you first create the cloud service.

È possibile usare altre architetture per MySQL inclusi NBD Cluster, Percona, Galera e varie soluzioni middleware, di cui almeno una disponibile come VM su VM Depot.There are other possible architectures for MySQL, including NBD Cluster, Percona, Galera, and several middleware solutions, including at least one available as a VM on VM Depot. Se le soluzioni possono eseguire la replica su unicast piuttosto che su multicast o trasmissione e non si basano su un archivio condiviso o su più interfacce di rete, gli scenari dovrebbero risultare facili da distribuire su Microsoft Azure.As long as these solutions can replicate on unicast vs. multicast or broadcast and don't rely on shared storage or multiple network interfaces, the scenarios should be easy to deploy on Microsoft Azure.

Queste architetture di clustering possono essere estese ad altri prodotti come PostgreSQL e OpenLDAP in modo simile.These clustering architectures can be extended to other products like PostgreSQL and OpenLDAP in a similar fashion. Questa procedura di bilanciamento del carico senza condivisione è stata ad esempio testata con OpenLDAP multimaster ed è possibile vederne i risultati sul blog di Channel 9.For example, this load-balancing procedure with shared nothing was successfully tested with multi-master OpenLDAP, and you can watch it on our Channel 9 blog.

PreparazioneGet ready

Sono necessarie le risorse e funzionalità seguenti:You need the following resources and abilities:

  • Un account di Microsoft Azure con una sottoscrizione valida, in grado di creare almeno due VM (in questo esempio è stato usato XS)A Microsoft Azure account with a valid subscription, able to create at least two VMs (XS was used in this example)
  • Una rete e una subnetA network and a subnet
  • Un gruppo di affinitàAn affinity group
  • Un set di disponibilitàAn availability set
  • La possibilità di creare dischi rigidi virtuali nella stessa area del servizio cloud e collegarli alle VM LinuxThe ability to create VHDs in the same region as the cloud service and attach them to the Linux VMs

Ambiente testatoTested environment

  • Ubuntu 13.10Ubuntu 13.10
    • DRBDDRBD
    • Server MySQLMySQL Server
    • Corosync e PacemakerCorosync and Pacemaker

Gruppo di affinitàAffinity group

Creare un gruppo di affinità per la soluzione effettuando l'accesso al portale di Azure selezionando impostazionie la creazione di un gruppo di affinità.Create an affinity group for the solution by signing in to the Azure portal, selecting Settings, and creating an affinity group. Le risorse allocate create in seguito verranno assegnate a questo gruppo di affinità.Allocated resources created later will be assigned to this affinity group.

RetiNetworks

Vengono create una nuova rete e una subnet all'interno della rete.A new network is created, and a subnet is created inside the network. Questo esempio usa una rete 10.10.10.0/24 contenente una sola subnet /24.This example uses a 10.10.10.0/24 network with only one /24 subnet inside.

Macchine virtualiVirtual machines

La prima VM Ubuntu 13.10 viene creata con un'immagine della raccolta Ubuntu approvata ed è denominata hadb01.The first Ubuntu 13.10 VM is created by using an Endorsed Ubuntu Gallery image and is called hadb01. Nel processo viene creato un nuovo servizio cloud, denominato hadb.A new cloud service is created in the process, called hadb. Questo nome indica la natura condivisa e con bilanciamento del carico che il servizio avrà al momento dell'aggiunta di altre risorse.This name illustrates the shared, load-balanced nature that the service will have when more resources are added. La creazione di hadb01 è molto semplice e la si esegue mediante il portale.The creation of hadb01 is uneventful and completed by using the portal. Viene creato automaticamente un endpoint per SSH e viene selezionata la nuova rete.An endpoint for SSH is automatically created, and the new network is selected. Ora è possibile creare un set di disponibilità per le VM.Now you can create an availability set for the VMs.

Dopo aver creato la prima VM (tecnicamente quando viene creato il servizio cloud), creare la seconda VM, hadb02.After the first VM is created (technically, when the cloud service is created), create the second VM, hadb02. Anche per la seconda VM si userà una VM Ubuntu 13.10 della raccolta tramite il portale, ma si userà un servizio cloud esistente, hadb.cloudapp.net, anziché crearne uno nuovo.For the second VM, use Ubuntu 13.10 VM from the Gallery by using the portal, but use an existing cloud service, hadb.cloudapp.net, instead of creating a new one. La rete e il set di disponibilità dovrebbero essere selezionati automaticamente.The network and availability set should be automatically selected. Verrà anche creato un endpoint SSH.An SSH endpoint will be created, too.

Dopo aver creato entrambe le macchine virtuali, prendere nota della porta SSH per hadb01 (TCP 22) e hadb02 (assegnata automaticamente da Azure).After both VMs have been created, take note of the SSH port for hadb01 (TCP 22) and hadb02 (automatically assigned by Azure).

Archivio collegatoAttached storage

Collegare un nuovo disco a entrambe le VM e creare nuovi dischi da 5 GB durante il processo.Attach a new disk to both VMs and create 5-GB disks in the process. I dischi sono ospitati nel contenitore del disco rigido virtuale in uso per i dischi del sistema operativo principale.The disks are hosted in the VHD container in use for your main operating system disks. Dopo la creazione e il collegamento dei dischi non è necessario riavviare Linux, in quanto il kernel rileva il nuovo dispositivo.After disks are created and attached, there is no need to restart Linux because the kernel will see the new device. Questo dispositivo è in genere /dev/sdc.This device is usually /dev/sdc. Controllare l'output di dmesg.Check dmesg for the output.

In ogni VM creare una nuova partizione usando cfdisk (partizione primaria Linux) e scrivendo la nuova tabella di partizione.On each VM, create a partition by using cfdisk (primary, Linux partition) and write the new partition table. Non creare un file system in questa partizione.Do not create a file system on this partition.

Configurazione del clusterSet up the cluster

Usare APT per installare Corosync, Pacemaker e DRBD su entrambe le VM Ubuntu.Use APT to install Corosync, Pacemaker, and DRBD on both Ubuntu VMs. Per farlo con apt-get, eseguire il codice seguente:To do so with apt-get, run the following code:

sudo apt-get install corosync pacemaker drbd8-utils.

Non installare MySQL a questo punto.Do not install MySQL at this time. Gli script di installazione Debian e Ubuntu inizializzeranno una directory di dati MySQL in /var/lib/mysql, ma poiché la directory verrà sostituita da un file system DRBD, è necessario installare MySQL.Debian and Ubuntu installation scripts will initialize a MySQL data directory on /var/lib/mysql, but because the directory will be superseded by a DRBD file system, you need to install MySQL later.

Verificare (con /sbin/ifconfig) che entrambe le macchine virtuali usino indirizzi della subnet 10.10.10.0/24 e che siano in grado di eseguire il ping reciprocamente in base al nome.Verify (by using /sbin/ifconfig) that both VMs are using addresses in the 10.10.10.0/24 subnet and that they can ping each other by name. È anche possibile usare ssh-keygen e ssh-copy-id per verificare che entrambe le macchine virtuali siano in grado di comunicare tramite SSH senza che sia necessaria una password.You can also use ssh-keygen and ssh-copy-id to make sure both VMs can communicate via SSH without requiring a password.

Configurare DRBDSet up DRBD

Creare una risorsa DRBD che usa la partizione /dev/sdc1 sottostante per produrre una risorsa /dev/drbd1 che possa essere formattata con ext3 e usata in nodi primari e secondari.Create a DRBD resource that uses the underlying /dev/sdc1 partition to produce a /dev/drbd1 resource that can be formatted by using ext3 and used in both primary and secondary nodes.

  1. Aprire /etc/drbd.d/r0.res e copiare la definizione di risorsa seguente in entrambe le VM:Open /etc/drbd.d/r0.res and copy the following resource definition on both VMs:

     resource r0 {
       on `hadb01` {
         device  /dev/drbd1;
         disk   /dev/sdc1;
         address  10.10.10.4:7789;
         meta-disk internal;
       }
       on `hadb02` {
         device  /dev/drbd1;
         disk   /dev/sdc1;
         address  10.10.10.5:7789;
         meta-disk internal;
       }
     }
    
  2. Inizializzare la risorsa utilizzando drbdadm in entrambe le VM:Initialize the resource by using drbdadm on both VMs:

     sudo drbdadm -c /etc/drbd.conf role r0
     sudo drbdadm up r0
    
  3. Sulla VM primaria (hadb01) forzare la proprietà (primaria) della risorsa DRBD:On the primary VM (hadb01), force ownership (primary) of the DRBD resource:

     sudo drbdadm primary --force r0
    

A questo punto, nel contenuto di /proc/drbd (sudo cat /proc/drbd) su entrambe le macchine virtuali, dovrebbe essere presente Primary/Secondary su hadb01 e Secondary/Primary su hadb02, coerentemente con la soluzione.If you examine the contents of /proc/drbd (sudo cat /proc/drbd) on both VMs, you should see Primary/Secondary on hadb01 and Secondary/Primary on hadb02, consistent with the solution at this point. Il disco da 5 GB viene sincronizzato sulla rete 10.10.10.0/24 senza costi per i clienti.The 5-GB disk is synchronized over the 10.10.10.0/24 network at no charge to customers.

Quando il disco è sincronizzato, è possibile creare il file system su hadb01.After the disk is synchronized, you can create the file system on hadb01. Per le operazioni di test è stato usato ext2, ma il codice seguente crea un file system ext3:For testing purposes, we used ext2, but the following code will create an ext3 file system:

mkfs.ext3 /dev/drbd1

Montare la risorsa DRBDMount the DRBD resource

Ora è possibile montare le risorse DRBD in hadb01.You're now ready to mount the DRBD resources on hadb01. Debian e i derivati usano /var/lib/mysql come directory dei dati di MySQL.Debian and derivatives use /var/lib/mysql as MySQL's data directory. Poiché MySQL non è installato, creare la directory e montare la risorsa DRBD.Because you haven't installed MySQL, create the directory and mount the DRBD resource. Per eseguire questa opzione, eseguire il codice seguente su hadb01:To perform this option, run the following code on hadb01:

sudo mkdir /var/lib/mysql
sudo mount /dev/drbd1 /var/lib/mysql

Configurare MySQLSet up MySQL

A questo punto si può installare MySQL su hadb01:Now you're ready to install MySQL on hadb01:

sudo apt-get install mysql-server

Per hadb02sono disponibili due opzioni.For hadb02, you have two options. È possibile installare mysql-server creando in questo modo /var/lib/mysql, inserirvi una nuova directory dati e poi rimuovere i contenuti.You can install mysql-server, which will create /var/lib/mysql, fill it with a new data directory, and then remove the contents. Per eseguire questa opzione, eseguire il codice seguente su hadb02:To perform this option, run the following code on hadb02:

sudo apt-get install mysql-server
sudo service mysql stop
sudo rm –rf /var/lib/mysql/*

La seconda opzione è eseguire il failover su hadb02 e quindi installare mysql-server là.The second option is to failover to hadb02 and then install mysql-server there. Gli script di installazione rileveranno l'installazione esistente e non la toccheranno.Installation scripts will notice the existing installation and won't touch it.

Eseguire il codice seguente in hadb01:Run the following code on hadb01:

sudo drbdadm secondary –force r0

Eseguire il codice seguente in hadb02:Run the following code on hadb02:

sudo drbdadm primary –force r0
sudo apt-get install mysql-server

Se non si prevede di eseguire il failover di DRBD a questo punto, la prima opzione è più semplice, anche se meno elegante.If you don't plan to failover DRBD now, the first option is easier although arguably less elegant. Al termine della configurazione, è possibile iniziare a lavorare sul database MySQL.After you set this up, you can start working on your MySQL database. Eseguire il codice seguente in hadb02 (o su qualsiasi server attivo, in base a DRBD):Run the following code on hadb02 (or whichever one of the servers is active, according to DRBD):

mysql –u root –p
CREATE DATABASE azureha;
CREATE TABLE things ( id SERIAL, name VARCHAR(255) );
INSERT INTO things VALUES (1, "Yet another entity");
GRANT ALL ON things.\* TO root;

Avviso

Quest'ultima istruzione disabilita in modo efficace l'autenticazione per l'utente ROOT in questa tabella.This last statement effectively disables authentication for the root user in this table. È consigliabile sostituirla con istruzioni GRANT di livello di produzione ed è inclusa solo per scopi esplicativi.This should be replaced by your production-grade GRANT statements and is included only for illustrative purposes.

Se si vuole eseguire query dall'esterno delle VM, che è lo scopo di questa guida, occorre anche abilitare le connessioni di rete per MySQL.If you want to make queries from outside the VMs (which is the purpose of this guide), you also need to enable networking for MySQL. In entrambe le VM aprire /etc/mysql/my.cnf e passare a bind-address.On both VMs, open /etc/mysql/my.cnf and go to bind-address. Cambiare l'indirizzo da 127.0.0.1 in 0.0.0.0.Change the address from 127.0.0.1 to 0.0.0.0. Dopo aver salvato il file, inviare un comando sudo service mysql restart al nodo primario corrente.After saving the file, issue a sudo service mysql restart on your current primary.

Creare il set con carico bilanciato di MySQLCreate the MySQL load-balanced set

Tornare al portale, passare a hadb01 e scegliere Endpoint.Go back to the portal, go to hadb01, and choose Endpoints. Per creare un endpoint, scegliere MySQL (TCP 3306) dall'elenco a discesa e selezionare Crea nuovo con carico bilanciato.To create an endpoint, choose MySQL (TCP 3306) from the drop-down list and select Create new load balanced set. Assegnare un nome all'endpoint con carico bilanciato lb-mysql.Name the load-balanced endpoint lb-mysql. Impostare Tempo su 5 secondi, come valore minimo.Set Time to 5 seconds, minimum.

Dopo aver creato l'endpoint, passare a hadb02, selezionare Endpoint e creare un endpoint.After you create the endpoint, go to hadb02, choose Endpoints, and create an endpoint. Scegliere lb-mysql, quindi selezionare MySQL dall'elenco a discesa.Choose lb-mysql, and then select MySQL from the drop-down list. È anche possibile usare CLI di Azure per questo passaggio.You can also use the Azure CLI for this step.

Ora si ha tutto l'occorrente per il funzionamento manuale del cluster.You now have everything you need for manual operation of the cluster.

Eseguire test sul set con carico bilanciatoTest the load-balanced set

I test possono essere eseguiti da un computer esterno usando qualsiasi client MySQL oppure con alcune applicazioni come phpMyAdmin in esecuzione come sito Web di Azure.Tests can be performed from an outside machine by using any MySQL client, or by using certain applications, like phpMyAdmin running as an Azure website. In questo caso è stato usato lo strumento da riga di comando di MySQL su un'altra casella di Linux:In this case, you used MySQL's command-line tool on another Linux box:

mysql azureha –u root –h hadb.cloudapp.net –e "select * from things;"

Failover manualeManually failing over

È possibile simulare il failover chiudendo MySQL, passando al nodo primario di DRBD e riavviando MySQL.You can simulate failovers by shutting down MySQL, switching DRBD's primary, and starting MySQL again.

Per eseguire questa attività, eseguire il codice seguente in hadb01:To perform this task, run the following code on hadb01:

service mysql stop && umount /var/lib/mysql ; drbdadm secondary r0

Quindi, in hadb02:Then, on hadb02:

drbdadm primary r0 ; mount /dev/drbd1 /var/lib/mysql && service mysql start

Dopo aver eseguito il failover manuale, è possibile ripetere la query remota, che dovrebbe funzionare perfettamente.After you fail over manually, you can repeat your remote query and it should work perfectly.

Configurare CorosyncSet up Corosync

Corosync è l'infrastruttura di cluster sottostante necessaria per il funzionamento di Pacemaker.Corosync is the underlying cluster infrastructure required for Pacemaker to work. Per Heartbeat (e altre metodologie come Ultramonkey), Corosync è una parte delle funzionalità CRM, mentre Pacemaker rimane più simile ad Heartbeat per funzionalità.For Heartbeat (and other methodologies like Ultramonkey), Corosync is a split of the CRM functionalities, while Pacemaker remains more similar to Heartbeat in functionality.

Il vincolo principale per Corosync su Azure sta nel fatto che Corosync preferisce il multicast alla trasmissione su comunicazioni unicast, mentre le reti Microsoft Azure supportano solo l'unicast.The main constraint for Corosync on Azure is that Corosync prefers multicast over broadcast over unicast communications, but Microsoft Azure networking only supports unicast.

Fortunatamente Corosync include una modalità di lavoro unicast.Fortunately, Corosync has a working unicast mode. L'unico vero vincolo è che, poiché i nodi non comunicano tutti tra loro, è necessario definire i nodi nei file di configurazione, incluso l'indirizzo IP.The only real constraint is that because all nodes are not communicating among themselves, you need to define the nodes in your configuration files, including their IP addresses. È possibile usare i file di esempio di Corosync per Unicast, cambiare l'indirizzo di associazione, l'elenco dei nodi e le directory di registrazione (Ubuntu usa /var/log/corosync mentre i file di esempio usano /var/log/cluster) e abilitare gli strumenti del quorum.We can use the Corosync example files for Unicast and change bind address, node lists, and logging directories (Ubuntu uses /var/log/corosync while the example files use /var/log/cluster), and enable quorum tools.

Nota

Usare la seguente direttiva transport: udpu e gli indirizzi IP definiti manualmente per entrambi i nodi.Use the following transport: udpu directive and the manually defined IP addresses for both nodes.

Eseguire il codice seguente in /etc/corosync/corosync.conf per entrambi i nodi:Run the following code on /etc/corosync/corosync.conf for both nodes:

totem {
  version: 2
  crypto_cipher: none
  crypto_hash: none
  interface {
    ringnumber: 0
    bindnetaddr: 10.10.10.0
    mcastport: 5405
    ttl: 1
  }
  transport: udpu
}

logging {
  fileline: off
  to_logfile: yes
  to_syslog: yes
  logfile: /var/log/corosync/corosync.log
  debug: off
  timestamp: on
  logger_subsys {
    subsys: QUORUM
    debug: off
    }
  }

nodelist {
  node {
    ring0_addr: 10.10.10.4
    nodeid: 1
  }

  node {
    ring0_addr: 10.10.10.5
    nodeid: 2
  }
}

quorum {
  provider: corosync_votequorum
}

Copiare il file di configurazione in entrambe le VM e avviare Corosync in entrambi i nodi:Copy this configuration file on both VMs and start Corosync in both nodes:

sudo service start corosync

Poco dopo aver avviato il servizio, dovrebbe venire stabilito il cluster nell'anello corrente e il quorum dovrebbe essere costituito.Shortly after starting the service, the cluster should be established in the current ring, and quorum should be constituted. Per verificare questa funzionalità, controllare i log oppure eseguire il codice seguente:We can check this functionality by reviewing logs or by running the following code:

sudo corosync-quorumtool –l

L'output sarà simile all'immagine seguente:You will see output similar to the following image:

output di esempio di corosync-quorumtool -l

Configurare PacemakerSet up Pacemaker

Pacemaker usa il cluster per monitorare le risorse, definire quando i nodi primari diventano inattivi e passare le risorse ai nodi secondari.Pacemaker uses the cluster to monitor for resources, define when primaries go down, and switch those resources to secondaries. Le risorse possono essere definite da un set di script disponibili o da script LSB (simili all'inizializzazione), tra le altre possibilità.Resources can be defined from a set of available scripts or from LSB (init-like) scripts, among other choices.

Si vuole che Pacemaker "possegga" la risorsa DRBD, il punto di montaggio e il servizio MySQL.We want Pacemaker to "own" the DRBD resource, the mount point, and the MySQL service. Se Pacemaker è in grado di attivare e disattivare DRBD, montarlo e smontarlo, quindi avviare e interrompere MySQL nell'ordine corretto in caso di errori del nodo primario, e la configurazione è completa.If Pacemaker can turn on and off DRBD, mount and unmount it, and then start and stop MySQL in the right order when something bad happens with the primary, setup is complete.

Quando si installa Pacemaker per la prima volta, la configurazione dovrebbe essere molto semplice, come:When you first install Pacemaker, your configuration should be simple enough, something like:

node $id="1" hadb01
  attributes standby="off"
node $id="2" hadb02
  attributes standby="off"
  1. Controllare la configurazione eseguendo sudo crm configure show.Check the configuration by running sudo crm configure show.
  2. Quindi creare un file (ad esempio /tmp/cluster.conf) con le risorse seguenti:Then create a file (like /tmp/cluster.conf) with the following resources:

     primitive drbd_mysql ocf:linbit:drbd \
           params drbd_resource="r0" \
           op monitor interval="29s" role="Master" \
           op monitor interval="31s" role="Slave"
    
     ms ms_drbd_mysql drbd_mysql \
           meta master-max="1" master-node-max="1" \
             clone-max="2" clone-node-max="1" \
             notify="true"
    
     primitive fs_mysql ocf:heartbeat:Filesystem \
           params device="/dev/drbd/by-res/r0" \
           directory="/var/lib/mysql" fstype="ext3"
    
     primitive mysqld lsb:mysql
    
     group mysql fs_mysql mysqld
    
     colocation mysql_on_drbd \
            inf: mysql ms_drbd_mysql:Master
    
     order mysql_after_drbd \
            inf: ms_drbd_mysql:promote mysql:start
    
     property stonith-enabled=false
    
     property no-quorum-policy=ignore
    
  3. Caricare il file nella configurazione.Load the file into the configuration. È sufficiente eseguire questa operazione in un solo nodo.You only need to do this in one node.

     sudo crm configure
       load update /tmp/cluster.conf
       commit
       exit
    
  4. Controllare che Pacemaker si avvii al momento giusto in entrambi i nodi:Make sure that Pacemaker starts at boot in both nodes:

     sudo update-rc.d pacemaker defaults
    
  5. Mediante sudo crm_mon –L verificare che uno dei nodi sia diventato il master del cluster, in cui sono eseguite tutte le risorse.By using sudo crm_mon –L, verify that one of your nodes has become the master for the cluster and is running all the resources. È possibile usare mount e ps per verificare che le risorse siano in esecuzione.You can use mount and ps to check that the resources are running.

La schermata seguente mostra crm_mon con un nodo arrestato (uscire con CTRL+C):The following screenshot shows crm_mon with one node stopped (exit by selecting Ctrl+C):

Nodo crm_mon arrestato

Questa schermata mostra entrambi i nodi, uno master e uno slave:This screenshot shows both nodes, one master and one slave:

Master/slave operativo crm_mon

TestTesting

Ora è possibile eseguire una simulazione del failover automatico.You're ready for an automatic failover simulation. È possibile procedere in due modi: con un soft mount e con un hard mount.There are two ways to do this: soft and hard.

Il metodo soft mount prevede l'uso della funzione di arresto del cluster: crm_standby -U `uname -n` -v on.The soft way uses the cluster's shutdown function: crm_standby -U `uname -n` -v on. Se la si usa sul master, subentra lo slave.If you use this on the master, the slave takes over. Ricordare di disattivarla nuovamente.Remember to set this back to off. In caso contrario, crm_mon mostrerà un solo nodo in standby.If you don't, crm_mon will show one node on standby.

Il metodo "forte" è arrestare la VM primaria (hadb01) mediante il portalr o cambiare il runlevel sulla VM (ovvero halt, shutdown).The hard way is shutting down the primary VM (hadb01) via the portal or by changing the runlevel on the VM (that is, halt, shutdown). Questo aiuta Corosync e Pacemaker segnalando che il master si sta arrestando.This helps Corosync and Pacemaker by signaling that the master's going down. È possibile testare questa funzionalità (utile per le finestre di manutenzione) ma anche forzare lo scenario bloccando la VM.You can test this (useful for maintenance windows), but you can also force the scenario by freezing the VM.

STONITHSTONITH

Dovrebbe risultare possibile causare la chiusura di una macchina virtuale tramite l'interfaccia della riga di comando di Azure per Linux anziché eseguire uno script STONITH che controlla un dispositivo fisico.It should be possible to issue a VM shutdown via the Azure CLI in lieu of a STONITH script that controls a physical device. È possibile usare /usr/lib/stonith/plugins/external/ssh come base e abilitare STONITH nella configurazione del cluster.You can use /usr/lib/stonith/plugins/external/ssh as a base and enable STONITH in the cluster's configuration. L'interfaccia della riga di comando di Azure deve essere installata a livello globale e le impostazioni e il profilo di pubblicazione devono essere caricati per l'utente del cluster.Azure CLI should be globally installed, and the publish settings and profile should be loaded for the cluster's user.

Esempi di codice per la risorsa sono disponibili in GitHub.Sample code for the resource is available on GitHub. Modificare la configurazione del cluster aggiungendo il codice seguente a sudo crm configure:Change the cluster's configuration by adding the following to sudo crm configure:

primitive st-azure stonith:external/azure \
  params hostlist="hadb01 hadb02" \
  clone fencing st-azure \
  property stonith-enabled=true \
  commit

Nota

Lo script non esegue controlli up/down.The script doesn't perform up/down checks. La risorsa SSH originale aveva 15 verifiche ping ma il tempo di ripristino per una macchina virtuale di Azure può variare maggiormente.The original SSH resource had 15 ping checks, but recovery time for an Azure VM might be more variable.

LimitazioniLimitations

Si applicano le limitazioni seguenti:The following limitations apply:

  • Lo script della risorsa DRBD linbit che gestisce DRBD come risorsa in Pacemaker usa drbdadm down per chiudere un nodo, anche se il nodo sta passando in modalità standby.The linbit DRBD resource script that manages DRBD as a resource in Pacemaker uses drbdadm down when shutting down a node, even if the node is just going on standby. Questa situazione non è ideale perché lo slave non sincronizza la risorsa DRBD mentre il master riceve le scritture.This is not ideal because the slave will not be synchronizing the DRBD resource while the master gets writes. Se l'arresto del master non avviene con grazia, lo slave può sostituire uno stato del file system meno recente.If the master does not fail graciously, the slave can take over an older file system state. Per questo problema sono possibili due soluzioni:There are two potential ways of solving this:
    • Applicare un drbdadm up r0 in tutti i nodi del cluster tramite un watchdog locale (non appartenente al cluster) oppureEnforcing a drbdadm up r0 in all cluster nodes via a local (not clusterized) watchdog
    • Modificare lo script DRBD linbit per fare in modo che down non venga chiamato in /usr/lib/ocf/resource.d/linbit/drbdEditing the linbit DRBD script, making sure that down is not called in /usr/lib/ocf/resource.d/linbit/drbd
  • Il bilanciamento del carico richiede almeno cinque secondi per rispondere, quindi le applicazioni devono essere compatibili con i cluster ed essere più tolleranti del timeout.The load balancer needs at least five seconds to respond, so applications should be cluster-aware and be more tolerant of timeout. Possono essere utili anche altre architetture, quali le code in-app e i middleware di query.Other architectures, like in-app queues and query middlewares, can also help.
  • L'ottimizzazione di MySQL è necessaria per assicurare che la scrittura venga effettuata con la velocità adeguata e che le cache siano scaricate nel disco il più frequentemente possibile per ridurre al minimo le perdite di memoria.MySQL tuning is necessary to ensure that writing is done at a manageable pace and caches are flushed to disk as frequently as possible to minimize memory loss.
  • Le prestazioni delle operazioni di scrittura dipendono dall'interconnessione delle VM nel commutatore virtuale, in quanto questo è il meccanismo utilizzato da DRBD per replicare il dispositivo.Write performance is dependent in VM interconnect in the virtual switch because this is the mechanism used by DRBD to replicate the device.