Agrupamento MariaDB (MySQL): Tutorial Azure

Importante

Os VM clássicos serão retirados a 1 de março de 2023.

Se utilizar recursos iaaS da ASM, por favor preencha a sua migração até 1 de março de 2023. Encorajamo-lo a fazer a troca mais cedo para aproveitar as muitas melhorias de funcionalidades em Azure Resource Manager.

Para mais informações, consulte a Migração dos seus recursos iaaS para a Azure Resource Manager até 1 de março de 2023.

Nota

O Azure tem dois modelos de implementação diferentes para criar e trabalhar com recursos: Azure Resource Manager e clássico. Este artigo abrange o modelo de implementação clássica. A Microsoft recomenda que a maioria das novas implementações utilizem o modelo Azure Resource Manager.

Nota

O cluster MariaDB Enterprise está agora disponível no Azure Marketplace. A nova oferta irá implantar automaticamente um cluster MariaDB Galera na Azure Resource Manager. Devias usar a nova oferta da Azure Marketplace.

Este artigo mostra-lhe como criar um cluster multi-Master Galera de MariaDBs (uma substituição robusta, escalável e fiável para o MySQL) para trabalhar num ambiente altamente disponível em máquinas virtuais Azure.

Descrição geral da arquitetura

Este artigo descreve como completar os seguintes passos:

  • Criar um aglomerado de três nós.
  • Separe os discos de dados do disco so.
  • Crie os discos de dados na definição RAID-0/listrado para aumentar o IOPS.
  • Utilize Balanceador de Carga do Azure para equilibrar a carga dos três nós.
  • Para minimizar o trabalho repetitivo, crie uma imagem VM que contenha MariaDB + Galera e use-a para criar os outros VMs de cluster.

Arquitetura do sistema

Nota

Este tópico utiliza as ferramentas Azure CLI , por isso certifique-se de descarregá-las e conectá-las à sua assinatura Azure de acordo com as instruções. Se necessitar de uma referência aos comandos disponíveis no CLI Azure, consulte a referência de comando do Azure CLI. Também terá de criar uma chave SSH para autenticação e tomar nota da localização do ficheiro .pem.

Criar o modelo

Infraestrutura

  1. Criar um grupo de afinidade para manter os recursos juntos.

     azure account affinity-group create mariadbcluster --location "North Europe" --label "MariaDB Cluster"
    
  2. Crie uma rede virtual

     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. Crie uma conta de armazenamento para hospedar todos os nossos discos. Não deve colocar mais de 40 discos fortemente utilizados na mesma conta de armazenamento para evitar atingir o limite de 20.000 conta de armazenamento IOPS. Neste caso, estás muito abaixo desse limite, por isso vais guardar tudo na mesma conta para a simplicidade.

     azure storage account create mariadbstorage --label mariadbstorage --affinity-group mariadbcluster
    
  4. Encontre o nome da imagem da máquina virtual CentOS 7.

     azure vm image list | findstr CentOS
    

    A saída será algo como 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20140926.

    Use este nome no passo seguinte.

  5. Crie o modelo VM e substitua /caminho/para/key.pem pelo caminho onde guardou a tecla gerada .pem SSH.

     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. Fixe quatro discos de dados de 500 GB ao VM para utilização na configuração RAID.

     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. Utilize o SSH para iniciar súm no modelo VM que criou no mariadbhatemplate.cloudapp.net:22 e conecte-se utilizando a sua chave privada.

