Esse how to tem 2 pontos chave:
1 – inibir o man in the middle
2 – replicar dados entre bases de dados para que, em uma eventual falha de hardware possamos estar beeeeem providos :).
Considerações iniciais:
master.appunixlabs.com.br -> 10.0.0.1
slave.appunixlabs.com.br -> 10.0.0.2
Nos 2 servers, como root devemos rodar o seguinte comando:
apt-get install mysql-server mysql-client -y
Assim que rodarmos o comando acima será solicitada confirmação de senha do root do banco de dados:
New password for the MySQL “root” user: <—– Devemos colocar a senha de root
Repeat password for the MySQL “root” user: <– Devemos repetir a senha de root
O que iremos fazer agora é verificar os recursos de ssl do server mysql, veja que devemos logar antes como root do banco de dados mysql:
mysql -u root -p
No mysql console devemos exibir as variáveis de SSL:
mysql> show variables like ‘%ssl%’;
Saída que mais interessa -> have_openssl e have_ssl:
+—————+———-+
| Variable_name | Value |
+—————+———-+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+—————+———-+
7 rows in set (0.00 sec)
mysql>
Vamos sair do mysql:
quit;
Precisamos editar os confs do mysql para dar suporte ao SSL:
vim /etc/mysql/my.cnf
Na sessão * Security Features devemos acrescentar SSL, pode ser usado da seguinte forma:
# * Security Features # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl # ssl-ca=/etc/mysql/cacert.pem
Devemos validar nossa alteração, para isto vamos reiniciar o mysql com o seguinte comando:
/etc/init.d/mysql restart
Para confirmarmos o suporte o SSL em ambos os servers (presumindo que você está seguindo até aqui o passo-a-passo nos 2 servidores) devemos logar no mysql como root e verificar as variáveis de ssl:
mysql -u root -p
Logando-se como root devemos usar:
mysql> show variables like ‘%ssl%’;
A saída deste comando deve assemelhar-se com:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+—————+——-+
7 rows in set (0.00 sec)
mysql>
Pule fora do mysql:
mysql> quit;
No servidor MASTER devemos colocar o suporte a acesso remoto ao mysql, do contrário não teremos a replicação de dados em tempo real em hipótese alguma :P, para isto devemos fazer o seguinte, no conf do mysql temos de editar a parte de bind-address:
vim /etc/mysql/my.cnf
# Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1
somente comentando bind-address estamos evitando que o acesso remoto só ocorra por lookup.
Ainda no server master temos de validar nossa alteração:
/etc/init.d/mysql restart
Vamos ver os sockets abertos do mysql na porta com suporte a SSL:
netstat -tap | grep mysql
A saída deve assemelhar-se com:
tcp 0 0 *:mysql *:* LISTEN 2792/mysqld
Devemos criar agora os certificados para dar suporte a camada segura, tanto no main server como no slave, para isso iremos rodar o seguinte comando:
mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts
Em paralelo iremos instalar também o openssl:
apt-get install openssl
Vamos criar os certificados agora com chave beeeeeeeem gorda para CA:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Vamos criar os certificados do servidor master:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout master-key.pem > master-req.pem
openssl x509 -req -in master-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > master-cert.pem
Agora vamos criar o ceritificado do server slave:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout slave-key.pem > slave-req.pem
openssl x509 -req -in slave-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > slave-cert.pem
Agora que criamos os certificados no servidor Master, deveremos enviar os certificados para o servidor SLAVE, os quais lhe pertencem -> ca-cert.pem, slave-cert.pem e slave-key.pem.
No servidor Slave, como root criaremos a pasta dos certificados:
mkdir /etc/mysql/newcerts
Agora no Servidor Master devemos enviar os certificados para pasta de certificados do servidor Slave:
scp /etc/mysql/newcerts/ca-cert.pem root@10.0.0.2:/etc/mysql/newcerts
scp /etc/mysql/newcerts/slave-cert.pem root@10.0.0.2:/etc/mysql/newcerts
scp /etc/mysql/newcerts/slave-key.pem root@10.0.0.2:/etc/mysql/newcerts
No servidor MASTER temos de ativar o suporte aos certificados recém criados, para isto iremos editar novamente o conf do mysql na sessão de Segurança (aonde colocamos a linha SSL):
vim /etc/mysql/my.cnf
Seu conf deverá ficar parecido com este:
# * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl ssl-ca=/etc/mysql/newcerts/ca-cert.pem ssl-cert=/etc/mysql/newcerts/master-cert.pem ssl-key=/etc/mysql/newcerts/master-key.pem
Agora iremos reiniciar o mysql para validar os certificados:
/etc/init.d/mysql restart
Agora, ainda no Master Server temos de dar permissão de replicação ao server Slave dentro do Mysql:
mysql -u root -p
No console do mysql rode:
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘LOGINdoSLAVEserver’@’%’ IDENTIFIED BY ‘Senha_Slave’ REQUIRE SSL;
Para forçar um usuário que você criou para conectar-se somente por SSL, neste caso LOGINdoSLAVEserver devemos fazer o seguinte:
mysql>GRANT USAGE ON *.* TO ‘LOGINdoSLAVEserver‘@’%’ REQUIRE SSL;
mysql> FLUSH PRIVILEGES;
mysql> quit;
Os dois comandos acima dizem: Atualize os privilégios (no caso logins e senhas, ou mudanças de permissões de banco de dados para usuários) e saia fora ;).
Agora precisamos setar a base de dados de logs e dizer quem é o master. Faremos isto assim:
vim /etc/mysql/my.cnf
# The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = basedelogsdb
Chamamos nossa base de dados de logs que iremos compartilhar de basedelogsdb e para validar a mudança do servidor Master temos de reiniciar o mysql:
/etc/init.d/mysql restart
Teremos agora de fazer um dump da base de dados de logs para deixar o slave correndo no mesmo embalo do master, para isto faremos o seguinte:
mysql -u root -p
Depois de logar-se no Mysql:
mysql>USE exampledb;
mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
O último comando deve exibir:
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 106 | exampledb | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
mysql>
Neste ponto não devemos dar quit, é muito importante isto, pois, no server Master ainda, iremos abrir outro terminal (se estiver direto no shell use CTRL + ALT + F2), abrindo uma nova shell logue-se como root e vamos continuar nosso how to. Como root rode os comandos:
cd /tmp
mysqldump -u root -p aSENHAdoMysql –opt basedelogsdb > cluster.sql
scp snapshot.sql root@10.0.0.2:/tmp
Nos passos acima entramos na pasta temporária, como root do banco de dados geramos um dump da base de dados de logs do main server e enviamos para o /tmp do servidor SLAVE.
Agora você pode sair da segunda tela, voltar para a primeira (CTRL + ALT+ F1, caso esteja 100% na shell) e rodar:
mysql> UNLOCK TABLES;
mysql> quit;
No servidor SLAVE iremos editar o conf do mysql na sessão [mysqld] e inserir as strings:
vim /etc/mysql/my.cnf
server-id=2 master-connect-retry=60 replicate-do-db=basedelogsdb
Este ID que estamos vendo JAMAIS poderá ser igual em servers que estão replicando dados.
Para validar nossas mudanças rode:
/etc/init.d/mysql restart
Agora iremos criar a base de dados de logs dentro do servidor SLAVE:
mysql -u root -p
mysql> CREATE DATABASE exampledb;
mysql> quit;
Ainda no servidor SLAVE iremos restaurar o dump chamado cluster.sql:
/usr/bin/mysqladmin –user=root –password=SenhaROOTmysql stop-slave
cd /tmp
mysql -u root -p SenhaROOTmysql basedelogsdb < cluster.sql
Agora iremos logar-nos como root no SLAVE server para poder ativar as variáveis de Show Master exibidas no main server, ou seja, o que foi exibido lá deverá ser ativado aqui, por isso tome muito cuidado:
mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST=’10.0.0.1′, MASTER_USER=’LOGINdoSLAVEserver‘, MASTER_PASSWORD=’Senha_Slave‘, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=106, MASTER_SSL=1, MASTER_SSL_CA = ‘/etc/mysql/newcerts/ca-cert.pem’, MASTER_SSL_CERT = ‘/etc/mysql/newcerts/slave-cert.pem’, MASTER_SSL_KEY = ‘/etc/mysql/newcerts/slave-key.pem’;
mysql> START SLAVE;
Para confirmarmos se tudo ficou filé:
mysql> SHOW SLAVE STATUS G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.1
Master_User: LOGINdoSLAVEserver
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: basedelogsdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /etc/mysql/newcerts/slave-cert.pem
Master_SSL_Cipher:
Master_SSL_Key: /etc/mysql/newcerts/slave-key.pem
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
mysql>
Com isto todas as mudanças que ocorrerem em basedelogsdb no master server estarão replicadas no Slave Server.
Abraços a todos e bons estudos.
Equipe AppUnix.
—
Fontes:
- MySQL: http://www.mysql.com/
- Debian: http://www.debian.org/
- HowToForge: http://www.howtoforge.com (http://migre.me/58eL9)