agenda
Replicação MySQL
Como configurar
PHP com Replicação MySQL
agenda
Replicação MySQL
Como configurar
PHP com Replicação MySQL
Alguns usuários
fonte: alexa.com/topsites 17-ago-2011
Top websites
Quem usa MySQL – Top 10 Websites
1.Google
2.Facebook
3.Youtube
4.Yahoo!
5.Blogger.com
6.Baidu.com
7.Wikipedia
8.Windows Live
9.Twitter
10.QQ.com
fonte: alexa.com/topsites 17-ago-2011
Por que MySQL é muito utilizado?
1. MySQL: projetado para a Web
2. baixo TCO
3. performance & escalabilidade
4. confiabilidade & disponibilidade
5. LAMP stack
6. facilidade de uso & administração
7. a melhor escolha para SaaS & cloud
8. MySQL Cluster para serviços Web de escala
9. MySQL Enterprise Edition da Oracle
10. MySQL & NoSQL
http://www.mysql.com/why-mysql/white-papers/mysql-wp-top10-webbased-apps.php
Por que MySQL é muito utilizado?
1. MySQL: projetado para a Web
2. baixo TCO
3. performance & escalabilidade
4. confiabilidade & disponibilidade
5. LAMP stack
6. facilidade de uso & administração
7. a melhor escolha para SaaS & cloud
8. MySQL Cluster para serviços Web de escala
9. MySQL Enterprise Edition da Oracle
10. MySQL & NoSQL
http://www.mysql.com/why-mysql/white-papers/mysql-wp-top10-webbased-apps.php
READS
WRITES
Clie
nts
Master
Slaves
Replicação do MySQL Server cenário usual
Throughput e Latência... para determinado volume de
leituras e escritas.
Read-intensive ou Write-intensive? Ambos?
Mantém os mesmos níveis quando for necessário
escalar?
Requisitos de Performance
Necessidade de escalar MySQL + PHP
408 Request Time out
503 Service Unavailable
1040 SQLSTATE: 08004 (ER_CON_COUNT_ERROR)
– Too many connections
Benefício-chave
• O MySQL permite economias
significativas com custos de
hardware, adicionando novos
servidores commodity de
acordo com o necessário e de
maneira incremental
Por que MySQL? • Capacidade de escalar
conforme necessidade e de
maneira incremental
• Baixos custos e flexibilidade
Wikipedia
mysql.com/customers
Caso de sucesso
Master
Slave
Clie
nts
Slaves
Master
Relay
Reads
Writes
Relays: aplicações de leitura intensiva
Benefícios-chave
• Flexibilidade para escolher o
hardware
• Implementação incremental
• Simplicidade e facilidade de uso
• Por que MySQL? • Capacidade de escalar para 5
bilhões de page views por mês,
gerando 1 escrita para cada 1,4
leituras
• Flexibilidade para crescer de
maneira incremental e com baixos
custos
mysql.com/customers
Caso de sucesso
Sharding: aplicações de escrita intensiva
Master
Slave
Clie
nts
Slaves
Shards
Reads
Writes
Partitioning Logic
1 2 3 4 5
Quantos “9s” de disponibilidade?
Failover automático ou manual?
Dados distribuídos e replicados:
Replicação assíncrona , semi-síncrona ou síncrona?
Resincronização automática?
Redundância geográfica?
Requisitos de disponibilidade
% 9 9 9 9 35 dias 4 days 50 min 5 min 8 horas
Replicação
ISPs &
Corporativo
On-Line
Services
eCommerce
Telecoms
Militar
.
Replication
9 . 4 dias
Cu
sto
& C
om
ple
xid
ad
e
Alta disponibilidade
% 9 9 9 9 35 dias 4 days 50 min 5 min 8 horas
Replicação
Clustering &
Virtualização
Clustering &
Redundância
Geográfica
ISPs &
Corporativo
On-Line
Services
eCommerce
Telecoms
Militar
. 9 .
4 dias
Cu
sto
& C
om
ple
xid
ad
e
Alta disponibilidade
• Backup
• diminuir carga servidor
• atraso programado
• Análise
• Datamarts
• DW
• Integração
• dataset completo
• dataset parcial
Outros usos da replicação
MySQL Enterprise Monitor • Auto-detecta topologia • Agrupa e mantém Master/Slave • Verificações do status e
sincronização em tempo real • Dados consolidados de todos
servidores • Notificação de problemas com
sincronização • Postura pró-ativa ao invés de
reativa • Aumenta disponibilidade
Boa prática: monitoramento
edelivery.oracle.com
trial 30 dias
1. Operação de Escrita
Aplicação
2. Mudanças
escritas no binlog
Replicação MySQL: como funciona
4. SQL Thread
aplica mudanças
do relaylog para o
MySQL
3. I/O Thread copia
mudanças do binlog
para relaylog
Master Slave
• Recurso nativo do MySQL
• Modelo assíncrono (padrão) ou semi-síncrono (5.5)
• Slave adiciona carga mínima ao Master
Replicação MySQL: como escalar
Writes & Reads Reads Reads
• Escreva para 1 Master
• Leia de vários Slaves, adicione mais quando necessário
• Perfeito para aplicações de leitura intensiva
Aplicação
Replicação MySQL
Load Balancer
Master Slave Slave
Formatos de replicação 1/2
Statement-based
› comando SQL do Master é
executado no Slave
› formato padrão
› única opção MySQL 5.0 e anterior
› [+] binlog é usualmente menor,
principalmente quando statement
afeta mais de uma linha
› [-] alguns statements não podem
ser replicados, principalmente
dependentes de functions não-
determinísticas
Row-based
› o dado do Master é aplicado no
Slave, sem necessidade de ser
interpretado
› MySQL 5.1 e posterior oferece
essa opção
› [+] formato mais seguro, pois
todos dados serão replicados
› [+] gera menos locks tanto no
Master quanto no Slave
› [-] maior tempo de propagação,
mais dados precisam trafegar
› [-] não permite concurrent insert
no MyISAM no Slave
dev.mysql.com/doc/refman/5.5/en/replication-formats.html
Formatos de replicação 2/2
Mixed-based – melhor dos dois mundos! • Servidor muda dinamicamente o formato de acordo com a
melhor situação • Quando configurada, o formato statement-based é utilizado
como padrão mas vai mudar para row-based baseado no melhor caso
dev.mysql.com/doc/refman/5.5/en/replication-formats.html
MySQL Replication Whitepaper mysql.com/why-mysql/white-papers/mysql-wp-replication.php
MySQL Newsletter – Ed. Especial: Scaling with MySQL mysql.com/news-and-events/newsletter/2010/2010-09sp.html
Casos de sucesso Scale-out mysql.com/why-mysql/scaleout
MySQL 5.5 Replication Docs dev.mysql.com/doc/refman/5.5/en/replication.html
MySQL Enterprise Edition Whitepaper mysql.com/why-mysql/white-papers/mysql_wp_enterprise_ready.php
Links
agenda
Replicação MySQL
Como configurar
PHP com Replicação MySQL
Configurar Replicação: visão geral
Cenário básico: 1 Master e 1 Slave 1. configure usuários 2. configure como Master e como Slave 3. instrua o Slave a se conectar ao Master e replicar
o binlog
dev.mysql.com/doc/refman/5.5/en/replication-howto.html
binlog relaylog
Master Slave
replicação
Master
1. Crie uma conta no Master para
que a I/O Thread do Slave possa
se conectar via TCP/IP:
mysql> CREATE USER 'repl'@'%'
IDENTIFIED BY 'slavepass';
2. Dê as permissões necessárias
para conexão e gerenciamento da
replicação:
mysql> GRANT REPLICATION SLAVE,
REPLICATION CLIENT ON *.* TO
'repl'@'%';
Slave
Nenhuma ação necessária
Passo 1/3: configure usuários
dev.mysql.com/doc/refman/5.5/en/replication-howto.html
Master
1. Pare o mysqld e edite o arquivo
de configuração
2. Habilite o binlog
3. Especifique um server_id único
4. Reinicie o mysqld
[mysqld]
log_bin=mysql-bin
server_id=10
Slave
1. Pare o mysqld e edite o arquivo
de configuração
2. Habilite o binlog (Opcional)
3. Especifique um server_id único
4. Reinicie o mysqld
5. Clone os dados com MySQL
Enterprise Backup ou mysqldump $mysqldump --single-transaction --all-databases --
master-data=1 --host=servername1 | mysql –
host=servername2
[mysqld]
server_id=15
Passo 2/3: configure Master e Slave
dev.mysql.com/doc/refman/5.5/en/replication-howto.html
Master
Determine a posição atual do log
binário:
sessão 1 mysql> FLUSH TABLES WITH READLOCK;
sessão 2 mysql> SHOW MASTER STATUS \G
File: mysql-bin.000003
Position: 78
Slave
Inicie a replicação:
mysql> CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_port=3306,
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=n;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS \G
Prefira executar este comando ao
invés de adicionar ao arquivo de
configuração para permitir trocar de
Master sem parar o Slave.
dev.mysql.com/doc/refman/5.5/en/replication-howto.html
Passo 3/3: instrua o Slave a replicar
agenda
Replicação MySQL
Como configurar
PHP com Replicação MySQL
Ambiente de testes Windows 1/3
1. Web server Apache HTTPd ou Glassfish ou MS-IIS ou nginx etc
2. PHP runtime versão 5.3.6 ou superior
3. MySQL Server 1 Master e 1 Slave, versão 5.5, BD Sakila
4. Ferramentas MySQL Workbench, Netbeans, Notepad++ etc
Para facilitar usaremos bundles: • XAMPP for Windows v1.7.7
• Apache 2.2.21 • MySQL 5.5.16 • PHP 5.3.8 • ...
• MySQL Installer for Windows • MySQL Server 5.5.18 • MySQL Workbench 5.2.35 • BD Sakila, Documentação, Connectors
Ambiente de testes Windows 2/3
1. XAMPP for Windows apachefriends.org/pt_br/xampp.html
a. Baixar ZIP e descompactar na pasta C:\XAMPP b. Modificar a porta do MySQL para rodar 2 instâncias na mesma máquina: C:\xampp\mysql\bin\my.ini
mysqld]
port= 3307
c. (Opcional) Modificar a porta do Apache: C:\xampp\apache\conf\httpd.conf
Listen 81
d. C:\xampp\xampp_start.exe
2. MySQL Installer dev.mysql.com/downloads/installer
a. Instalar todas opções padrão, já será inicializado como serviço -defaults-file="C:\ProgramData\MySQL\MySQL Server 5.5\my.ini"
3. (Opcional) Netbeans netbeans.org
Ambiente de testes Windows 3/3
1. Verificar instalação a. Criar arquivo info.php em C:\xamp\htdocs <?php phpinfo(); ?> b. Acessar: http://localhost:81/info.php
<?php
echo "<h1>Master</h1>";
$connection_m = mysqli_connect('localhost', 'root', 'root', 'sakila', '3310');
if (!$connection_m) {
echo 'Error: ' + mysqli_connect_error();
} else {
$result_m = mysqli_query($connection_m, 'SELECT film_id, title, release_year FROM film ORDER
BY film_id DESC LIMIT 5');
if (!$result_m) {
echo 'Error: ' + mysqli_error();
} else {
echo "<table>\n";
while ($row = mysqli_fetch_assoc($result_m)) {
printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",
htmlentities($row['film_id']),
htmlentities($row['title']),
htmlentities($row['release_year']));
} //end while
echo "</table>\n";
mysqli_free_result($result_m);
} //end if
mysqli_close($connection_m);
} //end if
// REPETIR PARA SLAVE
?>
Exemplo: conectando ao MySQL
Teste: quando o Master cai
1. Teste se Update propaga para Slave mysql> UPDATE `sakila`.`film` SET `release_year`=2008 WHERE `film_id`='1000';
2. Parar o servidor Master
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqladmin" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.5\my.ini" shutdown -uroot –p
3. Slave contém os dados
replicados e pode ser usado para failover
Drivers PHP para MySQL (extensões)
ext/mysql
• depricated: uma das primeiras PHP extensions, mantido para PHP 4, sem novas funcionalidades no PHP 5
• novas funcionalidades do MySQL não são suportadas
mysqli
• suporte completo às funcionalidades MySQL
• Ativamente mantido e suportado pela Oracle
PDO_mysql
• o PHP Data Objects define uma inferface leve e consistente para acessar vários BDs
• boa opção para aplicações simples e portáveis
PH
P
PH
P M
em
ory
PH
P S
tre
am
s
Infrastructure
mysqlnd
MySQL Server
ext/mysql mysqli PDO_mysql
…
PHP Module (Extension) API
PHP 5.3 e mysqlnd – Native Driver
PECL/mysqlnd_ms … …
mysqlnd Statistics
• Por volta de 150 estatisticas coletadas
• mysqli_get_client_stats(), mysqli_get_connection_stats()
PECL/mysqlnd_ms PHP mysqlnd replication plugin
Automatic read/write splitting
• can be controlled with SQL hints
• can be replaced providing callback
• can be disabled for MySQL Cluster use
Load Balancing
• random (pick for every statement or once per request, latter is default)
• round robin (iterate per statement)
• can be replaced providing callback
• can be controlled with SQL hint
Fail over
• optional, automatic connect fail over
Connection pooling
• Lazy connections (don’t open before use, default)
Stable NOV-11
Transparência para aplicação
Exemplo: split e load balancing
Limitações do PECL/mysqlnd_ms
1. nem todos cenários de consistência são
suportados (non-ACID): por exemplo, consistência forte onde os clientes tem sempre a mesma visão após um update http://blog.ulf-wendel.de/2011/consistency-cloud-and-the-php-mysqlnd-replication-plugin/
2. não suporta topologias com mais de 1 master
3. para spliting são considerados SELECT e não é
suportado multiplos statements inline
4. native prepared statements não são suportados, a não ser client-side prepared statement emulation (como no caso do PDO_MySQL)
MySQL com PHP dev.mysql.com/usingmysql/php
Connector/PHP User Manual dev.mysql.com/doc/refman/5.5/en/apis-php.html
Documentação PECL/mysqlnd_ms php.net/mysqlnd_ms
Blog Ulf Wendel blog.ulf-wendel.de/2011/112-stable-release-of-the-replication-and-load-
balancing-plugin-for-php
Links
Mais sobre MySQL
MySQL Treinamento e Certificação
MySQL Boot Camp
Accelerated
MySQL Performance
Tuning Boot Camp
Accelerated
MySQL for Begginers
MySQL for Database
Administrators
MySQL Performance
Tuning
MySQL High
Availability
MySQL Cluster
MySQL DBA
MySQL Boot Camp
Accelerated
MySQL for Developers
MySQL Performance
Tuning Boot Camp
Accelerated
MySQL for Begginers
MySQL and PHP
Developing Dynamic
Web Applicationg
MySQL Advanced
Stored Procedures
MySQLDeveloper
http://education.oracle.com
Treinamentos
Certificações
Opcional
Necessário
07-dez-2011
Registre-se: http://bit.ly/usLQoD
Sumário
O PHP é uma importante linguagem que ajudou a tornar o MySQL o
Banco de Dados Open Source mais popular do mundo.
O recurso de replicação nativo do MySQL é fácil de configurar e pode
ser usado para aumento de performance e disponibilidade de
aplicações PHP.
O driver nativo mysqlnd em conjunto com plug-in PECL/mysqlnd_ms
podem fazer load balancing e failover de maneira transparente para
aplicações PHP.
Obrigado!
Time MySQL Brasil
[email protected] [email protected] [email protected] [email protected]
@MySQLBR meetup.com/MySQL-BR