WHM e cPanel são sem dúvida o painel de controle de hospedagem mais popular para ambientes baseados em Linux. Ele suporta vários back-ends de banco de dados - MySQL, MariaDB e PostgreSQL como armazenamento de dados do aplicativo. O WHM suporta apenas configurações de banco de dados independentes e você pode implantá-lo localmente (configuração padrão) ou remotamente, integrando-se a um servidor de banco de dados externo. O último seria melhor se você deseja ter uma melhor distribuição de carga, pois o WHM/cPanel lida com vários processos e aplicativos como HTTP(S), FTP, DNS, MySQL e outros.
Nesta postagem do blog, mostraremos como integrar uma configuração de replicação MySQL externa no WHM de forma transparente, para melhorar a disponibilidade do banco de dados e descarregar o servidor de hospedagem WHM/cPanel. Provedores de hospedagem que executam o MySQL localmente no servidor WHM saberiam como o MySQL é exigente em termos de utilização de recursos (dependendo do número de contas que hospeda e das especificações do servidor).
Replicação MySQL em WHM/cPanel
Por padrão, o WHM suporta nativamente MariaDB e MySQL como uma configuração autônoma. Você pode anexar um servidor MySQL externo ao WHM, mas ele atuará como um host autônomo. Além disso, os usuários do cPanel precisam saber o endereço IP do servidor MySQL e especificar manualmente o host externo em seu aplicativo da web se esse recurso estiver ativado.
Nesta postagem do blog, usaremos o arquivo de soquete ProxySQL UNIX para enganar o WHM/cPanel na conexão com o servidor MySQL externo por meio do arquivo de soquete UNIX. Dessa forma, você terá a sensação de executar o MySQL localmente para que os usuários possam usar "localhost" com a porta 3306 como seu host de banco de dados MySQL.
O diagrama a seguir ilustra a arquitetura final:
Estamos tendo um novo servidor WHM, instalado com WHM/cPanel 80.0 (build 18). Em seguida, temos outros três servidores - um para ClusterControl e dois para replicação mestre-escravo. O ProxySQL será instalado no próprio servidor WHM.
Implantando a replicação do MySQL
No momento da redação deste artigo, estamos usando o WHM 80.0 (build 18) que suporta apenas MySQL 5.7 e MariaDB 10.3. Neste caso, vamos usar o MySQL 5.7 da Oracle. Assumimos que você já instalou o ClusterControl no servidor ClusterControl.
Em primeiro lugar, configure o SSH sem senha do servidor ClusterControl para os servidores de replicação MySQL. No servidor ClusterControl, faça:
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Verifique se você pode executar o seguinte comando no ClusterControl sem prompt de senha no meio:
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Em seguida, vá para ClusterControl -> Deploy -> MySQL Replication e insira as informações necessárias. Na segunda etapa, escolha Oracle como fornecedor e 5.7 como versão do banco de dados:
Em seguida, especifique o endereço IP do mestre e do escravo:
Preste atenção ao tique verde logo antes do endereço IP. Isso significa que o ClusterControl pode se conectar ao servidor e está pronto para a próxima etapa. Clique em Implantar para iniciar a implantação. O processo de implantação deve levar de 15 a 20 minutos.
Implantando ProxySQL no WHM/cPanel
Como queremos que o ProxySQL assuma a porta padrão 3306 do MySQL, primeiro temos que modificar o servidor MySQL existente instalado pelo WHM para ouvir outra porta e outro arquivo de soquete. Em /etc/my.cnf, modifique as seguintes linhas (adicione-as se não existirem):
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Em seguida, reinicie o servidor MySQL no servidor cPanel:
$ systemctl restart mysqld
Neste ponto, o servidor MySQL local deve estar escutando na porta 3307, vinculado apenas ao host local (nós o fechamos do acesso externo para ser mais seguro). Agora podemos prosseguir com a implantação do ProxySQL no host WHM, 192.168.0.16 via ClusterControl.
Primeiro, configure o SSH sem senha do nó ClusterControl para o servidor WHM no qual queremos instalar o ProxySQL:
(clustercontrol)$ ssh-copy-id [email protected]
Verifique se você pode executar o seguinte comando no ClusterControl sem prompt de senha no meio:
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Em seguida, vá para ClusterControl -> Manage -> Load Balancers -> ProxySQL -> Deploy ProxySQL e especifique as informações necessárias:
Preencha todos os detalhes necessários, conforme destacado pelas setas acima no diagrama. O endereço do servidor é o servidor WHM, 192.168.0.16. A porta de escuta é 3306 no servidor WHM, assumindo o MySQL local que já está rodando na porta 3307. Mais abaixo, especificamos a senha do administrador do ProxySQL e dos usuários de monitoramento. Em seguida, inclua os dois servidores MySQL no conjunto de balanceamento de carga e escolha "Não" na seção Transações implícitas. Clique em Implantar ProxySQL para iniciar a implantação.
Nosso ProxySQL agora está instalado e configurado com dois grupos de hosts para Replicação MySQL. Um para o grupo de escritores (hostgroup 10), onde todas as conexões serão encaminhadas para o master e o grupo de leitores (hostgroup 20) para todas as cargas de trabalho somente leitura que serão balanceadas para ambos os servidores MySQL.
O próximo passo é conceder o usuário root do MySQL e importá-lo para o ProxySQL. Ocasionalmente, o WHM de alguma forma se conecta ao banco de dados via conexão TCP, ignorando o arquivo de soquete UNIX. Nesse caso, temos que permitir o acesso root do MySQL de [email protected] e [email protected] (o endereço IP do servidor WHM) em nosso cluster de replicação.
Assim, é necessário executar a seguinte instrução no servidor mestre (192.168.0.31):
(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;
Em seguida, importe o usuário 'root'@'localhost' do nosso servidor MySQL para o usuário ProxySQL acessando ClusterControl -> Nodes -> escolha o nó ProxySQL -> Users -> Import Users . Você será presenteado com a seguinte caixa de diálogo:
Marque a caixa de seleção [email protected] e clique em Avançar. Nas Configurações do usuário página, escolha hostgroup 10 como o hostgroup padrão para o usuário:
Podemos então verificar se o ProxySQL está sendo executado corretamente no servidor WHM/cPanel usando o seguinte comando:
$ netstat -tulpn | grep -i proxysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 17306/proxysql
tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 17306/proxysql
A porta 3306 é o que o ProxySQL deve escutar para aceitar todas as conexões MySQL. A porta 6032 é a porta de administração do ProxySQL, onde nos conectaremos para configurar e monitorar componentes do ProxySQL como usuários, grupos de hosts, servidores e variáveis.
Neste ponto, se você for para ClusterControl -> Topologia , você deverá ver a seguinte topologia:
Configurando o soquete MySQL UNIX
No ambiente Linux, se você definir o host MySQL como "localhost", o cliente/aplicativo tentará se conectar através do arquivo de soquete UNIX, que por padrão está localizado em /var/lib/mysql/mysql.sock no servidor cPanel. Usar o arquivo socket é a maneira mais recomendada de acessar o servidor MySQL, pois possui menos overhead em comparação com as conexões TCP. Um arquivo de soquete não contém dados, ele os transporta. É como um canal local que o servidor e os clientes na mesma máquina podem usar para conectar e trocar solicitações e dados.
Dito isto, se seu aplicativo se conectar via "localhost" e porta 3306 como host e porta do banco de dados, ele se conectará via arquivo de soquete. Se você usar "127.0.0.1" e a porta 3306, provavelmente o aplicativo se conectará ao banco de dados via TCP. Esse comportamento é bem explicado na documentação do MySQL. Em palavras simples, use o arquivo de soquete (ou "localhost") para comunicação local e use TCP se o aplicativo estiver se conectando remotamente.
No cPanel, o arquivo de socket MySQL é monitorado pelo processo cpservd e seria vinculado a outro arquivo de socket se configurarmos um caminho diferente do padrão. Por exemplo, suponha que configuramos um arquivo de soquete MySQL não padrão conforme configuramos na seção anterior:
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel via processo cpservd corrigiria isso criando um link simbólico para o caminho do soquete padrão:
(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 34 Jul 4 12:25 /var/lib/mysql/mysql.sock -> ../../../var/lib/mysql/mysql2.sock
Para evitar que o cpservd corrija isso automaticamente (o cPanel tem um termo para esse comportamento chamado "automagicamente"), temos que desabilitar o monitoramento do MySQL acessando WHM -> Service Manager (não vamos usar o MySQL local de qualquer maneira) e desmarque a caixa de seleção "Monitorar" para o MySQL, conforme mostrado na captura de tela abaixo:
Salve as alterações no WHM. Agora é seguro remover o arquivo de soquete padrão e criar um link simbólico para o arquivo de soquete ProxySQL com o seguinte comando:
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Verifique se o arquivo de soquete MySQL do soquete agora está redirecionado para o arquivo de soquete ProxySQL:
(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 18 Jul 3 12:47 /var/lib/mysql/mysql.sock -> /tmp/proxysql.sock
Também precisamos alterar as credenciais de login padrão dentro de /root/.my.cnf da seguinte forma:
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Um pouco de explicação - A primeira linha que comentamos é a senha de root do MySQL gerada pelo cPanel para o servidor MySQL local. Não vamos usar isso, portanto o '#' está no início da linha. Em seguida, adicionamos a senha raiz do MySQL para nossa configuração de replicação do MySQL e o caminho do soquete UNIX, que agora é o link simbólico para o arquivo de soquete ProxySQL.
Neste ponto, no servidor WHM você deve conseguir acessar nosso cluster de replicação MySQL como usuário root simplesmente digitando "mysql", por exemplo:
(whm)$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 239
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Observe que a versão do servidor é 5.5.30 (ProxySQL). Se você puder se conectar como acima, podemos configurar a parte de integração conforme descrito na próxima seção.
Integração WHM/cPanel
O WHM suporta vários servidores de banco de dados, como MySQL 5.7, MariaDB 10.2 e MariaDB 10.3. Como o WHM agora está vendo apenas o ProxySQL e é detectado como a versão 5.5.30 (como mencionado acima), o WHM reclamará da versão não suportada do MySQL. Você pode ir para WHM -> SQL Services -> Gerenciar perfis MySQL e clique no botão Validar. Você deve receber uma notificação de torradeira vermelha no canto superior direito informando sobre esse erro.
Portanto, temos que alterar a versão do MySQL no ProxySQL para a mesma versão do nosso cluster de replicação do MySQL. Você pode obter essas informações executando a seguinte instrução no servidor mestre:
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Em seguida, faça login no console de administração do ProxySQL para alterar a mysql-server_version variável:
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Use a instrução SET conforme abaixo:
mysql> SET mysql-server_version = '5.7.26';
Em seguida, carregue a variável em tempo de execução e salve-a em disco para torná-la persistente:
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Por fim, verifique a versão que o ProxySQL irá representar:
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Se você tentar se conectar novamente ao MySQL executando o comando "mysql", agora você deve obter "Versão do servidor:5.7.26 (ProxySQL)" no terminal.
Agora podemos atualizar a senha de root do MySQL em WHM -> SQL Services -> Manage MySQL Profiles . Edite o perfil localhost alterando o campo Senha na parte inferior com a senha raiz do MySQL do nosso cluster de replicação. Clique no botão Salvar uma vez feito. Podemos então clicar em "Validar" para verificar se o WHM pode acessar nosso cluster de replicação MySQL via serviço ProxySQL corretamente. Você deve obter a seguinte torradeira verde no canto superior direito:
Se você receber a notificação de torradeira verde, podemos prosseguir para integrar o ProxySQL via gancho do cPanel.
Integração ProxySQL via gancho cPanel
O ProxySQL como intermediário entre a replicação WHM e MySQL precisa ter um nome de usuário e senha para cada usuário MySQL que passará por ele. Com a arquitetura atual, se alguém criar um usuário através do painel de controle (WHM via criação de conta ou cPanel via MySQL Database wizard), o WHM criará automaticamente o usuário diretamente em nosso cluster de replicação MySQL usando [email protected] (que foi importado em ProxySQL previamente). No entanto, o mesmo usuário do banco de dados não seria adicionado à tabela mysql_users do ProxySQL automaticamente.
Do ponto de vista do usuário final, isso não funcionaria porque todas as conexões de host local neste ponto devem ser passadas pelo ProxySQL. Precisamos de uma maneira de integrar o cPanel com o ProxySQL, onde para qualquer operação relacionada ao usuário MySQL executada pelo WHM e cPanel, o ProxySQL deve ser notificado e fazer as ações necessárias para adicionar/remover/atualizar sua tabela interna mysql_users.
A melhor maneira de automatizar e integrar esses componentes é usando o sistema de gancho padronizado cPanel. Ganchos padronizados acionam aplicativos quando o cPanel &WHM executa uma ação. Use este sistema para executar código personalizado (código de ação de gancho) para personalizar como o cPanel e o WHM funcionam em cenários específicos (eventos que podem ser conectados).
Primeiramente, crie um arquivo de módulo Perl chamado ProxysqlHook.pm no diretório /usr/local/cpanel:
$ touch /usr/local/cpanel/ProxysqlHook.pm
Em seguida, copie e cole as linhas daqui. Para obter mais informações, confira o repositório do Github em ProxySQL cPanel Hook.
Configure a interface de administração do ProxySQL da linha 16 até a 19:
my $proxysql_admin_host = '192.168.0.16';
my $proxysql_admin_port = '6032';
my $proxysql_admin_user = 'proxysql-admin';
my $proxysql_admin_pass = 'mys3cr3t';
Agora que o gancho está no lugar, precisamos registrá-lo no sistema de gancho cPanel:
(whm)$ /usr/local/cpanel/bin/manage_hooks add module ProxysqlHook
info [manage_hooks] **** Reading ProxySQL information: Host: 192.168.0.16, Port: 6032, User: proxysql-admin *****
Added hook for Whostmgr::Accounts::Create to hooks registry
Added hook for Whostmgr::Accounts::Remove to hooks registry
Added hook for Cpanel::UAPI::Mysql::create_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::createdbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::delete_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::deletedbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_privileges_on_database to hooks registry
Added hook for Cpanel::Api2::MySQLFE::setdbuserprivileges to hooks registry
Added hook for Cpanel::UAPI::Mysql::rename_user to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_password to hooks registry
A partir da saída acima, este módulo se conecta a vários eventos cPanel e WHM:
- Whostmgr::Accounts::Create - WHM -> Funções da conta -> Criar uma nova conta
- Whostmgr::Accounts::Remove - WHM -> Funções da conta -> Encerrar uma conta
- Cpanel::UAPI::Mysql::create_user - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Adicionar novo usuário
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Adicionar novo usuário (requer integração Softaculous).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Excluir usuário
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Adicionar novo usuário (requer integração Softaculous).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Adicionar usuário ao banco de dados
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Adicionar usuário ao banco de dados (requer integração Softaculous).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Renomear usuário
- Cpanel::UAPI::Mysql::set_password - cPanel -> Bancos de dados -> Bancos de dados MySQL -> Alterar senha
Se o evento acima for acionado, o módulo executará as ações necessárias para sincronizar a tabela mysql_users no ProxySQL. Ele executa as operações via interface de administração ProxySQL em execução na porta 6032 no servidor WHM. Assim, é vital especificar as credenciais de usuário corretas para o usuário administrador do ProxySQL para garantir que todos os usuários sejam sincronizados com o ProxySQL corretamente.
Observe que este módulo, ProxysqlHook.pm, nunca foi testado no ambiente de hospedagem real (com muitas contas e muitos plugins de terceiros) e obviamente não cobre todos os eventos relacionados ao MySQL dentro do cPanel. Nós o testamos com a edição gratuita do Softaculous e funcionou muito bem através dos ganchos do cPanel API2. Algumas modificações adicionais podem ser necessárias para adotar a automação completa.
Por enquanto é isso. Na próxima parte, veremos as operações pós-implantação e o que podemos ganhar com nossa solução de servidor MySQL altamente disponível para nossos servidores de hospedagem, se comparado à configuração padrão do MySQL autônomo.