{"id":4878,"date":"2020-06-18T16:23:19","date_gmt":"2020-06-18T19:23:19","guid":{"rendered":"https:\/\/blog.clusterweb.com.br\/?p=4878"},"modified":"2020-06-18T16:23:19","modified_gmt":"2020-06-18T19:23:19","slug":"mysql-replicacao-de-dados","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4878","title":{"rendered":"MySQL: Replica\u00e7\u00e3o de Dados"},"content":{"rendered":"<p><b><strong>INTRODU\u00c7\u00c3O<\/strong><\/b><\/p>\n<p>O objetivo de um mecanismo de replica\u00e7\u00e3o de dados \u00e9 permitir a manuten\u00e7\u00e3o de v\u00e1rias c\u00f3pias id\u00eanticas de um \u00ad\u00ad\u00ad\u00admesmo dado em v\u00e1rios servidores de bancos de dados (SGBD). Os principais benef\u00edcios da replica\u00e7\u00e3o de dados s\u00e3o a redund\u00e2ncia, o que torna o sistema tolerante a falhas, a possibilidade de um balanceamento de carga do sistema, j\u00e1 que o acesso pode ser distribu\u00eddo entre as r\u00e9plicas, e finalmente, ter-ser o backup online dos dados, j\u00e1 que todas as replicas estariam sincronizadas. Este artigo, apresenta uma introdu\u00e7\u00e3o ao mecanismo de replica\u00e7\u00e3o do MySQL, bem como as configura\u00e7\u00f5es b\u00e1sicas para realiza\u00e7\u00e3o desta tarefa.<\/p>\n<p><b><strong>VIS\u00c3O GERAL DA REPLICA\u00c7\u00c3O<\/strong><\/b><\/p>\n<p>O MySQL permite um tipo de replica\u00e7\u00e3o conhecido como Master-Slave, onde temos um servidor atuando como master e um ou mais servidores atuando como slave. O master grava em um log bin\u00e1rio de altera\u00e7\u00e3o todos os comandos de atualiza\u00e7\u00f5es da base de dados. Desta forma, todas as altera\u00e7\u00f5es ocorridas no master s\u00e3o imediatamente replicadas para os outros servidores slave.<\/p>\n<p>A replica\u00e7\u00e3o no mysql \u00e9 principalmente compat\u00edvel com a anterior, isto \u00e9, um servidor mais novo pode normalmente ser um escravo de um servidor mais velho sem nenhum problema. Por\u00e9m, vers\u00f5es mais antigas dos servidores s\u00e3o, freq\u00fcentemente, incapazes de servir como slaves de vers\u00f5es mais novas, pois eles n\u00e3o podem entender novas caracter\u00edsticas ou a sintaxe SQL que o servidor mais novo utiliza, e pode haver diferen\u00e7as no formato dos arquivos que a replica\u00e7\u00e3o usa, por exemplo, voc\u00ea n\u00e3o pode replicar de um master MySQL 5.0 para um slave MySQL 4.0.<\/p>\n<p><!--more--><\/p>\n<p>Com a replica\u00e7\u00e3o voc\u00ea possui uma s\u00e9rie de vantagens como:<\/p>\n<ul>\n<li><em>Equil\u00edbrio de carga<\/em>: a replica\u00e7\u00e3o, geralmente n\u00e3o precisa de uma largura de banda muito intensiva, voc\u00ea pode inicia e parar conforme a sua vontade e o slave pode trabalhar distante do master.<\/li>\n<li><em>Distribui\u00e7\u00e3o de dados<\/em>: a replica\u00e7\u00e3o pode ajudar a distribuir as consultas de leitura atrav\u00e9s de diversos servidores, ou seja, o mesmo dado pode est\u00e1 armazenados em todos os servidores envolvidos da replica\u00e7\u00e3o.<\/li>\n<li><em>Backup<\/em>: a replica\u00e7\u00e3o \u00e9 uma t\u00e9cnica valiosa para ajudar com backups, por\u00e9m um slave n\u00e3o \u00e9 nem um backup nem um substituto para backups.<\/li>\n<li><em>Alta disponibilidade<\/em>: se um servidor falhar tem outro servidor para suprir aquele servidor que falhou.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><b><strong>COMO A REPLICA\u00c7\u00c3O FUNCIONA<\/strong><\/b><\/p>\n<p>O MySQL realiza a replica\u00e7\u00e3o em um simples processo de tr\u00eas fases, a Figura 1 ilustra a replica\u00e7\u00e3o com mais detalhes:<\/p>\n<ul>\n<li>O master registra altera\u00e7\u00f5es aos seus dados no seu log bin\u00e1rio (estes registros s\u00e3o chamados de evento de log bin\u00e1rio): antes de cada transa\u00e7\u00e3o que atualiza dados no master, o mesmo registra as altera\u00e7\u00f5es no seu log bin\u00e1rio, ou seja, o mysql escreve as transa\u00e7\u00f5es no seu log bin\u00e1rio e logo em seguida o master diz \u00a0as ferramentas de armazenamento para comitar as transa\u00e7\u00f5es.<\/li>\n<li>O slave copia os eventos de log bin\u00e1rio do master no seu relay log (log de vigil\u00e2ncia): o servidor slave, atrav\u00e9s de uma thread de I\/O, abre uma conex\u00e3o com o master e logo inicia o processo de esvaziamento de binlog. O esvaziamento de binlog consiste na leitura do evento a partir do log bin\u00e1rio do master. A Thread de I\/O escreve os eventos no relay log do slave.<\/li>\n<li>O slave repete aos eventos no relay log: a thread l\u00ea e repete eventos a partir do relay log, dessa forma atualizando os dados do slave para combinarem com os do master.<\/li>\n<\/ul>\n<p><b><strong>CONFIGURANDO A REPLICA\u00c7\u00c3O<\/strong><\/b><\/p>\n<p>A configura\u00e7\u00e3o do MySQL \u00e9 bem simples, mas dependendo do cen\u00e1rio pode ocorrer alguma varia\u00e7\u00e3o. O cen\u00e1rio mais b\u00e1sico \u00e9 um servidor master e um slave. Basicamente o processo de configura\u00e7\u00e3o da replica\u00e7\u00e3o \u00e9 a seguinte:<\/p>\n<ul>\n<li>Configurar contas de replica\u00e7\u00e3o em cada servidor<\/li>\n<li>Configurar o master\u00a0 e o slave<\/li>\n<li>E instruir o slave para connectar ao master e replicar a partir dele tamb\u00e9m.<\/li>\n<\/ul>\n<p><em>Obs.: Esta configura\u00e7\u00e3o foi feita em duas m\u00e1quinas virtuais onde as mesmas tinham instaladas o sistema operacional GNU\\Linux CentOS 5.7 final. Este artigo parte do principio de que voc\u00ea j\u00e1 tenha instalado o servidor mysql tanto no servidor slave quanto no servidor master.<br \/>\n<\/em><\/p>\n<p><em>Criando contas de Replica\u00e7\u00e3o<\/em><\/p>\n<p>Primeiramente deve-se criar uma conta de usu\u00e1rio com permiss\u00e3o de replica\u00e7\u00e3o para os servidores tanto no master quanto no slave, ou seja, o mesmo usu\u00e1rio criado para os servidores em quest\u00e3o. Aqui est\u00e1 como criar a conta de usu\u00e1rio, que chamaremos de\u00a0<em>replicador<\/em>:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<p style=\"font-weight: 400 !important;\">2<\/p>\n<p style=\"font-weight: 400 !important;\">3<\/p>\n<p style=\"font-weight: 400 !important;\">4<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">mysql&gt; create user replicador identified by\u00a0 \u2018replica\u2019;<\/p>\n<p style=\"font-weight: 400 !important;\">Query OK, 0 rows affected (0.00 sec)<\/p>\n<p style=\"font-weight: 400 !important;\">mysql&gt; grant replication slave, replication client on *.* to replicador@&#8217;192.168.56.%&#8217; identified by &#8216;replica&#8217;;<\/p>\n<p style=\"font-weight: 400 !important;\">Query OK, 0 rows affected (0.00 sec)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Foi criada esta conta de usario no servidor master e no slave. Log em seguida foi dado as permiss\u00f5es de replica\u00e7\u00e3o (grant replication slave, replication client) para todas as bases de dados do SGBD MySQL (on *.*) para o usu\u00e1rio que acabamos de criar restringindo ao usu\u00e1rio o acesso somente da rede local (replicador@&#8217;192.168.56.%&#8217; identified by &#8216;replica&#8217;;).<em><br \/>\n<\/em><\/p>\n<p><em>Configurando o Master e o Slave<\/em><\/p>\n<p>Depois de criado as contas o pr\u00f3ximo passo \u00e9 ativar algumas configura\u00e7\u00f5es no master.\u00a0 \u00c9 preciso ativar o log bin\u00e1rio e especificar um ID do servidor. Este passo \u00e9 feito no aquivo de configura\u00e7\u00e3o do mysql o \u201cmy.cnf\u201d dentro do diret\u00f3rio \u201c\/etc\u201d, para isso insira as seguintes linhas no arquivo:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<p style=\"font-weight: 400 !important;\">2<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">log-bin = mysql-bin<\/p>\n<p style=\"font-weight: 400 !important;\">server-id = 1\u00a0 #pode ser qualquer identificador<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Depois de realizado essa configura\u00e7\u00e3o no master \u00e9 preciso reiniciar o mysql para o servidor ativar as configura\u00e7\u00f5es e criar os logs bin\u00e1rios. Para verificar se o arquivo de log bin\u00e1rio est\u00e1 criado no master execute o seguinte comando \u201cSHOW MASTER STATUS\u201d\u00a0 a Figura 2 mostra o resultado desse comando:<\/p>\n<p>Figura 2 \u2013 SHOW MASTER STATUS<\/p>\n<p><em>Obs: O exemplo que foi citado acima eu tirei o print da tela depois que eu j\u00e1 tinha feito a configura\u00e7\u00e3o e j\u00e1 tinha realizado algumas instru\u00e7\u00f5es em sql que gerou esse log bin\u00e1rio nessa posi\u00e7\u00e3o. Suponho que voc\u00ea acabou de instalar o mysql e de configurar o master para replica\u00e7\u00e3o quando voc\u00ea digitar esse comando na coluna File ir\u00e1 aparecer\u00a0<\/em><b><strong>mysql-bin.000001<\/strong><\/b><em>\u00a0e na coluna position o n\u00famero\u00a0<\/em><b><strong>98<\/strong><\/b>.<\/p>\n<p>Seguindo no processo de configura\u00e7\u00e3o da replica\u00e7\u00e3o de dados no mysql, o servidor slave precisa ser configurado pelo arquivo de configura\u00e7\u00e3o do mysql (my.cnf), para isso insira as seguintes linhas no arquivo:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<p style=\"font-weight: 400 !important;\">2<\/p>\n<p style=\"font-weight: 400 !important;\">3<\/p>\n<p style=\"font-weight: 400 !important;\">4<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">log-bin = mysql-bin<\/p>\n<p style=\"font-weight: 400 !important;\">server-id = 2<\/p>\n<p style=\"font-weight: 400 !important;\">relay-log = mysql-relay-bin<\/p>\n<p style=\"font-weight: 400 !important;\">log-slave-updates = 1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Esta configura\u00e7\u00e3o segue o mesmo padr\u00e3o de configura\u00e7\u00e3o do servidor master,por\u00e9m inclu\u00edmos alguns par\u00e2metros adicionais: relay-log (para especificar a localiza\u00e7\u00e3o e o nome do relay log) e o log-slave-updates (para fazer o slave logar os eventos replicados no seu pr\u00f3prio log bin\u00e1rio.<\/p>\n<p><em>Obs.: n\u00e3o coloque op\u00e7\u00f5es de configura\u00e7\u00e3o de replica\u00e7\u00e3o como master_host e master_port no arquivo my.cnf do slave, pois esta \u00e9 uma maneira ultrapassada de configurar e ainda pode causar problemas.<br \/>\n<\/em><\/p>\n<p><b><strong>INICIANDO O SERVIDOR SLAVE<\/strong><\/b><\/p>\n<p>Para finalizar a configura\u00e7\u00e3o, o pr\u00f3ximo passo \u00e9 dizer ao slave como conectar-se ao master e come\u00e7ar a replica\u00e7\u00e3o. Para isso n\u00e3o utilize o arquivo my.cnf, use a espress\u00e3o CHANGE MASTER TO. Esta express\u00e3o substitui as configura\u00e7\u00f5es do my.cnf correspondente e permite que voc\u00ea aponte o slave a um master diferente, sem parar o servidor, segue abaixo a express\u00e3o b\u00e1sica para iniciar a replica\u00e7\u00e3o:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<p style=\"font-weight: 400 !important;\">2<\/p>\n<p style=\"font-weight: 400 !important;\">3<\/p>\n<p style=\"font-weight: 400 !important;\">4<\/p>\n<p style=\"font-weight: 400 !important;\">5<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">mysql&gt; CHANGE MASTER TO MASTER_HOST=&#8217;192.168.56.101&#8242;,<\/p>\n<p style=\"font-weight: 400 !important;\">\u00a0\u00a0\u00a0\u00a0-&gt; MASTER_USER=&#8217;replicador&#8217;,<\/p>\n<p style=\"font-weight: 400 !important;\">\u00a0\u00a0\u00a0\u00a0-&gt; MASTER_PASSWORD=&#8217;replica&#8217;,<\/p>\n<p style=\"font-weight: 400 !important;\">\u00a0\u00a0\u00a0\u00a0-&gt; MASTER_LOG_FILE=&#8217;mysql-bin.000001&#8242;,<\/p>\n<p style=\"font-weight: 400 !important;\">\u00a0\u00a0\u00a0\u00a0-&gt; MASTER_LOG_POS=0;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Esta configura\u00e7\u00e3o utilizar o usu\u00e1rio e a senha que foi criado no inicio da configura\u00e7\u00e3o. O MASTER_HOST \u00e9 onde colocamos o ip ou nome do servidor master, neste exemplo utilizamos o ip \u2018192168.56.191\u2019. O MASTER_LOG_POS \u00e9 configurado em 0 porque \u00e9 o inicio do log.<\/p>\n<p>Depois de realizada essa configura\u00e7\u00e3o, basta s\u00f3 iniciar o slave executando o seguinte comando:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">mysql&gt; START SLAVE;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pronto! A partir de agora a replica\u00e7\u00e3o acaba de ser iniciada. Nessa configura\u00e7\u00e3o n\u00e3o \u00e9 para aparecer erros, para verificar se a replica\u00e7\u00e3o est\u00e1 funcionando execute o seguinte comando:<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p style=\"font-weight: 400 !important;\">1<\/p>\n<\/td>\n<td>\n<p style=\"font-weight: 400 !important;\">mysql&gt; SHOW SLAVE STATUS\\G;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A Figura 3 mostra o resultado do comando digitado acima:<\/p>\n<p>Figura 3 \u2013 SHOW SLAVE STATUS\\G;<\/p>\n<p>Note que a replica\u00e7\u00e3o est\u00e1 funcionando perfeitamente, portanto a tudo que for feito no servidor master ser\u00e1 replicado para o servidor slave.<\/p>\n<p>Finalizando este artigo espero que todos voc\u00eas compreendam a mensagem que eu queria passar qualquer coisa \u00e9 s\u00f3 entrar em contato comigo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>INTRODU\u00c7\u00c3O O objetivo de um mecanismo de replica\u00e7\u00e3o de dados \u00e9 permitir a manuten\u00e7\u00e3o de v\u00e1rias c\u00f3pias id\u00eanticas de um \u00ad\u00ad\u00ad\u00admesmo dado em v\u00e1rios servidores de bancos de dados (SGBD). Os principais benef\u00edcios da replica\u00e7\u00e3o de dados s\u00e3o a redund\u00e2ncia, o que torna o sistema tolerante a falhas, a possibilidade de um balanceamento de carga [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[477,91,1082,1,730,830,1062,725,42,51,1411,495,514,68,271,548],"tags":[1418,353,133,73],"class_list":["post-4878","post","type-post","status-publish","format-standard","hentry","category-backup-2","category-banco-de-dados","category-centos-7-rhel-7","category-viazap","category-clusterweb","category-debian","category-freenas","category-hospedagem","category-leitura-recomendada","category-linux-linuxrs","category-mysql","category-profissional-de-ti","category-programacao","category-redes-2","category-seguranca-2","category-ubuntu-2","tag-dados","tag-de","tag-mysql","tag-replicacao"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4878"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4878\/revisions"}],"predecessor-version":[{"id":4879,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4878\/revisions\/4879"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}