Software

  1. Pegue a raiz.

     sudo su
    
  2. Instale suporte RAID:

    a. Instale o mdadm.

           yum install mdadm
    

    b. Crie a configuração RAID0/stripe com um sistema de ficheiros EXT4.

           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. Crie o diretório do ponto de montagem.

           mkdir /mnt/data
    

    d. Recupere o UUID do dispositivo RAID recém-criado.

           blkid | grep /dev/md0
    

    e. Editar /etc/fstab.

           vi /etc/fstab
    

    f. Adicione o dispositivo para permitir a montagem automática no reboot, substituindo o UUID pelo valor obtido a partir do comando blkid anterior.

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

    exemplo, Monte a nova divisória.

           mount /mnt/data
    
  3. Instale a MariaDB.

    a. Crie o ficheiro MariaDB.repo.

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

    b. Encha o ficheiro de repo com o seguinte conteúdo:

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

    c. Para evitar conflitos, remova os postfixs existentes e as mariadb-libs.

        yum remove postfix mariadb-libs-*
    

    d. Instale a MariaDB com a Galera.

        yum install MariaDB-Galera-server MariaDB-client galera
    
  4. Mova o diretório de dados MySQL para o dispositivo de bloqueio RAID.

    a. Copie o diretório mySQL atual para a sua nova localização e remova o antigo diretório.

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

    b. Desa estada permissões para o novo diretório em conformidade.

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

    c. Crie um symlink que aponta o antigo diretório para o novo local na partição RAID.

        ln -s /mnt/data/mysql /var/lib/mysql
    
  5. Como o SELinux interfere com as operações de cluster, é necessário desativá-lo para a sessão atual. Editar /etc/selinux/config para desativá-lo para posterior reinício.

         setenforce 0
    
         then editing `/etc/selinux/config` to set `SELINUX=permissive`
    
  6. Validar as execuções mySQL.

    a. Comece o MySQL.

        service mysql start
    

    b. Proteja a instalação MySQL, desacrie a palavra-passe raiz, remova utilizadores anónimos para desativar o login remoto e remova a base de dados de teste.

        mysql_secure_installation
    

    c. Crie um utilizador na base de dados para operações de cluster e opcionalmente para as suas aplicações.

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

    d. Pare o MySQL.

         service mysql stop
    
  7. Crie um espaço reservado de configuração.

    a. Edite a configuração MySQL para criar um espaço reservado para as definições do cluster. Não substitua o <Variables> ou descomprometa agora. Isso acontecerá depois de criar um VM a partir deste modelo.

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

    b. Edite a secção de galera e limpe-a.

    c. Editar a secção [mariadb ].

        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. Abra as portas necessárias na firewall utilizando firewalld no CentOS 7.

    • MySQl: firewall-cmd --zone=public --add-port=3306/tcp --permanent
    • GALERA: firewall-cmd --zone=public --add-port=4567/tcp --permanent
    • GALERA IST: firewall-cmd --zone=public --add-port=4568/tcp --permanent
    • RSYNC: firewall-cmd --zone=public --add-port=4444/tcp --permanent
    • Recarregar a firewall: firewall-cmd --reload
  9. Otimize o sistema para o desempenho. Para mais informações, consulte a estratégia de afinação de desempenho.

    a. Editar novamente o ficheiro de configuração MySQL.

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

    b. Editar a secção [mariadb] e anexar o seguinte conteúdo:

    Nota

    Recomendamos que innodb_buffer_pool_size seja 70% da memória do seu VM. Neste exemplo, foi fixado em 2,45 GB para o Azure VM médio com 3,5 GB de 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. Pare o MySQL, desative o serviço MySQL de funcionamento no arranque para evitar perturbar o cluster ao adicionar um nó e desprovisionar a máquina.

     service mysql stop
     chkconfig mysql off
     waagent -deprovision
    
  11. Capture o VM através do portal. (Atualmente, a edição nº 1268 nas ferramentas Azure CLI descreve o facto de as imagens capturadas pelas ferramentas Azure CLI não capturarem os discos de dados anexados.)

    a. Desligue a máquina através do portal.

    b. Clique em Capturar e especifique o nome da imagem como imagem mariadb-galera. Forneça uma descrição e verifique "Eu tenho corrido waagent."

    Capture a máquina virtual

Criar o cluster

