{"id":86904,"date":"2020-07-01T07:42:30","date_gmt":"2020-07-01T05:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud"},"modified":"2020-07-01T07:42:30","modified_gmt":"2020-07-01T05:42:30","slug":"kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","title":{"rendered":"Como o GitLab ajuda a fazer backups de grandes armaz\u00e9ns do NextCloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr!<\/p>\n<p><\/p>\n<p>Hoje eu quero falar sobre nossa experi\u00eancia na automa\u00e7\u00e3o de backup de grandes volumes de dados em configura\u00e7\u00f5es diversas com Nextcloud. Eu sou o CTO da 'Molniya AK', onde lidamos com a gest\u00e3o da configura\u00e7\u00e3o de sistemas de TI, utilizando Nextcloud para armazenamento de dados. Isso inclui, entre outras coisas, uma estrutura distribu\u00edda com redund\u00e2ncia.<\/p>\n<p><\/p>\n<p>Os problemas resultantes das peculiaridades das instala\u00e7\u00f5es s\u00e3o que os dados s\u00e3o extensos. A versionagem fornecida pelo Nextcloud, o backup, raz\u00f5es subjetivas, entre outros, acabam gerando muitos duplicados.<\/p>\n<p><\/p>\n<h2 id=\"predystoriya\">Antecedentes<\/h2>\n<p><\/p>\n<p>Na administra\u00e7\u00e3o do Nextcloud, surge a quest\u00e3o da organiza\u00e7\u00e3o de um backup eficiente que deve ser necessariamente criptografado, pois os dados s\u00e3o valiosos.<\/p>\n<p><\/p>\n<p>Oferecemos op\u00e7\u00f5es de armazenamento de backup, seja conosco ou com o cliente em suas m\u00e1quinas separadas do Nextcloud, o que demanda uma abordagem automatizada e flex\u00edvel para a administra\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Temos muitos clientes, todos com configura\u00e7\u00f5es diferentes, e todos em suas pr\u00f3prias instala\u00e7\u00f5es e com suas particularidades. Aqui, o m\u00e9todo padr\u00e3o, onde toda a infraestrutura pertence a voc\u00ea e os backups s\u00e3o feitos a partir do cron, n\u00e3o se aplica bem.<\/p>\n<p><\/p>\n<p>Para come\u00e7ar, vamos olhar os dados introdut\u00f3rios. Precisamos de:<\/p>\n<p><\/p>\n<ul>\n<li>Escalabilidade em termos de uma ou v\u00e1rias n\u00f3s. Para grandes instala\u00e7\u00f5es, usamos o minio como sistema de armazenamento.<\/li>\n<li>Identificar problemas com a execu\u00e7\u00e3o do backup.<\/li>\n<li>\u00c9 necess\u00e1rio armazenar o backup com os clientes e\/ou conosco.<\/li>\n<li>Resolver problemas de forma r\u00e1pida e f\u00e1cil.<\/li>\n<li>Os clientes e as instala\u00e7\u00f5es diferem bastante entre si \u2014 n\u00e3o conseguimos alcan\u00e7ar uniformidade.<\/li>\n<li>A velocidade de recupera\u00e7\u00e3o deve ser m\u00ednima em dois cen\u00e1rios: recupera\u00e7\u00e3o completa (desastre), uma pasta \u2014 exclu\u00edda por engano.<\/li>\n<li>A fun\u00e7\u00e3o de deduplica\u00e7\u00e3o \u00e9 obrigat\u00f3ria.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Como o GitLab ajuda a fazer backups de grandes armaz\u00e9ns do NextCloud\" src=\"\/wp-content\/uploads\/2020\/07\/1a0048e3295fef94ddca28e50612e3cb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para resolver a quest\u00e3o da gest\u00e3o de backups, implementamos o GitLab. Mais detalhes a seguir. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Certamente, n\u00e3o somos os primeiros a resolver esse tipo de problema, mas acreditamos que nossa experi\u00eancia pr\u00e1tica e vivenciada pode ser interessante e estamos prontos para compartilh\u00e1-la.<\/p>\n<p><\/p>\n<p>Como na nossa empresa a pol\u00edtica \u00e9 de c\u00f3digo aberto, procuramos uma solu\u00e7\u00e3o com c\u00f3digo aberto. Por sua vez, compartilhamos nossos desenvolvimentos e os disponibilizamos. Por exemplo, no GitHub temos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/nextcloud-safe-trash\">nosso plugin para Nextcloud<\/a><\/noindex>, que instalamos nos clientes, aumentando a seguran\u00e7a dos dados em caso de exclus\u00e3o acidental ou deliberada.<\/p>\n<p><\/p>\n<h2 id=\"sredstva-bekapirovaniya\">Ferramentas de backup<\/h2>\n<p><\/p>\n<p>Iniciamos a busca por m\u00e9todos de solu\u00e7\u00e3o com a escolha de uma ferramenta para criar backups.<\/p>\n<p><\/p>\n<p>O uso padr\u00e3o de tar + gzip \u00e9 ineficaz \u2013 os dados s\u00e3o duplicados. O backup incremental geralmente cont\u00e9m muito poucas mudan\u00e7as, e a maior parte dos dados dentro de um \u00fanico arquivo se repete.<br \/>\nH\u00e1 outro problema \u2013 a redund\u00e2ncia do armazenamento de dados distribu\u00eddo. Usamos o minio e seus dados s\u00e3o, em ess\u00eancia, redundantes. Ou ter\u00edamos que fazer o backup atrav\u00e9s do pr\u00f3prio minio \u2013 sobrecarreg\u00e1-lo e utilizar todos os intermedi\u00e1rios entre o sistema de arquivos, e o que \u00e9 igualmente importante, h\u00e1 o risco de esquecer parte dos buckets e metainforma\u00e7\u00f5es. Ou usar deduplica\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Existem ferramentas de backup com deduplica\u00e7\u00e3o em c\u00f3digo aberto (no Habr estavam <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/449282\/\">artigo<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/420055\/\">sobre este tema<\/a><\/noindex>) e nossos finalistas foram <noindex><a rel=\"nofollow\" href=\"https:\/\/borgbackup.readthedocs.io\/en\/stable\/\">Borg<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/restic.net\/\">Restic<\/a><\/noindex>. A seguir, discutiremos nossa compara\u00e7\u00e3o entre os dois aplicativos, mas antes disso, contaremos como organizamos todo o esquema.<\/p>\n<p><\/p>\n<h2 id=\"upravlenie-sozdaniem-rezervnyh-kopiy\">Gerenciamento da cria\u00e7\u00e3o de backups<\/h2>\n<p><\/p>\n<p>Borg e Restic s\u00e3o bons, mas nenhum dos dois produtos possui um mecanismo centralizado de gerenciamento. Para fins de gerenciamento e controle, escolhemos uma ferramenta que j\u00e1 est\u00e1 implantada em nosso ambiente, sem a qual n\u00e3o conseguimos pensar em nosso trabalho, inclusive na automa\u00e7\u00e3o \u2013 o conhecido CI\/CD \u2013 GitLab.<\/p>\n<p><\/p>\n<p>A ideia \u00e9 a seguinte: em cada n\u00f3 que armazena dados do Nextcloud, instala-se o gitlab-runner. O runner executa, em hor\u00e1rios programados, um script que monitora o processo de backup, que por sua vez invoca o Borg ou Restic.<\/p>\n<p><\/p>\n<p>O que conseguimos? Feedback da execu\u00e7\u00e3o, controle conveniente sobre as mudan\u00e7as, detalhes em caso de erro.<\/p>\n<p><\/p>\n<p>Aqui <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/backup-by-runner\">aqui no GitHub<\/a><\/noindex> publicamos exemplos de scripts para diferentes tarefas, e acabamos integrando-o ao backup n\u00e3o s\u00f3 do Nextcloud, mas de muitos outros servi\u00e7os. Tamb\u00e9m est\u00e1 dispon\u00edvel um planejador, caso voc\u00ea n\u00e3o queira configur\u00e1-lo manualmente (e n\u00f3s n\u00e3o queremos) e o arquivo .gitlab-ci.yml<\/p>\n<p><\/p>\n<p>Na API do GitLab, ainda n\u00e3o h\u00e1 como alterar o intervalo de tempo do CI\/CD, que \u00e9 curto. Precisamos aument\u00e1-lo, digamos para <code>1d<\/code>.<\/p>\n<p><\/p>\n<p>Felizmente, o GitLab consegue iniciar n\u00e3o apenas com um commit, mas tamb\u00e9m em hor\u00e1rios programados, que \u00e9 exatamente o que precisamos.<\/p>\n<p><\/p>\n<p>Agora sobre o script de wrapper.<\/p>\n<p><\/p>\n<p>Estabelecemos as seguintes condi\u00e7\u00f5es para este script:<\/p>\n<p><\/p>\n<ul>\n<li>Deve ser executado tanto pelo runner quanto manualmente via console, mantendo a mesma funcionalidade.<\/li>\n<li>Deve ter manipuladores de erros:<\/li>\n<li>c\u00f3digo de retorno.<\/li>\n<li>busca de string no log. Por exemplo, para n\u00f3s uma mensagem que o programa n\u00e3o considera cr\u00edtica pode ser um erro.<\/li>\n<li>Tempo de execu\u00e7\u00e3o de timeout. Deve ser um tempo razo\u00e1vel.<\/li>\n<li>Precisamos de um log detalhado. Mas somente em caso de erro.<\/li>\n<li>Uma s\u00e9rie de testes tamb\u00e9m \u00e9 realizada antes do in\u00edcio.<\/li>\n<li>Pequenas facilidades para conveni\u00eancia que consideramos \u00fateis durante o suporte:<\/li>\n<li>O in\u00edcio e o fim s\u00e3o registrados no log do sistema da m\u00e1quina local. Isso ajuda a vincular erros do sistema ao funcionamento do backup.<\/li>\n<li>Parte do log de erros, quando existem, \u00e9 emitida no stdout, e o log completo \u00e9 gravado em um arquivo separado. \u00c9 pr\u00e1tico conferir no CI e avaliar o erro se for trivial.<\/li>\n<li>Modos para depura\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/p>\n<p>O log completo \u00e9 salvo como artefato no GitLab; se n\u00e3o houver erros, o log \u00e9 exclu\u00eddo. O script \u00e9 escrito em bash.<\/p>\n<p><\/p>\n<p>Ficaremos felizes em considerar quaisquer sugest\u00f5es e coment\u00e1rios sobre c\u00f3digo aberto \u2014 bem-vindos.<\/p>\n<p><\/p>\n<h2 id=\"kak-eto-rabotaet\">Como funciona<\/h2>\n<p><\/p>\n<p>Um runner com executor bash \u00e9 iniciado no n\u00f3 de backup. Um job CI\/CD \u00e9 iniciado em um reposit\u00f3rio especial pelo planejador. O runner executa um script que serve como uma camada universal para essas tarefas, realizando verifica\u00e7\u00f5es de validade do reposit\u00f3rio de backup, pontos de montagem e tudo o que desejarmos, depois \u00e9 realizado o backup e a limpeza dos antigos. O backup pronto \u00e9 enviado para o S3.<\/p>\n<p><\/p>\n<p>Trabalhamos com esse esquema \u2014 \u00e9 um provedor externo AWS ou um an\u00e1logo russo (\u00e9 mais r\u00e1pido e os dados n\u00e3o saem da R\u00fassia). Ou instalamos um cluster minio separado no local do cliente para esses fins. Normalmente fazemos isso por motivos de seguran\u00e7a, quando o cliente n\u00e3o quer que os dados saiam do seu ambiente.<\/p>\n<p><\/p>\n<p>N\u00e3o usamos o recurso de envio de backup via ssh. Isso n\u00e3o adiciona seguran\u00e7a, e as capacidades de rede do provedor S3 s\u00e3o muito superiores \u00e0 de uma \u00fanica m\u00e1quina ssh nossa.<\/p>\n<p><\/p>\n<p>Para proteger contra hackers na m\u00e1quina local \u2014 pois eles podem apagar dados no S3, a versionamento deve ser ativada.<br \/>\nO backup sempre \u00e9 criptografado.<\/p>\n<p><\/p>\n<p>O Borg possui um modo sem criptografia <code>none<\/code>, mas n\u00e3o recomendamos que seja ativado. Nesse modo, n\u00e3o somente a criptografia n\u00e3o \u00e9 realizada, como tamb\u00e9m a soma de verifica\u00e7\u00e3o do que est\u00e1 sendo gravado n\u00e3o \u00e9 calculada, portanto a integridade s\u00f3 pode ser verificada indiretamente, pelos \u00edndices.<\/p>\n<p><\/p>\n<p>Com um agendador separado, a integridade dos backups \u00e9 verificada quanto a \u00edndices e conte\u00fado. A verifica\u00e7\u00e3o ocorre lentamente e leva tempo, ent\u00e3o a realizamos separadamente uma vez por m\u00eas. Pode demorar v\u00e1rios dias.<\/p>\n<p><\/p>\n<h2 id=\"ridmi-na-russkom\">Readme em russo<\/h2>\n<p><\/p>\n<h3 id=\"osnovnye-funkcii\">Fun\u00e7\u00f5es principais<\/h3>\n<p><\/p>\n<ul>\n<li><code>prepare<\/code> prepara\u00e7\u00e3o<\/li>\n<li><code>teste de verifica\u00e7\u00e3o<\/code> verifica\u00e7\u00e3o de prontid\u00e3o<\/li>\n<li><code>comando principal<\/code> comando principal<\/li>\n<li><code>for\u00e7ar finaliza\u00e7\u00e3o<\/code> fun\u00e7\u00e3o que \u00e9 executada no final ou em caso de erro. Usada para desmontar a parti\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"service-functions\">Fun\u00e7\u00f5es de servi\u00e7o<\/h3>\n<p><\/p>\n<ul>\n<li><code>cleanup<\/code> registramos erros ou apagamos o arquivo de log.<\/li>\n<li><code>verificar log<\/code> analisamos o log em busca da string de erro.<\/li>\n<li><code>ret<\/code> manipulador de sa\u00edda.<\/li>\n<li><code>verificar tempo limite<\/code> verifica\u00e7\u00e3o de tempo limite.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"environment\">Ambiente<\/h3>\n<p><\/p>\n<ul>\n<li><code>VERBOSE=1<\/code> exibimos erros na tela imediatamente (stdout).<\/li>\n<li><code>SAVELOGSONSUCCES=1<\/code> salvamos o log em caso de sucesso.<\/li>\n<li><code>INIT_REPO_IF_NOT_EXIST=1<\/code> Criamos o reposit\u00f3rio, se n\u00e3o existir. Por padr\u00e3o, desligado.<\/li>\n<li><code>TEMPO LIMITE<\/code> tempo m\u00e1ximo para a opera\u00e7\u00e3o principal. Voc\u00ea pode configur\u00e1-lo como 'm', 'h' ou 'd' no final.<\/li>\n<\/ul>\n<p><\/p>\n<p>Modo de armazenamento de c\u00f3pias antigas. Por padr\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li><code>MANTER_DIARIAMENTE=7<\/code><\/li>\n<li><code>MANTER_SEMANALMENTE=4<\/code><\/li>\n<li><code>MANTER_MENSALMENTE=6<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"peremennye-vnutri-skripta\">Vari\u00e1veis dentro do script<\/h2>\n<p><\/p>\n<ul>\n<li><code>STRING_DE_ERRO<\/code> \u2014 string para verifica\u00e7\u00e3o no log por erro.<\/li>\n<li><code>EXTRAIR_STRING_DE_ERRO<\/code> \u2014 express\u00e3o para mostrar string em caso de erro.<\/li>\n<li><code>MORTESIGNAL_DE_TEMPO_LIMITE<\/code> \u2014 sinal para matar se houver tempo limite.<\/li>\n<li><code>TAIL<\/code> \u2014 quantas strings com erros na tela.<\/li>\n<li><code>COLORMSG<\/code> \u2014 cor da mensagem (padr\u00e3o amarelo).<\/li>\n<\/ul>\n<p><\/p>\n<p>O script, chamado de wordpress, \u00e9 nomeado condicionalmente; seu recurso \u00e9 que tamb\u00e9m faz backup do banco de dados mysql. Isso significa que pode ser usado para instala\u00e7\u00f5es ef\u00eameras do Nexcloud, onde voc\u00ea pode tamb\u00e9m fazer backup do banco. A conveni\u00eancia n\u00e3o est\u00e1 apenas no fato de tudo estar em um s\u00f3 lugar, mas tamb\u00e9m no que cont\u00e9m o banco de dados, pois a diferen\u00e7a de tempo \u00e9 m\u00ednima.<\/p>\n<p><\/p>\n<h2 id=\"restic-vs-borg\">Restic vs Borg<\/h2>\n<p><\/p>\n<p>Compara\u00e7\u00f5es entre Borg e Restic tamb\u00e9m est\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/454734\/\">aqui no Habr\u00e9<\/a><\/noindex>, e n\u00e3o t\u00ednhamos a tarefa de fazer apenas mais um, mas o nosso. Era importante para n\u00f3s como isso ficaria em nossos dados, com nossa especificidade. N\u00f3s os apresentamos.<\/p>\n<p><\/p>\n<p>Nossos crit\u00e9rios de escolha, al\u00e9m dos j\u00e1 mencionados (deduplica\u00e7\u00e3o, recupera\u00e7\u00e3o r\u00e1pida etc.):<\/p>\n<p><\/p>\n<ul>\n<li>Resili\u00eancia para trabalho n\u00e3o conclu\u00eddo. Verifica\u00e7\u00e3o de kill -9.<\/li>\n<li>Tamanho no disco.<\/li>\n<li>Exig\u00eancia de recursos (CPU, mem\u00f3ria).<\/li>\n<li>Tamanho dos blobs armazenados.<\/li>\n<li>Trabalho com S3.<\/li>\n<li>Verifica\u00e7\u00e3o de integridade.<\/li>\n<\/ul>\n<p><\/p>\n<p>Para os testes, pegamos um cliente com dados reais e um tamanho total de 1,6TB.<br \/>\nCondi\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>O Borg n\u00e3o consegue trabalhar diretamente com S3, e montamos como um disco fuse, atrav\u00e9s de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/goofys\">goofys<\/a><\/noindex>. O Restic enviou para S3 diretamente.<\/p>\n<p><\/p>\n<p>Goofys funciona muito r\u00e1pido e bem, e tem um <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/catfs\">m\u00f3dulo de cache de disco<\/a><\/noindex>, que acelera ainda mais o trabalho. Ele est\u00e1 em fase beta, e admito que teve falhas com perda de dados em testes (outros). Mas a conveni\u00eancia \u00e9 que o pr\u00f3prio procedimento de backup n\u00e3o requer muita leitura, mas principalmente grava\u00e7\u00e3o, portanto, usamos o cache apenas durante a verifica\u00e7\u00e3o de integridade.<\/p>\n<p><\/p>\n<p>Para reduzir a influ\u00eancia da rede, utilizamos um provedor local - Yandex Cloud.<\/p>\n<p><\/p>\n<p>Resultados dos testes comparativos.<\/p>\n<p><\/p>\n<ul>\n<li>Kill -9 seguido de reinicializa\u00e7\u00e3o, ambos foram bem-sucedidos.<\/li>\n<li>Tamanho em disco. O Borg consegue comprimir, portanto, os resultados s\u00e3o esperados.<\/li>\n<\/ul>\n<p><\/p>\n<p>Backuper<br \/>\nTamanho<\/p>\n<p>Borg<br \/>\n562Gb<\/p>\n<p>Restic<br \/>\n628Gb<\/p>\n<p><\/p>\n<ul>\n<li>Por CPU<br \/>\nO borg em si consome pouco, com a compress\u00e3o padr\u00e3o, mas deve-se avaliar junto com o processo goofys. No total, eles s\u00e3o compar\u00e1veis e utilizam cerca de 1,2 n\u00facleos na mesma m\u00e1quina virtual de teste.<\/li>\n<li>Mem\u00f3ria. O Restic consome aproximadamente 0,5Gb, o Borg cerca de 200Mb. Mas isso tudo \u00e9 insignificante em compara\u00e7\u00e3o com o cache de arquivo do sistema. Portanto, \u00e9 recomend\u00e1vel alocar mais mem\u00f3ria.<\/li>\n<li>A diferen\u00e7a no tamanho dos blobs foi surpreendente.<\/li>\n<\/ul>\n<p><\/p>\n<p>Backuper<br \/>\nTamanho<\/p>\n<p>Borg<br \/>\ncerca de 500Mb<\/p>\n<p>Restic<br \/>\ncerca de 5Mb<\/p>\n<p><\/p>\n<ul>\n<li>O trabalho com S3 pelo Restic \u00e9 excelente. O funcionamento do Borg via goofys n\u00e3o apresenta problemas, mas foi observado que \u00e9 desej\u00e1vel fazer um umount ao final do backup para limpar completamente o cache. Uma caracter\u00edstica do funcionamento do S3 \u00e9 que chunks n\u00e3o totalmente baixados nunca ser\u00e3o enviados para o bucket, e dados n\u00e3o completamente carregados levam a grandes danos.<\/li>\n<li>A verifica\u00e7\u00e3o de integridade funciona bem em ambos os casos, mas a velocidade difere significativamente.<br \/>\nRestic \u2013 <strong>3,5 horas<\/strong>.<br \/>\nBorg, com um cache de arquivo de 100Gb SSD \u2013 <strong>5 horas<\/strong>. O resultado em termos de velocidade \u00e9 aproximadamente o mesmo se os dados est\u00e3o no disco local.<br \/>\nO Borg l\u00ea diretamente do S3 sem cache <strong>33 horas<\/strong>. Extremamente demorado.<\/li>\n<\/ul>\n<p><\/p>\n<p>Em resumo, o Borg consegue comprimir e possui blobs maiores \u2014 o que torna o armazenamento e as opera\u00e7\u00f5es GET\/PUT no S3 mais baratas. Mas isso vem com um custo de verifica\u00e7\u00e3o mais complexa e lenta. Em termos de velocidade de recupera\u00e7\u00e3o \u2014 n\u00e3o notamos diferen\u00e7a. Os backups subsequentes (ap\u00f3s o primeiro) realizados pelo restic demoram um pouco mais, mas n\u00e3o significativamente.<\/p>\n<p><\/p>\n<p>O tamanho da comunidade tamb\u00e9m foi um fator importante na escolha.<\/p>\n<p><\/p>\n<p>E escolhemos o borg.<\/p>\n<p><\/p>\n<h2 id=\"paru-slov-o-szhatii\">Algumas palavras sobre compress\u00e3o<\/h2>\n<p><\/p>\n<p>O Borg possui um excelente novo algoritmo de compress\u00e3o \u2014 zstd. Em termos de qualidade de compress\u00e3o, n\u00e3o \u00e9 pior que o gzip, mas \u00e9 significativamente mais r\u00e1pido. E compar\u00e1vel em velocidade ao lz4 padr\u00e3o.<\/p>\n<p><\/p>\n<p>Por exemplo, um dump de banco de dados MySQL \u00e9 comprimido cerca de duas vezes melhor que o lz4 com a mesma velocidade. Contudo, a experi\u00eancia em dados reais mostra que h\u00e1 uma diferen\u00e7a muito pequena na taxa de compress\u00e3o em nodos do Nextcloud.<\/p>\n<p><\/p>\n<p>No Borg, h\u00e1 um modo de compress\u00e3o bastante ben\u00e9fico \u2014 se o arquivo tem alta entropia, a compress\u00e3o n\u00e3o \u00e9 aplicada, aumentando assim a velocidade de opera\u00e7\u00e3o. \u00c9 ativada com a op\u00e7\u00e3o ao criar<br \/>\n<code>-C auto,zstd<\/code><br \/>\npara o algoritmo zstd<br \/>\nCom essa op\u00e7\u00e3o, em compara\u00e7\u00e3o \u00e0 compress\u00e3o padr\u00e3o, obtivemos<br \/>\n560 Gb e 562 Gb, respectivamente. Os dados do exemplo acima, lembrando que sem compress\u00e3o o resultado \u00e9 628 Gb. O resultado de 2 Gb de diferen\u00e7a nos surpreendeu um pouco, mas decidimos que ainda assim escolheremos <code>auto,zstd<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"metodika-proverki-bekapa\">Metodologia de verifica\u00e7\u00e3o de backup<\/h2>\n<p><\/p>\n<p>O script \u00e9 executado em uma VM diretamente no provedor ou no cliente, o que reduz significativamente a carga na rede. Pelo menos, isso \u00e9 mais barato do que levantar uma infraestrutura pr\u00f3pria e trafegar os dados.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">goofys --cache \"--free:5%:\/mnt\/cache\" -o allow_other --endpoint https:\/\/storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com \/mnt\/goofys\nexport BORG_PASSCOMMAND=\"cat \/home\/borg\/.borg-passphrase\"\nborg list \/mnt\/goofys\/borg1\/\nborg check --debug -p --verify-data \/mnt\/goofys\/borg1\/<\/code><\/pre>\n<p><\/p>\n<p>Usamos o mesmo esquema para verificar os arquivos com antiv\u00edrus (post-fato). Afinal, os usu\u00e1rios carregam diversos conte\u00fados no Nextcloud e nem todos possuem antiv\u00edrus. Realizar a verifica\u00e7\u00e3o no momento do upload leva muito tempo e atrapalha os neg\u00f3cios.<\/p>\n<p><\/p>\n<p>A escalabilidade \u00e9 alcan\u00e7ada ao executar runners em diferentes n\u00f3s com diferentes etiquetas.<br \/>\nEm nossa monitoria, coletamos os status de backups atrav\u00e9s da API do GitLab em uma \u00fanica janela; se necess\u00e1rio, problemas s\u00e3o facilmente notados e tamb\u00e9m facilmente localizados.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Conclus\u00e3o<\/h2>\n<p><\/p>\n<p>Como resultado, sabemos com certeza que fazemos backups, que nossos backups s\u00e3o v\u00e1lidos, e os problemas que surgem levam pouco tempo e s\u00e3o resolvidos no n\u00edvel do administrador de plant\u00e3o. Os backups ocupam realmente pouco espa\u00e7o em compara\u00e7\u00e3o com tar.gz ou Bacula.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0421\u0422\u041e \u0432 \u00ab\u041c\u043e\u043b\u043d\u0438\u044f \u0410\u041a\u00bb, \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c IT \u0441\u0438\u0441\u0442\u0435\u043c, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Nextcloud. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u0441 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":86905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-86904","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=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\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\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\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\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\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-07-01T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-01T05:42:30+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\udd47Como o GitLab ajuda a realizar backups de grandes armazenamentos NextCloud | ProHoster","description":"Ol\u00e1, Habr! Hoje eu quero compartilhar nossa experi\u00eancia na automa\u00e7\u00e3o do backup de grandes dados armazenados no Nextcloud em diferentes configura\u00e7\u00f5es.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","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\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","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-07-01T05:42:30+00:00","article:modified_time":"2020-07-01T05:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"86904","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 14:03:54","updated":"2022-10-06 09:05:46","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\/86904","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=86904"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/86904\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/86905"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=86904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=86904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=86904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}