Aqui, mostro como fazer a replicação de dados sem a utilizar mysqldump’s ou rsync’s da vida. Particularmente não sou muito fã do MySQL, só que achei interessante este recurso para cópia em tempo real. Colocando-se no seguinte cenário: uma aplicação que tenha grande fluxo de dados constantemente, com picos variáveis. O problema está no tipo da consulta e no tamanho da resposta, diretamente, se toda a informação passa apenas por um único gargalo. Então, o intuito deste texto (1 de 3: replication, load balance e failover) é preparar o cenário, possibilitando ter uma cópia fiel dos dados em mais de um servidor. O mestre será 10.2.3.9, e o escravo 10.2.3.10.
Configuração do Mestre (uáááála!)
O que você precisa:
- criar um novo banco de dados
- criar um novo usuário, dando permissão ao usuário no novo banco
- criar o usuario que fara a mágica da multiplicação acontecer
mysql> CREATE DATABASE bastard;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER 'bastard'@'%' IDENTIFIED BY 'bastardpassword';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON bastard.* TO bastard@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD ON *.* TO replica@"10.2.3.10" IDENTIFIED BY 'replicapassword';
Query OK, 0 rows affected (0.01 sec)
- editar o my.cnf, que é onde toda a mágica começa:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
log-bin=/var/log/mysql/mysql-bin.log
binlog-do-db=bastard
server-id=1
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
#For the greatest possible durability and consistency in a replication
#setup using InnoDB with transactions, uncomment two lines above
- terminada a edição, reinicie o daemon; é para aparecer o seguinte:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | bastard | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bastard |
| mysql |
| test |
+--------------------+
4 rows in set (0.01 sec)
Por hora, as configurações no servidor “principal” já está terminada, restando partir para o escravo.
Configuração do(s) Escravo(s)
- criamos o banco que será replicado (bastard)
mysql> CREATE DATABASE bastard;
Query OK, 1 row affected (0.00 sec)
- novamente, editamos o my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
server-id=2
replicate-do-db=bastard
master-host=10.2.3.9
master-user=replica
master-password=replicapassword
master-connect-retry=60
- terminada a edição e reiniciado o daemon, vamos ao seguinte:
mysql> CHANGE MASTER to MASTER_HOST='10.2.3.9', MASTER_USER='replica', MASTER_PASSWORD='replicapassword', MASTER_LOG_FILE='', MASTER_LOG_POS=4;
Query OK, 0 rows affected (0.05 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS;
+----(...)
| Waiting for master to send event | 10.2.3.9 | replica | 3306 |(...)
+-----------------------+
1 row in set (0.01 sec)
Deverá aparecer conforme o descrito. Neste ponto, o que for criado no servidor master, automagicamente aparecerá no escravo. Legal, não?! Para tanto, vamos à prova de fogo no próximo passo.
Confirmando se TUDO está certo
No seu browser preferido, vá até o phpMyAdmin do servidor master. Use o usuário bastard, crie tabelas, colunas, popule com algumas informações. O resultado final, após brincar com as quatro operações (CRUD) foi:
[root@bastard ~]# mysql -h 127.0.0.1 -u root -D bastard -e "SELECT * FROM ops;"
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 11 | silva | teitei |
| 13 | brisa | maritima |
| 14 | teste | dereplica |
+----+----------+-----------+
[root@bastard ~]#
[root@muh ~]# mysql -h 127.0.0.1 -u root -D bastard -e "SELECT * FROM ops;"
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 11 | silva | teitei |
| 13 | brisa | maritima |
| 14 | teste | dereplica |
+----+----------+-----------+
[root@muh ~]#
Notas
- Por enquanto, você deverá iniciar antes o mestre, depois o escravo.
- Para que mais de uma base seja replicada, você necessariamente precisa especificar as bases (replicate-do-db=abobrinha\nreplicate-to-db=tomate\netc).
Recent Comments