Crie três VMs com o modelo que criou e, em seguida, configuure e inicie o cluster.

  1. Crie o primeiro CentOS 7 VM a partir da imagem mariadb-galera que criou, fornecendo as seguintes informações:
  • Nome da rede virtual: mariadbvnet

  • Sub-rede: mariadb

  • Tamanho da máquina: médio

  • Nome do serviço em nuvem: mariadbha (ou qualquer nome que queira ser acedido através de mariadbha.cloudapp.net)

  • Nome da máquina: mariadb1

  • Nome de utilizador: azureuser

  • Acesso SSH: ativado

  • Passando o certificado SSH .pem file e substituindo /path/to/key.pem pelo caminho onde guardou a tecla gerada .pem SSH.

    Nota

    Os seguintes comandos são divididos sobre várias linhas para maior clareza, mas deve introduzir cada uma como uma linha.

     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
    
  1. Crie mais duas máquinas virtuais ligando-as ao serviço de nuvem mariadbha. Mude o nome VM e a porta SSH para uma porta única que não esteja em conflito com outros VMs no mesmo serviço de nuvem.

     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
    

Para 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
  1. Você precisará obter o endereço IP interno de cada um dos três VMs para o próximo passo:

    Obtenção de endereço IP

  2. Utilize o SSH para iniciar sessão nos três VMs e editar o ficheiro de configuração em cada um deles.

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

    Descompromisso wsrep_cluster_name e wsrep_cluster_address removendo o # início da linha. Adicionalmente, substitua <ServerIP> dentro wsrep_node_address e <NodeName> dentro wsrep_node_name pelo endereço e nome IP do VM, respectivamente, e descoduça essas linhas também.

  3. Inicie o cluster na MariaDB1 e deixe-o funcionar no arranque.

     sudo service mysql bootstrap
     chkconfig mysql on
    
  4. Inicie o MySQL na MariaDB2 e na MariaDB3 e deixe-o funcionar no arranque.

     sudo service mysql start
     chkconfig mysql on
    

Equilibrar o cluster

Quando criou os VMs agrupados, adicionou-os a um conjunto de disponibilidade chamado clusteravset para garantir que foram colocados em diferentes domínios de falha e atualização e que o Azure nunca faz manutenção em todas as máquinas ao mesmo tempo. Esta configuração satisfaz os requisitos a suportar pelo acordo de nível de serviço Azure (SLA).

Agora use Balanceador de Carga do Azure para equilibrar pedidos entre os três nós.

Executar os seguintes comandos na sua máquina utilizando o Azure CLI.

A estrutura dos parâmetros de comando é: 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

O CLI define o intervalo da sonda do balançador de carga para 15 segundos, o que pode ser um pouco longo. Altere-o no portal em Pontos finais para qualquer um dos VMs.

Editar ponto final

Selecione reconfigurar o conjunto de Load-Balanced.

Reconfigurar o conjunto equilibrado de carga

Altere o intervalo de sonda para 5 segundos e guarde as suas alterações.

Alterar intervalo de sonda

Validar o cluster

O trabalho árduo está feito. O cluster deve agora estar acessível, mariadbha.cloudapp.net:3306o que atinge o equilibrador de carga e os pedidos de rota entre os três VMs de forma suave e eficiente.

Use o seu cliente MySQL favorito para ligar ou ligar de um dos VMs para verificar se este cluster está funcionando.

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

Em seguida, crie uma base de dados e povoe-a com alguns dados.

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;

A base de dados que criou devolve a seguinte tabela:

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

Passos seguintes

Neste artigo, criou um cluster MariaDB + Galera altamente disponível em máquinas virtuais Azure que executam o CentOS 7. Os VMs são carregados equilibrados com Balanceador de Carga do Azure.

Você pode querer olhar para outra forma de agrupar MySQL em Linux e formas de otimizar e testar o desempenho do MySQL em VMs Azure Linux.