{"id":74327,"date":"2020-03-16T08:42:33","date_gmt":"2020-03-16T05:42:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund"},"modified":"2020-03-16T08:42:33","modified_gmt":"2020-03-16T05:42:33","slug":"tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","title":{"rendered":"Provisionamento fino de sistemas de arquivos Linux. Como criar c\u00f3pias de seguran\u00e7a de um banco de dados MySQL de tr\u00eas terabytes em 20 segundos","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Provisionamento fino de sistemas de arquivos Linux. Como criar c\u00f3pias de seguran\u00e7a de um banco de dados MySQL de tr\u00eas terabytes em 20 segundos\" src=\"\/wp-content\/uploads\/2020\/03\/7502785a78bd6f069913e97829ff2f63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meu nome \u00e9 Yuri, sou l\u00edder do grupo de administra\u00e7\u00e3o de sistemas na Citimobil. Hoje, vou compartilhar minha experi\u00eancia com a tecnologia de provisionamento fino (thin provisioning) em sistemas de arquivos Linux e como ela pode ser aplicada nos processos tecnol\u00f3gicos de CI\/CD da empresa. Vamos analisar a situa\u00e7\u00e3o em que, para testes autom\u00e1ticos de c\u00f3digo ao serem enviados para produ\u00e7\u00e3o, necesitamos de c\u00f3pias do banco de dados MySQL o mais parecidas poss\u00edvel com a vers\u00e3o \"em produ\u00e7\u00e3o\", dispon\u00edveis para leitura e grava\u00e7\u00e3o.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie-zachem-davat-vrednye-sovety\">Introdu\u00e7\u00e3o: por que dar conselhos prejudiciais?<\/h3>\n<p><\/p>\n<p>\u00c9 uma pergunta l\u00f3gica, pois j\u00e1 existem mecanismos testados para migra\u00e7\u00f5es de esquemas de banco de dados em ambientes de teste. Por que levar o banco de dados n\u00e3o particionado ao ponto de atingir tais volumes? E nem todos os dados s\u00e3o necess\u00e1rios para testes. Vou tentar explicar.<\/p>\n<p><\/p>\n<p>Aproximadamente um ano atr\u00e1s, com o crescimento ativo do nosso agregador de t\u00e1xis (em 2018, aumentamos o n\u00famero de corridas finalizadas em cerca de 15 vezes), o volume de dados, a carga nos servidores e a frequ\u00eancia de atualiza\u00e7\u00f5es aumentaram. Nos encontramos na seguinte situa\u00e7\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li>O banco de dados MySQL principal cresceu para cerca de 1000 tabelas, totalizando 2,5 TB, e continuou a crescer.<\/li>\n<li>N\u00e3o havia possibilidade de fazer a fragmenta\u00e7\u00e3o rapidamente e dispersar a base. Isso era impedido pela antiga abordagem de \"escrever no banco o que quero e como quero\", com uma s\u00e9rie de JOINs e depend\u00eancias internas entre tabelas.<\/li>\n<li>N\u00e3o havia mecanismo para migra\u00e7\u00f5es do esquema do banco de dados em ambientes de teste.<\/li>\n<li>N\u00e3o havia testes autom\u00e1ticos de c\u00f3digo ao ser enviado para produ\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/p>\n<p>O \u00faltimo problema precisava ser resolvido o mais r\u00e1pido poss\u00edvel. J\u00e1 haviam sido escritos testes Postman para verificar o principal mon\u00f3lito PHP, mas faltava uma base de dados atual. No entanto, n\u00e3o pod\u00edamos criar uma r\u00e9plica \u00e0 noite, torn\u00e1-la mestre e disponibiliz\u00e1-la durante o dia: a grande quantidade de atualiza\u00e7\u00f5es e mudan\u00e7as, incluindo dados e o esquema do banco, tornaria o ambiente n\u00e3o funcional at\u00e9 o meio do dia. E limitar as atualiza\u00e7\u00f5es apenas ao hor\u00e1rio comercial seria ineficaz. <\/p>\n<p><\/p>\n<p>No entanto, a tarefa foi conclu\u00edda: conseguimos o primeiro ambiente funcional em apenas duas semanas. Ao longo do ano passado, ele passou por muitas mudan\u00e7as e continua em uso.<\/p>\n<p><\/p>\n<p>A seguir, descreverei detalhadamente todas as etapas e fases de desenvolvimento da nossa solu\u00e7\u00e3o. Voc\u00ea ver\u00e1 que esse m\u00e9todo merece existir.<\/p>\n<p><\/p>\n<p><strong>O que \u00e9 \"provisionamento fino\"?<\/strong><br \/>\nEsta \u00e9 uma tecnologia de hardware ou software (outra nome \u2014 volumes esparsos) que permite alocar uma quantidade maior de recursos do que a dispon\u00edvel. O volume alocado deve atender aos crit\u00e9rios de just-enough (apenas o necess\u00e1rio) e just-in-time (no tempo necess\u00e1rio). Principalmente, a reserva fina \u00e9 aplicada em diferentes sistemas de armazenamento para fornecer espa\u00e7o em disco em volumes necess\u00e1rios que superam o que est\u00e1 efetivamente dispon\u00edvel. A tecnologia \u00e9 suportada por diferentes sistemas de arquivos, como LVM2, ZFS, BTRFS. \u00c9 amplamente utilizada em hipervisores de virtualiza\u00e7\u00e3o. A reserva fina nos permitiu criar rapidamente a partir de snapshots da parti\u00e7\u00e3o principal com dados quantas c\u00f3pias dessa parti\u00e7\u00e3o precis\u00e1ssemos (diret\u00f3rio de dados do SGBD MySQL).<\/p>\n<p><\/p>\n<h3 id=\"pervyy-stend-tehnologiya-thin-lvm\">Primeiro stand, tecnologia Thin LVM<\/h3>\n<p><\/p>\n<p>Este cap\u00edtulo pode ainda ser chamado de \"Como fazer snapshots r\u00e1pidos de grandes volumes de dados com <noindex><a rel=\"nofollow\" href=\"http:\/\/man7.org\/linux\/man-pages\/man7\/lvmthin.7.html\">Thin LVM<\/a><\/noindex>, reduzindo a estabilidade do sistema de arquivos e do SGBD MySQL a n\u00edveis inaceit\u00e1veis.\" <\/p>\n<p><\/p>\n<p>Como j\u00e1 utilizamos o LVM para construir as parti\u00e7\u00f5es principais do sistema operacional, decidimos come\u00e7ar por ele. Para isso, precis\u00e1vamos de uma m\u00e1quina f\u00edsica separada \u2014 uma r\u00e9plica do nosso banco de dados MySQL principal, na qual poder\u00edamos criar um snapshot da r\u00e9plica sob demanda e levant\u00e1-lo ao lado como uma inst\u00e2ncia separada do MySQL. Durante o per\u00edodo de testes, permitimos que opera\u00e7\u00f5es modificadoras fossem realizadas nesta inst\u00e2ncia, e ao final dos testes, ela era devidamente removida. A configura\u00e7\u00e3o do servidor era a seguinte:<\/p>\n<p><\/p>\n<ul>\n<li>2 x Intel Silver 4114 (10&#215;2,2 GHz HT)<\/li>\n<li>8 x 32 GB DDR4 <\/li>\n<li>8 x 1920 GB Intel SSD em controladora RAID Adaptec em RAID-10<\/li>\n<\/ul>\n<p><\/p>\n<p>Sobre a escolha entre controladora RAID e RAID MD baseado em software, poderia ser escrito um artigo separado. Apenas direi que nossa escolha foi influenciada por dois fatores:<\/p>\n<p><\/p>\n<ul>\n<li>Na \u00e9poca da proposta, todas as SGBDs eram instaladas em controladoras RAID, ent\u00e3o pode-se dizer que assim se estabeleceu historicamente. <\/li>\n<li>A diferen\u00e7a de desempenho em testes sint\u00e9ticos do sistema de arquivos e testes com v\u00e1rias opera\u00e7\u00f5es no MySQL foi m\u00ednima. <\/li>\n<\/ul>\n<p><\/p>\n<p>Dividimos o RAID-10 resultante: fizemos um \u00fanico Grupo de Volume (VG) para todo o espa\u00e7o (com uma sobrecarga de aproximadamente 6,7 GB) e criamos uma parti\u00e7\u00e3o l\u00f3gica (Logical Volume, LV) para o sistema com 50 GB. Normalmente, definimos o restante do espa\u00e7o para a parti\u00e7\u00e3o do MySQL. Mas precis\u00e1vamos de reservas finas, ent\u00e3o primeiro criamos um pool, dentro do qual criamos uma parti\u00e7\u00e3o para \/var\/lib\/mysql com 3,5 TB (com base nos volumes de BD previstos):<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -l 100%FREE -T vga\/thin\nlvcreate -V 3.5T -T vga\/thin -n mysql<\/code><\/pre>\n<p><\/p>\n<p>Formatamos a parti\u00e7\u00e3o em ext4, montamos, gravamos a r\u00e9plica e obtivemos o ambiente inicial. Em seguida, criamos uma camada de API, que deve criar snapshots, levantar uma inst\u00e2ncia do MySQL na porta especificada e remover a inst\u00e2ncia criada. Como isso utiliza apenas chamadas de sistema, escolhemos o bash normal para a linguagem de script e, para a camada API HTTP \u2192 bash, implementamos uma solu\u00e7\u00e3o open source <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/phonkee\/goexpose\">goexpose<\/a><\/noindex>, escrita em Go. <\/p>\n<p><\/p>\n<p>Algum dia vamos disponibilizar nossos scripts bash em open source, mas por enquanto, apenas descreverei o algoritmo principal:<\/p>\n<p><\/p>\n<p>Cria\u00e7\u00e3o do snapshot principal snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Parar a r\u00e9plica principal.<\/li>\n<li>Colocar bloqueio nas opera\u00e7\u00f5es com o snapshot snapmain.<\/li>\n<li>Criar um novo snapshot snapmain.<\/li>\n<li>Iniciar o MySQL e remover o bloqueio.<\/li>\n<\/ol>\n<p><\/p>\n<p>Cria\u00e7\u00e3o de uma BD em uma porta arbitr\u00e1ria a partir do snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Colocar bloqueio na inst\u00e2ncia espec\u00edfica da BD (porta).<\/li>\n<li>Verificar a presen\u00e7a do bloqueio de cria\u00e7\u00e3o do snapshot principal. Se existir, esperar e verificar novamente a cada 5 segundos.<\/li>\n<li>Verificar se existe uma parti\u00e7\u00e3o LV antiga para a inst\u00e2ncia.<br \/>\n3.1 Se existir, parar a inst\u00e2ncia do MySQL usando kill -9 e remover a parti\u00e7\u00e3o LV.<\/li>\n<li>Criar uma nova inst\u00e2ncia a partir do snapmain.<\/li>\n<li>Preparar e montar diret\u00f3rios para essa inst\u00e2ncia.<\/li>\n<li>Remover sinais de slave (arquivos) e iniciar a inst\u00e2ncia do MySQL.<\/li>\n<li>Tornar isso um master.<\/li>\n<li>Remover o bloqueio.<\/li>\n<\/ol>\n<p><\/p>\n<p>Remo\u00e7\u00e3o da BD em uma porta arbitr\u00e1ria:<\/p>\n<p><\/p>\n<ol>\n<li>Colocar bloqueio na inst\u00e2ncia espec\u00edfica da BD (porta).<\/li>\n<li>Matar a inst\u00e2ncia do MySQL usando kill -9.<\/li>\n<li>Desmontar diret\u00f3rios.<\/li>\n<li>Remover a parti\u00e7\u00e3o LV e remover o bloqueio.<\/li>\n<\/ol>\n<p><\/p>\n<p>Exemplo de comandos para clonar parti\u00e7\u00f5es da nova inst\u00e2ncia da BD:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -n stage_3307 -s vga\/snapmain\nlvchange -ay -K vga\/stage_3307\nmount -o noatime,nodiratime,data=writeback \/dev\/mapper\/vga-stage_3307 \/mnt\/stage_3307<\/code><\/pre>\n<p><\/p>\n<p>Agora vou falar sobre o principal problema que enfrentamos ao usar a reserva fina. Enfrentamos o desempenho dos SSDs. Isso ocorreu devido \u00e0s caracter\u00edsticas do Thin LVM: ele opera em um n\u00edvel de dispositivo com blocos de 4 MB por padr\u00e3o. Como isso se pareceu:<\/p>\n<p><\/p>\n<ol>\n<li>Criamos um snapshot da parti\u00e7\u00e3o principal \/var\/lib\/mysql.<\/li>\n<li>Iniciamos a replica\u00e7\u00e3o para alcan\u00e7ar o mestre.<\/li>\n<li>Qualquer altera\u00e7\u00e3o nas tabelas da r\u00e9plica faz com que os blocos de dados antigos e inalterados sejam mantidos na parti\u00e7\u00e3o do snapshot.<\/li>\n<li>Qualquer altera\u00e7\u00e3o na inst\u00e2ncia de teste levantada faz com que os blocos de dados antigos e inalterados sejam mantidos na parti\u00e7\u00e3o do snapshot clonado para essa inst\u00e2ncia.<\/li>\n<li>Atingimos uma carga de opera\u00e7\u00f5es de entrada e sa\u00edda de 100% no dispositivo, atrasando qualquer opera\u00e7\u00e3o e causando o gradual deslizamento da r\u00e9plica.<\/li>\n<li>Ao final do dia de trabalho, temos um stand que ficou atr\u00e1s por v\u00e1rias horas.<\/li>\n<\/ol>\n<p><\/p>\n<p>Como lidamos com isso para obter um resultado mais razo\u00e1vel (principais pontos):<\/p>\n<p><\/p>\n<p>Controlador RAID:<\/p>\n<p><\/p>\n<ul>\n<li>Desativamos por padr\u00e3o todos os tipos de cache. <\/li>\n<li>Configuramos o writeback (quando os dados entram no buffer, a grava\u00e7\u00e3o \u00e9 conclu\u00edda antes que o salvamento real no disco ocorra).<\/li>\n<\/ul>\n<p><\/p>\n<p>Sistema de arquivos:<\/p>\n<p><\/p>\n<ul>\n<li>No ponto de montagem \/var\/lib\/mysql, configuramos <em>noatime,nodiratime,data=writeback<\/em><\/li>\n<li>Desativamos o journaling do ext4 usando tune2fs.<\/li>\n<\/ul>\n<p><\/p>\n<p>MySQL:<\/p>\n<p><\/p>\n<ul>\n<li>Configuramos <em>innodb_flush_method = O_DSYNC<\/em> (aumentamos a velocidade de grava\u00e7\u00e3o, reduzindo assim a confiabilidade).<\/li>\n<li>Desativamos o journaling, pois n\u00e3o precisamos de logs.<\/li>\n<li>Configuramos <em>innodb_buffer_pool_size = 4G<\/em> (quanto menor o tamanho do pool InnoDB, mais r\u00e1pido o MySQL se extinguir\u00e1 em caso de parada e mais r\u00e1pido criaremos o snapshot).<\/li>\n<\/ul>\n<p><\/p>\n<p>Esta n\u00e3o \u00e9 uma lista completa, especialmente em rela\u00e7\u00e3o ao MySQL. No entanto, as outras mudan\u00e7as s\u00e3o menores e muitas vezes n\u00e3o se aplicam sempre ou de forma precisa. Por exemplo, na tentativa de aliviar os discos, at\u00e9 mesmo movemos <em>innodb_parallel_doublewrite_path<\/em> para \/dev\/shm, o que em alguns casos, ao iniciar uma inst\u00e2ncia n\u00e3o finalizada corretamente, nos economizou at\u00e9 5 segundos.<\/p>\n<p><\/p>\n<p>Por que paramos o MySQL antes de fazer o snapshot? Afinal, podemos tirar um snapshot de uma r\u00e9plica em funcionamento. Isso est\u00e1 correto, mas a nova inst\u00e2ncia de BD nesse snapshot ser\u00e1 considerada corrompida por padr\u00e3o e exigir\u00e1 uma varredura completa ao ser iniciada. Parar a r\u00e9plica \u00e9 definitivamente mais r\u00e1pido, embora no final seja a opera\u00e7\u00e3o mais demorada em todo o processo.<\/p>\n<p><\/p>\n<p>Como resultado, obtivemos tempos mais aceit\u00e1veis e um ambiente operacional pronto para uso. No entanto, como pode ser visto no gr\u00e1fico mais eloquente do atraso de replica\u00e7\u00e3o da r\u00e9plica prim\u00e1ria, a situa\u00e7\u00e3o ainda est\u00e1 longe do ideal:<br \/>\n<img decoding=\"async\" alt=\"Provisionamento fino de sistemas de arquivos Linux. Como criar c\u00f3pias de seguran\u00e7a de um banco de dados MySQL de tr\u00eas terabytes em 20 segundos\" src=\"\/wp-content\/uploads\/2020\/03\/9bb7bb7d9abfea124a75616deec57f05.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Entre outras desvantagens, destaca-se a praticamente impossibilidade de monitorar o pool Thin LVM: al\u00e9m das fun\u00e7\u00f5es padr\u00e3o do sistema como iostat, entender, por exemplo, qual elemento do pool est\u00e1 atualmente gerando a maior carga no sistema de arquivos \u00e9 imposs\u00edvel.<\/p>\n<p><\/p>\n<p>\u00c9 importante observar uma grande desvantagem relacionada \u00e0 otimiza\u00e7\u00e3o mencionada acima: criamos um ambiente YOLO. Aproximadamente uma vez a cada um ou dois meses, o ext4 n\u00e3o suportava esse tipo de abuso e quebrava irreversivelmente, exigindo reformatar e recarregar a r\u00e9plica. Ganhando em velocidade, comprometemos desesperadamente a estabilidade.<\/p>\n<p><\/p>\n<p>Quais m\u00e9tricas devem ser monitoradas durante a opera\u00e7\u00e3o do Thin LVM:<\/p>\n<p><\/p>\n<ul>\n<li>Porcentagem de dados do pool thin<\/li>\n<li>Porcentagem de metadados do pool thin<\/li>\n<\/ul>\n<p><\/p>\n<p>Se o espa\u00e7o para dados esgotado for suport\u00e1vel pelo nosso ambiente (basta limpar os discos), o espa\u00e7o esgotado para metadados levar\u00e1 ao colapso total do pool e \u00e0 necessidade de recri\u00e1-lo do zero.<\/p>\n<p><\/p>\n<p>O sistema de arquivos dentro do pool se fragmenta bastante ao longo do tempo. Recomendo executar diariamente, atrav\u00e9s de um cron job, o comando <em>fstrim -v \/var\/lib\/mysql<\/em>.<\/p>\n<p><\/p>\n<p>Sum\u00e1rios intermedi\u00e1rios:<\/p>\n<p><\/p>\n<ul>\n<li>A tecnologia \u00e9 facilmente aplic\u00e1vel, assim como o pr\u00f3prio LVM, e n\u00e3o requer qualifica\u00e7\u00f5es especiais do engenheiro.<\/li>\n<li>Ela se adequa bem a bancos de dados de pequeno porte e n\u00e3o muito carregados. Quanto menor o banco de dados, menos chunks s\u00e3o movidos pelo sistema de arquivos dentro do pool, e menor \u00e9 a carga nos discos.<\/li>\n<li>Para nossa tarefa, come\u00e7amos a procurar outras solu\u00e7\u00f5es, sobre as quais falaremos na pr\u00f3xima se\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vtoroy-stend-tehnologiya-zfs\">O segundo ambiente, a tecnologia ZFS<\/h3>\n<p><\/p>\n<p>H\u00e1 muito tempo, eu trabalhei com o sistema de arquivos ZFS, mas na \u00e9poca, o ZFS funcionava realmente bem em seu sistema operacional nativo, o Solaris. Existia uma vers\u00e3o portada para FreeBSD com um n\u00edvel de implementa\u00e7\u00e3o bastante bom. Tamb\u00e9m havia um porto n\u00e3o finalizado para Linux, que poucos usavam. Devido \u00e0 estrutura de armazenamento de dados em B-tree (ali\u00e1s, a mesma estrutura de armazenamento que o InnoDB do MySQL), o ZFS n\u00e3o teve um bom desempenho em instala\u00e7\u00f5es com um n\u00famero muito grande de arquivos. Tudo isso, juntamente com a necessidade de aprender a parte t\u00e9cnica antes de us\u00e1-lo, acabou por riscar totalmente esse sistema de arquivos da minha pr\u00e1tica. Surgiram o ext4 e o xfs, que se tornaram o padr\u00e3o. Mas considerando que o ZFS \u00e9 mais do que adequado para nossa tarefa, e a vers\u00e3o para Linux, segundo as avalia\u00e7\u00f5es, se tornou um produto razo\u00e1vel (embora n\u00e3o tenha total suporte, o que significa que instalar o sistema no ZFS completamente do zero s\u00f3 pode ser feito com v\u00e1rias manobras), decidimos experiment\u00e1-lo.<\/p>\n<p><\/p>\n<p>Por raz\u00f5es \u00f3bvias, escolhemos uma configura\u00e7\u00e3o de estande semelhante (exceto pelo controlador RAID). Instalamos oito SSDs de 1920 GB. N\u00e3o houve desejo de escrever nossa pr\u00f3pria imagem de rede para instalar o servidor em um ZFS<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zpool create zpool mirror \/dev\/sda2 \/dev\/sdb2 mirror \/dev\/sdc2 \/dev\/sdd2 mirror \/dev\/sde2 \/dev\/sdf2 mirror \/dev\/sdg2 \/dev\/sdh2<\/code><\/pre>\n<p><\/p>\n<p>Criamos parti\u00e7\u00f5es para o MySQL:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zfs create zpool\/mysql\nzfs set compression=gzip zpool\/mysql\nzfs set recordsize=128k zpool\/mysql\nzfs set atime=off zpool\/mysql\nzfs create zpool\/mysql\/data\nzfs set recordsize=16k zpool\/mysql\/data\nzfs set primarycache=metadata zpool\/mysql\/data\nzfs set mountpoint=\/var\/lib\/mysql zpool\/mysql\/data<\/code><\/pre>\n<p><\/p>\n<p>Observe que ativamos a compress\u00e3o de dados gzip padr\u00e3o. Temos muitos recursos de CPU em nosso servidor que n\u00e3o est\u00e3o sendo totalmente utilizados. Como resultado, 3 TB do nosso banco de dados foram reduzidos para 1,6 TB, e como o ponto fraco, assim como no caso anterior, \u00e9 a m\u00e1xima performance dos discos, quanto menos dados tivermos, melhor. Desde o in\u00edcio, obtemos um excelente b\u00f4nus do ZFS! Durante os hor\u00e1rios de pico, com carga total, o uso de cores para manter o gzip ativo chega a at\u00e9 4 n\u00facleos, mas n\u00e3o nos importamos.<\/p>\n<p><\/p>\n<p>Em seguida, a implementa\u00e7\u00e3o aconteceu mais rapidamente. Reproduzimos as configura\u00e7\u00f5es de replica\u00e7\u00e3o do MySQL a partir do estande LVM. Tivemos que gastar algum tempo reescrevendo os scripts para os comandos do ZFS, mas no geral, os algoritmos permaneceram os mesmos. Um exemplo de cria\u00e7\u00e3o de snapshot:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">zfs set snapdir=visible zpool\/mysql\/data\nzfs create zpool\/stage_3307\nzfs clone zpool\/mysql\/data@snapmain zpool\/stage_3307\/data\nzfs set mountpoint=\/mnt\/stage_3307 zpool\/stage_3307\/data<\/code><\/pre>\n<p><\/p>\n<p>De ajustes adicionais: movemos para a mem\u00f3ria as se\u00e7\u00f5es ZFS com metadados e logs l2arc e zil. Para a nossa tarefa, como ficou evidente mais tarde, isso se mostrou excessivo, mas por enquanto mantivemos essa otimiza\u00e7\u00e3o, que \u00e9 f\u00e1cil de alterar se necess\u00e1rio. Entre os efeitos negativos, est\u00e1 o fato de que ap\u00f3s reiniciar o servidor, precisamos recriar as \u00e1reas de mem\u00f3ria correspondentes. Os dados n\u00e3o se perdem. Recorte do zpool status:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">logs\n      \/dev\/shm\/zil_slog.img  ONLINE       0     0     0\ncache\n      \/dev\/shm\/l2arc.img     ONLINE       0     0     0<\/code><\/pre>\n<p><\/p>\n<p>Com essa configura\u00e7\u00e3o, come\u00e7amos a testar o ambiente e obtivemos resultados excelentes: com duas inst\u00e2ncias de banco de dados operando simultaneamente (e uma r\u00e9plica principal ativa) em snapshots, a carga nos discos variou entre 50% e 60%.<\/p>\n<p><\/p>\n<p>Eliminamos nosso principal problema, como pode ser visto no gr\u00e1fico de atraso da replica\u00e7\u00e3o (compare com o gr\u00e1fico anterior na se\u00e7\u00e3o Thin LVM):<br \/>\n<img decoding=\"async\" alt=\"Provisionamento fino de sistemas de arquivos Linux. Como criar c\u00f3pias de seguran\u00e7a de um banco de dados MySQL de tr\u00eas terabytes em 20 segundos\" src=\"\/wp-content\/uploads\/2020\/03\/15df9283838a4662ff0f68accfde4089.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Al\u00e9m disso, e gra\u00e7as a isso, aceleramos significativamente em todas as opera\u00e7\u00f5es: a cria\u00e7\u00e3o completa de um snapshot com a parada e rein\u00edcio da r\u00e9plica leva at\u00e9 40 segundos, enquanto o desdobramento de uma nova inst\u00e2ncia MySQL a partir de um snapshot leva at\u00e9 20 segundos. O que atende mais do que nossas expectativas e os nossos testes de software.<\/p>\n<p><\/p>\n<p>Sum\u00e1rios intermedi\u00e1rios:<\/p>\n<p><\/p>\n<ul>\n<li>Os resultados atenderam completamente nossa necessidade de obter uma c\u00f3pia do banco de dados de produ\u00e7\u00e3o para testes de c\u00f3digo.<\/li>\n<li>A tecnologia requer entendimento: \u00e9 preciso compreender o que \u00e9 ZFS e como trabalhar com ele.<\/li>\n<li>N\u00e3o testamos o estado atual do funcionamento do ZFS com um grande n\u00famero (acima de 1 milh\u00e3o) de arquivos pequenos. Mas presumimos que o problema persiste, portanto, eu n\u00e3o recomendaria este sistema de arquivos para qualquer tipo de armazenamento de arquivos.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-dalshe\">E agora?<\/h3>\n<p><\/p>\n<p>No estande, n\u00e3o fizemos mais nada, o resultado nos agradou. Possivelmente, no futuro, adicionaremos exce\u00e7\u00f5es de tabelas na configura\u00e7\u00e3o de replica\u00e7\u00e3o do estande, aquelas que n\u00e3o s\u00e3o necess\u00e1rias para os testes, o que reduzir\u00e1 ainda mais o volume do banco de dados. N\u00e3o testamos o sistema BTRFS e sua implementa\u00e7\u00e3o da tecnologia de backup fino. No entanto, essa tarefa j\u00e1 n\u00e3o est\u00e1 em discuss\u00e3o, pois o objetivo principal foi alcan\u00e7ado. No geral, claro, queremos nos afastar da abordagem descrita acima \u2014 implementar migra\u00e7\u00f5es de banco de dados funcionais para o ambiente de teste, criar um contorno de teste separado para o banco de dados e trabalhar no particionamento do banco de dados principal. Muitas dessas iniciativas j\u00e1 est\u00e3o sendo colocadas em pr\u00e1tica, sobre as quais certamente falaremos em artigos futuros. <\/p>\n<p><\/p>\n<h3 id=\"itogi\">Resultados<\/h3>\n<p><\/p>\n<p>A tarefa inicial foi resolvida, embora de uma maneira incomum. As conclus\u00f5es intermedi\u00e1rias descreveram as vantagens e desvantagens de cada tecnologia aplicada, portanto, vamos determinar qual tecnologia e quando pode ser utilizada:<\/p>\n<p><\/p>\n<ul>\n<li>Thin LVM \u2014 para bancos de dados pequenos e quando n\u00e3o se deseja ou n\u00e3o h\u00e1 tempo para estudar ZFS.<\/li>\n<li>ZFS \u2014 se houver experi\u00eancia de trabalho com ela ou a possibilidade de dedicar tempo ao seu estudo em qualquer situa\u00e7\u00e3o. <\/li>\n<\/ul>\n<p><\/p>\n<p>Em um n\u00edvel mais alto de apresenta\u00e7\u00e3o, este artigo n\u00e3o \u00e9 apenas uma compara\u00e7\u00e3o das tecnologias de dois sistemas de arquivos. A ideia principal que eu gostaria de transmitir e refor\u00e7ar \u00e9 que n\u00e3o devemos ter medo de pensar de maneira n\u00e3o convencional em situa\u00e7\u00f5es cr\u00edticas para os neg\u00f3cios e de seguir somente receitas prontas. No passado, poder\u00edamos, como todo o departamento t\u00e9cnico, balan\u00e7ar a cabe\u00e7a e dizer que a tarefa de criar backups de tr\u00eas terabytes de banco de dados em menos de um minuto era imposs\u00edvel, e que n\u00e3o precis\u00e1vamos de tecnologias arriscadas, que ir\u00edamos fazer da maneira correta. Isso era poss\u00edvel, mas perder\u00edamos cerca de seis meses a um ano e muitas viagens de clientes (as viagens s\u00e3o nosso principal indicador de neg\u00f3cios) sem testes e durante a implementa\u00e7\u00e3o. Agindo de maneira n\u00e3o convencional, n\u00e3o perdemos muito tempo na implementa\u00e7\u00e3o, adquirimos experi\u00eancia em novas e antigas tecnologias esquecidas, e oferecemos testes exatamente no momento em que precis\u00e1vamos muito deles. Sem d\u00favida, isso teve um impacto positivo em todos os nossos indicadores. A escolha sempre ser\u00e1 sua, e da nossa parte, continuaremos a contar em nosso blog sobre conquistas atuais e futuras interessantes.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/citymobil\/blog\/492172\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u042e\u0440\u0438\u0439, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0421\u0438\u0442\u0438\u043c\u043e\u0431\u0438\u043b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0442\u043e\u043d\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (thin provisioning) \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0435\u0433\u043e \u0432 production \u043d\u0430\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 MySQL, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74328,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74327","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-16T05:42:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-16T05:42:33+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Backup fino de sistemas de arquivos Linux. Como criar c\u00f3pias de seguran\u00e7a de um banco de dados MySQL de tr\u00eas terabytes em 20 segundos | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-16T05:42:33+00:00","article:modified_time":"2020-03-16T05:42:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74327","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:16:23","updated":"2022-10-01 23:42:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/74327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=74327"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/74327\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/74328"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=74327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=74327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=74327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}