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).

Referências

How to Set Up Replication

Replication Options

Replication Implementation Overview