{"id":81936,"date":"2020-05-18T01:42:37","date_gmt":"2020-05-17T23:42:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera"},"modified":"2020-05-18T01:42:37","modified_gmt":"2020-05-17T23:42:37","slug":"szhatie-dannyh-v-apache-ignite-opyt-sbera","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","title":{"rendered":"Compacta\u00e7\u00e3o de dados no Apache Ignite. Experi\u00eancia do Sber","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Compacta\u00e7\u00e3o de dados no Apache Ignite. Experi\u00eancia do Sber\" src=\"\/wp-content\/uploads\/2020\/05\/0e26c686b1f29e88e6be4b8df81ab668.jpg\" style=\"display:block;margin: 0 auto;\" \/>Ao lidar com grandes volumes de dados, pode surgir o problema agudo da falta de espa\u00e7o em disco. Uma das solu\u00e7\u00f5es para esse problema \u00e9 a compacta\u00e7\u00e3o, que permite aumentar os volumes de armazenamento com o mesmo equipamento. Neste artigo, vamos explorar como funciona a compacta\u00e7\u00e3o de dados no Apache Ignite. Ser\u00e3o descritas apenas as t\u00e9cnicas de compacta\u00e7\u00e3o implementadas dentro do produto. Outras t\u00e9cnicas de compacta\u00e7\u00e3o de dados (via rede, na mem\u00f3ria), tanto as implementadas quanto as n\u00e3o implementadas, ficar\u00e3o de fora.<\/p>\n<p>Assim, com o modo de persist\u00eancia ativado, como resultado das altera\u00e7\u00f5es de dados nos caches, o Ignite come\u00e7a a gravar no disco:<\/p>\n<ol>\n<li>Conte\u00fado dos caches<\/li>\n<li>Registro de grava\u00e7\u00e3o antecipada (Write Ahead Log, WAL)<\/li>\n<\/ol>\n<p>\nPara a compacta\u00e7\u00e3o do WAL, existe h\u00e1 algum tempo um mecanismo chamado WAL compaction. Na rec\u00e9m-lan\u00e7ada vers\u00e3o 2.8 do Apache Ignite, surgiram mais dois mecanismos que permitem comprimir dados no disco: compacta\u00e7\u00e3o de p\u00e1gina de disco para comprimir o conte\u00fado dos caches e compacta\u00e7\u00e3o de instant\u00e2neo de p\u00e1gina WAL para comprimir algumas entradas do WAL. Mais detalhes sobre esses tr\u00eas mecanismos abaixo.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Compacta\u00e7\u00e3o de p\u00e1gina de disco<\/h3>\n<p><\/p>\n<h4>Como funciona<\/h4>\n<p>\nPara come\u00e7ar, vamos rapidamente abordar como o Ignite armazena dados. A armazenamento utiliza mem\u00f3ria paginada. O tamanho da p\u00e1gina \u00e9 definido no in\u00edcio do n\u00f3 e n\u00e3o pode ser alterado posteriormente; al\u00e9m disso, o tamanho da p\u00e1gina deve ser uma pot\u00eancia de dois e m\u00faltiplo do tamanho do bloco do sistema de arquivos. As p\u00e1ginas s\u00e3o carregadas na RAM do disco conforme necess\u00e1rio, e o tamanho dos dados em disco pode exceder o volume de RAM alocada. Em caso de falta de espa\u00e7o na RAM para carregar uma p\u00e1gina do disco, p\u00e1ginas antigas, j\u00e1 n\u00e3o utilizadas, ser\u00e3o expulsas da RAM.<\/p>\n<p>No disco, os dados s\u00e3o armazenados da seguinte forma: para cada parti\u00e7\u00e3o de cada grupo de cache, \u00e9 criado um arquivo separado, nesse arquivo, em ordem crescente de \u00edndice, as p\u00e1ginas s\u00e3o dispostas uma ap\u00f3s a outra. O identificador completo da p\u00e1gina cont\u00e9m o identificador do grupo de cache, o n\u00famero da parti\u00e7\u00e3o e o \u00edndice da p\u00e1gina no arquivo. Assim, pelo identificador completo da p\u00e1gina, podemos determinar de forma inequ\u00edvoca o arquivo e o deslocamento interno do arquivo para cada p\u00e1gina. Informa\u00e7\u00f5es mais detalhadas sobre a arquitetura da mem\u00f3ria paginada podem ser encontradas em um artigo no Apache Ignite Wiki: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 por tr\u00e1s dos bastidores<\/a><\/noindex>.<\/p>\n<p>O mecanismo de compress\u00e3o de p\u00e1gina de disco, como pode ser deduzido pelo nome, opera em n\u00edvel de p\u00e1gina. Quando esse mecanismo \u00e9 ativado, o trabalho com os dados na RAM \u00e9 realizado sem qualquer compress\u00e3o, mas no momento da grava\u00e7\u00e3o das p\u00e1ginas da RAM para o disco, ocorre a compress\u00e3o.<\/p>\n<p>No entanto, comprimir cada p\u00e1gina individualmente n\u00e3o resolve o problema, \u00e9 necess\u00e1rio reduzir o tamanho dos arquivos finais com dados. Se o tamanho da p\u00e1gina deixar de ser fixo, n\u00e3o podemos mais escrever as p\u00e1ginas em um arquivo uma ap\u00f3s a outra, pois isso pode gerar uma s\u00e9rie de problemas:<\/p>\n<ul>\n<li>N\u00e3o seremos capazes de calcular o offset onde a p\u00e1gina est\u00e1 localizada no arquivo usando o \u00edndice da p\u00e1gina.<\/li>\n<li>N\u00e3o est\u00e1 claro o que fazer com as p\u00e1ginas que n\u00e3o est\u00e3o no final do arquivo e que mudam de tamanho. Se o tamanho da p\u00e1gina diminui, o espa\u00e7o que foi liberado \u00e9 perdido. Se o tamanho da p\u00e1gina aumenta, um novo local precisa ser encontrado no arquivo.<\/li>\n<li>Se a p\u00e1gina se deslocar por um n\u00famero de bytes que n\u00e3o seja m\u00faltiplo do tamanho do bloco do sistema de arquivos, a leitura ou grava\u00e7\u00e3o exigir\u00e1 o acesso a um bloco adicional do sistema de arquivos, o que pode levar \u00e0 degrada\u00e7\u00e3o do desempenho.<\/li>\n<\/ul>\n<p>\nPara evitar resolver esses problemas em seu n\u00edvel, a compress\u00e3o de p\u00e1gina de disco no Apache Ignite utiliza um mecanismo do sistema de arquivos conhecido como arquivos esparsos. Um arquivo esparso \u00e9 aquele em que algumas regi\u00f5es preenchidas com zeros podem ser marcadas como \"buracos\". Assim, blocos do sistema de arquivos n\u00e3o s\u00e3o alocados para armazenar esses buracos, resultando em economia de espa\u00e7o no disco.<\/p>\n<p>\u00c9 l\u00f3gico que, para liberar um bloco do sistema de arquivos, o tamanho do buraco deve ser maior ou igual ao bloco do sistema de arquivos, o que imp\u00f5e uma restri\u00e7\u00e3o adicional ao tamanho da p\u00e1gina no Apache Ignite: para que a compress\u00e3o tenha algum efeito, \u00e9 necess\u00e1rio que o tamanho da p\u00e1gina seja estritamente maior que o tamanho do bloco do sistema de arquivos. Se o tamanho da p\u00e1gina for igual ao tamanho do bloco, nunca conseguiremos liberar um \u00fanico bloco, pois, para liberar um \u00fanico bloco, a p\u00e1gina comprimida deve ocupar 0 bytes. Se o tamanho da p\u00e1gina for igual ao tamanho de 2 ou 4 blocos, j\u00e1 poderemos liberar pelo menos um bloco se nossa p\u00e1gina se comprimir em pelo menos 50% ou 75%, respectivamente.<\/p>\n<p>Assim, a descri\u00e7\u00e3o final do funcionamento do mecanismo \u00e9 a seguinte: ao gravar uma p\u00e1gina no disco, \u00e9 realizada uma tentativa de compactar a p\u00e1gina. Se o tamanho da p\u00e1gina compactada permitir a libera\u00e7\u00e3o de um ou mais blocos do sistema de arquivos, a p\u00e1gina \u00e9 gravada de forma compactada, e no lugar dos blocos liberados \u00e9 criada uma \"brecha\" (\u00e9 executada uma chamada de sistema <code>fallocate()<\/code> com a flag \"punch hole\"). Se o tamanho da p\u00e1gina compactada n\u00e3o permitir a libera\u00e7\u00e3o de blocos, a p\u00e1gina \u00e9 mantida como est\u00e1, em formato n\u00e3o compactado. Todos os offsets das p\u00e1ginas s\u00e3o considerados da mesma forma que sem compress\u00e3o, multiplicando o \u00edndice da p\u00e1gina pelo tamanho da p\u00e1gina. Nenhum realocamento das p\u00e1ginas \u00e9 necess\u00e1rio. Os offsets das p\u00e1ginas e como sem compress\u00e3o atingem as bordas dos blocos do sistema de arquivos.<\/p>\n<p><img decoding=\"async\" alt=\"Compacta\u00e7\u00e3o de dados no Apache Ignite. Experi\u00eancia do Sber\" src=\"\/wp-content\/uploads\/2020\/05\/6a6c6ad83d3b8591f76b9343ff067746.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNa implementa\u00e7\u00e3o atual, o Ignite pode trabalhar com arquivos sparse apenas no sistema operacional Linux, portanto a compress\u00e3o de p\u00e1ginas no disco pode ser ativada somente ao utilizar o Ignite nesse sistema operacional.<\/p>\n<p>Os algoritmos de compress\u00e3o que podem ser usados para compress\u00e3o de p\u00e1ginas no disco s\u00e3o: ZSTD, LZ4, Snappy. Al\u00e9m disso, existe um modo de opera\u00e7\u00e3o (SKIP_GARBAGE), onde apenas o espa\u00e7o n\u00e3o utilizado na p\u00e1gina \u00e9 descartado sem aplicar compress\u00e3o nos dados restantes, o que permite reduzir a carga no CPU em compara\u00e7\u00e3o com os algoritmos mencionados anteriormente.<\/p>\n<h4>Impacto no desempenho <\/h4>\n<p>\nInfelizmente, n\u00e3o realizei medi\u00e7\u00f5es reais de desempenho em ambientes reais, pois n\u00e3o planejamos usar esse mecanismo em produ\u00e7\u00e3o, mas podemos discutir teoricamente onde perderemos e onde ganharemos.<\/p>\n<p>Para isso, precisamos lembrar como ocorre a leitura e a grava\u00e7\u00e3o de p\u00e1ginas ao acess\u00e1-las:<\/p>\n<ul>\n<li>Durante a opera\u00e7\u00e3o de leitura, primeiro realiza-se a busca na RAM; se a busca falhar, a p\u00e1gina \u00e9 carregada na RAM a partir do disco pelo mesmo fluxo que realiza a leitura.<\/li>\n<li>Ao realizar a opera\u00e7\u00e3o de grava\u00e7\u00e3o, a p\u00e1gina na RAM \u00e9 marcada como suja, e a grava\u00e7\u00e3o f\u00edsica da p\u00e1gina no disco n\u00e3o ocorre imediatamente no fluxo que est\u00e1 gravando. Todas as p\u00e1ginas sujas s\u00e3o salvas no disco posteriormente, no processo de checkpoint, por fluxos separados.<\/li>\n<\/ul>\n<p>\nAssim, o impacto nas opera\u00e7\u00f5es de leitura \u00e9:<\/p>\n<ul>\n<li>Positivo (disk IO), devido \u00e0 redu\u00e7\u00e3o no n\u00famero de blocos lidos do sistema de arquivos.<\/li>\n<li>Negativo (CPU), devido \u00e0 carga adicional necess\u00e1ria para o funcionamento do sistema operacional com arquivos sparse. Tamb\u00e9m podem surgir implicitamente opera\u00e7\u00f5es de I\/O adicionais para salvar uma estrutura de arquivo sparse mais complexa (infelizmente, n\u00e3o estou familiarizado com todos os detalhes do funcionamento de arquivos sparse).<\/li>\n<li>Negativo (CPU), devido \u00e0 necessidade de descompress\u00e3o das p\u00e1ginas.<\/li>\n<li>N\u00e3o h\u00e1 influ\u00eancia nas opera\u00e7\u00f5es de grava\u00e7\u00e3o.<\/li>\n<li>Influ\u00eancia no processo de checkpoint (aqui \u00e9 tudo semelhante \u00e0s opera\u00e7\u00f5es de leitura):<\/li>\n<li>Positivo (disk I\/O), devido \u00e0 redu\u00e7\u00e3o do n\u00famero de blocos gravados no sistema de arquivos.<\/li>\n<li>Negativo (CPU, talvez disk I\/O), devido ao trabalho com arquivos sparse.<\/li>\n<li>Negativo (CPU), devido \u00e0 necessidade de compacta\u00e7\u00e3o das p\u00e1ginas.<\/li>\n<\/ul>\n<p>\nQual lado da balan\u00e7a ir\u00e1 pender? Isso depende muito do ambiente, mas eu inclino-me a acreditar que a compress\u00e3o de p\u00e1ginas no disco levar\u00e1 a uma degrada\u00e7\u00e3o de desempenho na maioria dos sistemas. Al\u00e9m disso, os testes em outros SGBDs que utilizam uma abordagem semelhante com arquivos sparse mostram uma queda de desempenho quando a compress\u00e3o est\u00e1 ativada.<\/p>\n<h4>Como habilitar e configurar<\/h4>\n<p>\nComo j\u00e1 mencionado acima, a vers\u00e3o m\u00ednima do Apache Ignite que suporta a compress\u00e3o de p\u00e1ginas no disco \u00e9 a 2.8 e \u00e9 suportada apenas pelo sistema operacional Linux. A ativa\u00e7\u00e3o e configura\u00e7\u00e3o s\u00e3o feitas da seguinte forma:<\/p>\n<ul>\n<li>No class-path deve haver o m\u00f3dulo ignite-compression. Por padr\u00e3o, ele est\u00e1 no pacote do Apache Ignite na diret\u00f3rio libs\/optional e n\u00e3o est\u00e1 inclu\u00eddo no class-path. Voc\u00ea pode simplesmente mover o diret\u00f3rio para um n\u00edvel acima em libs e assim, ao executar atrav\u00e9s do ignite.sh, ele ser\u00e1 inclu\u00eddo automaticamente.<\/li>\n<li>A persist\u00eancia deve estar ativada (Ativada atrav\u00e9s de <code>DataRegionConfiguration.setPersistenceEnabled(true))<\/code>.<\/li>\n<li>O tamanho da p\u00e1gina deve ser maior que o tamanho do bloco do sistema de arquivos (pode ser definido com <code>DataStorageConfiguration.setPageSize()<\/code> ).<\/li>\n<li>Para cada cache, cujos dados precisam ser comprimidos, \u00e9 necess\u00e1rio configurar o m\u00e9todo de compress\u00e3o na configura\u00e7\u00e3o e (opcionalmente) o n\u00edvel de compress\u00e3o (m\u00e9todos <code>CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()<\/code>).<\/li>\n<\/ul>\n<p><\/p>\n<h3>Compaction WAL<\/h3>\n<p><\/p>\n<h4>Como funciona<\/h4>\n<p>\nO que \u00e9 WAL e para que serve? Muito resumidamente: \u00e9 um di\u00e1rio onde ficam registrados todos os eventos que, no final, alteram o armazenamento em p\u00e1ginas. Sua principal finalidade \u00e9 permitir a recupera\u00e7\u00e3o em caso de falha. Qualquer opera\u00e7\u00e3o, antes de devolver o controle ao usu\u00e1rio, deve primeiro registrar um evento no WAL, para que, em caso de falha, seja poss\u00edvel reproduzir o di\u00e1rio e restaurar todas as opera\u00e7\u00f5es que o usu\u00e1rio recebeu uma resposta bem-sucedida, mesmo que essas opera\u00e7\u00f5es n\u00e3o tenham conseguido ser refletidas no armazenamento em p\u00e1ginas no disco (como j\u00e1 foi mencionado, a grava\u00e7\u00e3o real no armazenamento em p\u00e1ginas \u00e9 realizada em um processo chamado 'checkpoint', com algum atraso por diferentes threads).<\/p>\n<p>As grava\u00e7\u00f5es no WAL s\u00e3o divididas em l\u00f3gicas e f\u00edsicas. As l\u00f3gicas s\u00e3o as pr\u00f3prias chaves e valores. As f\u00edsicas refletem as altera\u00e7\u00f5es nas p\u00e1ginas do armazenamento em p\u00e1ginas. Enquanto as grava\u00e7\u00f5es l\u00f3gicas podem ser \u00fateis em outros casos, as grava\u00e7\u00f5es f\u00edsicas s\u00e3o necess\u00e1rias apenas para a recupera\u00e7\u00e3o em caso de falha e apenas precisam das grava\u00e7\u00f5es desde o \u00faltimo checkpoint bem-sucedido. Aqui n\u00e3o iremos nos aprofundar em detalhes e explicar por que isso funciona desse jeito, mas quem estiver interessado pode consultar o artigo mencionado no Apache Ignite Wiki: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 por tr\u00e1s dos bastidores<\/a><\/noindex>.<\/p>\n<p>Para cada grava\u00e7\u00e3o l\u00f3gica, frequentemente existem v\u00e1rias grava\u00e7\u00f5es f\u00edsicas. Ou seja, por exemplo, uma opera\u00e7\u00e3o de put no cache envolve v\u00e1rias p\u00e1ginas na mem\u00f3ria de p\u00e1ginas (a p\u00e1gina com os dados, as p\u00e1ginas com os \u00edndices, as p\u00e1ginas com listas livres). Em alguns testes sint\u00e9ticos, observei que as grava\u00e7\u00f5es f\u00edsicas ocupavam at\u00e9 90% do tamanho do arquivo WAL. No entanto, elas s\u00e3o necess\u00e1rias apenas por um curto per\u00edodo (por padr\u00e3o, o intervalo entre checkpoints \u00e9 de 3 minutos). Portanto, seria l\u00f3gico descartar esses dados ap\u00f3s a perda de sua relev\u00e2ncia. \u00c9 exatamente isso que o mecanismo de compacta\u00e7\u00e3o WAL faz: elimina grava\u00e7\u00f5es f\u00edsicas e comprime as grava\u00e7\u00f5es l\u00f3gicas restantes usando zip, reduzindo significativamente o tamanho do arquivo (\u00e0s vezes em v\u00e1rias dezenas de vezes).<\/p>\n<p>Fisicamente, o WAL consiste em v\u00e1rios segmentos (por padr\u00e3o, 10) de tamanho fixo (por padr\u00e3o, 64MB), que s\u00e3o sobrescritos em um ciclo. Assim que o segmento atual \u00e9 preenchido, o pr\u00f3ximo segmento \u00e9 designado como o atual, e o segmento preenchido \u00e9 copiado para um arquivo separado por um fluxo distinto. A compacta\u00e7\u00e3o do WAL j\u00e1 funciona com segmentos arquivados. Al\u00e9m disso, por meio de um fluxo separado, ele monitora a execu\u00e7\u00e3o de checkpoints e inicia a compacta\u00e7\u00e3o nos segmentos arquivados, cujas grava\u00e7\u00f5es f\u00edsicas j\u00e1 n\u00e3o s\u00e3o necess\u00e1rias.<\/p>\n<p><img decoding=\"async\" alt=\"Compacta\u00e7\u00e3o de dados no Apache Ignite. Experi\u00eancia do Sber\" src=\"\/wp-content\/uploads\/2020\/05\/ca8690ba7a350df9530f2ccf01c90975.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h4>Impacto no desempenho<\/h4>\n<p>\nComo a compacta\u00e7\u00e3o do WAL opera em um fluxo separado, n\u00e3o deve haver influ\u00eancia direta nas opera\u00e7\u00f5es em execu\u00e7\u00e3o. No entanto, ela ainda imp\u00f5e uma carga adicional ao CPU (compacta\u00e7\u00e3o) e ao disco (leitura de cada segmento do WAL do arquivo e grava\u00e7\u00e3o dos segmentos compactados), portanto, se o sistema estiver operando no limite, isso tamb\u00e9m resultar\u00e1 em degrada\u00e7\u00e3o de desempenho.<\/p>\n<h4>Como habilitar e configurar<\/h4>\n<p>\nA compacta\u00e7\u00e3o do WAL pode ser ativada por meio da propriedade <code>WalCompactionEnabled<\/code> em <code>DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)<\/code>). Al\u00e9m disso, usando o m\u00e9todo DataStorageConfiguration.setWalCompactionLevel(), \u00e9 poss\u00edvel definir o n\u00edvel de compacta\u00e7\u00e3o, se o valor padr\u00e3o (BEST_SPEED) n\u00e3o for satisfat\u00f3rio.<\/p>\n<h3>Compress\u00e3o de snapshot da p\u00e1gina WAL<\/h3>\n<p><\/p>\n<h4>Como funciona<\/h4>\n<p>\nJ\u00e1 foi determinado anteriormente que as grava\u00e7\u00f5es WAL se dividem em l\u00f3gicas e f\u00edsicas. Para cada altera\u00e7\u00e3o em cada p\u00e1gina na mem\u00f3ria de p\u00e1ginas, uma grava\u00e7\u00e3o f\u00edsica WAL \u00e9 gerada. As grava\u00e7\u00f5es f\u00edsicas, por sua vez, tamb\u00e9m se dividem em 2 subtipos: grava\u00e7\u00e3o de instant\u00e2nea de p\u00e1gina e grava\u00e7\u00e3o delta. Sempre que alteramos algo na p\u00e1gina e a traduzimos de um estado limpo para sujo, uma c\u00f3pia completa dessa p\u00e1gina \u00e9 armazenada no WAL (grava\u00e7\u00e3o de instant\u00e2nea de p\u00e1gina \u2014 snapshot da p\u00e1gina). Mesmo que tenhamos mudado apenas um byte, no WAL ser\u00e1 mantida uma grava\u00e7\u00e3o um pouco maior que o tamanho da p\u00e1gina. Se alterarmos algo em uma p\u00e1gina j\u00e1 suja, uma grava\u00e7\u00e3o delta \u00e9 gerada no WAL, a qual reflete apenas as mudan\u00e7as em rela\u00e7\u00e3o ao estado anterior da p\u00e1gina, e n\u00e3o a p\u00e1gina inteira. Como a limpeza do estado das p\u00e1ginas de sujo para limpo ocorre durante o processo de checkpoint, imediatamente ap\u00f3s o in\u00edcio do checkpoint, praticamente todas as grava\u00e7\u00f5es f\u00edsicas consistir\u00e3o apenas em snapshots de p\u00e1ginas (uma vez que todas as p\u00e1ginas imediatamente ap\u00f3s o in\u00edcio do checkpoint est\u00e3o limpas), ent\u00e3o, \u00e0 medida que nos aproximamos do pr\u00f3ximo checkpoint, a propor\u00e7\u00e3o de grava\u00e7\u00f5es delta come\u00e7a a crescer e \u00e9 redefinida no in\u00edcio do pr\u00f3ximo checkpoint. Medi\u00e7\u00f5es em alguns testes sint\u00e9ticos mostraram que a propor\u00e7\u00e3o de snapshots de p\u00e1ginas no volume total de grava\u00e7\u00f5es f\u00edsicas atinge 90%.<\/p>\n<p>A ideia da compress\u00e3o de snapshots de p\u00e1gina WAL consiste em comprimir os snapshots de p\u00e1ginas usando uma ferramenta j\u00e1 pronta para a compress\u00e3o de p\u00e1ginas (ver compress\u00e3o de p\u00e1ginas em disco). Nesse caso, as grava\u00e7\u00f5es WAL s\u00e3o mantidas sequencialmente em modo append-only, e n\u00e3o h\u00e1 necessidade de vincular as grava\u00e7\u00f5es aos limites dos blocos do sistema de arquivos, portanto, aqui, ao contr\u00e1rio do mecanismo de compress\u00e3o de p\u00e1ginas em disco, n\u00e3o precisamos de arquivos sparses, o que significa que esse mecanismo funcionar\u00e1 n\u00e3o apenas em sistemas operacionais Linux. Al\u00e9m disso, n\u00e3o importa o qu\u00e3o eficientemente conseguimos comprimir a p\u00e1gina. Mesmo que liberemos 1 byte, isso j\u00e1 \u00e9 um resultado positivo, e podemos armazenar dados comprimidos no WAL, ao contr\u00e1rio da compress\u00e3o de p\u00e1ginas em disco, onde armazenamos uma p\u00e1gina comprimida apenas se liberamos mais de 1 bloco do sistema de arquivos.<\/p>\n<p>As p\u00e1ginas s\u00e3o dados bem compact\u00e1veis, e sua participa\u00e7\u00e3o no volume total de WAL \u00e9 muito alta; assim, mantendo o formato do arquivo WAL, podemos obter uma redu\u00e7\u00e3o significativa em seu tamanho. A compress\u00e3o, incluindo registros l\u00f3gicos, exigiria uma mudan\u00e7a de formato e perda de compatibilidade, por exemplo, para consumidores externos interessados em registros l\u00f3gicos, sem trazer uma diminui\u00e7\u00e3o significativa no volume do arquivo.<\/p>\n<p>Assim como na compress\u00e3o de p\u00e1gina de disco, para a compress\u00e3o de instant\u00e2neos de p\u00e1gina WAL podem ser utilizados os algoritmos de compress\u00e3o ZSTD, LZ4, Snappy, bem como o modo SKIP_GARBAGE.<\/p>\n<h4>Impacto no desempenho<\/h4>\n<p>\nComo n\u00e3o \u00e9 dif\u00edcil perceber, a ativa\u00e7\u00e3o direta da compress\u00e3o de instant\u00e2neos de p\u00e1gina WAL afeta apenas os fluxos que gravam dados na mem\u00f3ria de p\u00e1gina, ou seja, aqueles que modificam dados nos caches. A leitura de registros f\u00edsicos WAL ocorre apenas uma vez, no momento da inicializa\u00e7\u00e3o do n\u00f3 ap\u00f3s uma falha (e somente no caso de uma falha durante o checkpoint).<\/p>\n<p>Isso afeta os fluxos que modificam dados da seguinte forma: obtemos um efeito negativo (CPU) devido \u00e0 necessidade de comprimir a p\u00e1gina antes de grav\u00e1-la no disco e um efeito positivo (disco IO) devido \u00e0 redu\u00e7\u00e3o da quantidade de dados gravados. Assim, aqui tudo \u00e9 simples: se o desempenho do sistema \u00e9 limitado pela CPU, obtemos uma pequena degrada\u00e7\u00e3o; se for pelo disco, obtemos um aumento.<\/p>\n<p>Indiretamente, a redu\u00e7\u00e3o no tamanho do WAL tamb\u00e9m impacta (positivamente) os fluxos que arquivam segmentos WAL e nos fluxos de compacta\u00e7\u00e3o WAL.<\/p>\n<p>Testes de desempenho reais em nosso ambiente com dados sint\u00e9ticos mostraram um pequeno aumento (a taxa de transfer\u00eancia aumentou em 10%-15%, a lat\u00eancia diminuiu em 10%-15%).<\/p>\n<h4>Como habilitar e configurar<\/h4>\n<p>\nA vers\u00e3o m\u00ednima do Apache Ignite: 2.8. A ativa\u00e7\u00e3o e configura\u00e7\u00e3o s\u00e3o realizadas da seguinte forma:<\/p>\n<ul>\n<li>No class-path deve haver o m\u00f3dulo ignite-compression. Por padr\u00e3o, ele est\u00e1 no pacote do Apache Ignite na diret\u00f3rio libs\/optional e n\u00e3o est\u00e1 inclu\u00eddo no class-path. Voc\u00ea pode simplesmente mover o diret\u00f3rio para um n\u00edvel acima em libs e assim, ao executar atrav\u00e9s do ignite.sh, ele ser\u00e1 inclu\u00eddo automaticamente.<\/li>\n<li>A persist\u00eancia deve estar ativada (Ativada atrav\u00e9s de <code>DataRegionConfiguration.setPersistenceEnabled(true)<\/code>).<\/li>\n<li>O modo de compress\u00e3o deve ser definido atrav\u00e9s do m\u00e9todo <code>DataStorageConfiguration.setWalPageCompression()<\/code>, por padr\u00e3o a compress\u00e3o est\u00e1 desativada (modo DISABLED).<\/li>\n<li>Opcionalmente, \u00e9 poss\u00edvel definir o n\u00edvel de compress\u00e3o usando o m\u00e9todo <code>DataStorageConfiguration.setWalPageCompression()<\/code>, os valores permitidos para cada um dos modos est\u00e3o dispon\u00edveis na javadoc para o m\u00e9todo.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>\nOs mecanismos de compress\u00e3o de dados discutidos no Apache Ignite podem ser utilizados de forma independente, mas tamb\u00e9m s\u00e3o permitidas combina\u00e7\u00f5es de todos eles. Compreender os princ\u00edpios de funcionamento permitir\u00e1 determinar qu\u00e3o adequados s\u00e3o para suas necessidades em seu ambiente e o que ser\u00e1 necess\u00e1rio sacrificar ao utiliz\u00e1-los. A compress\u00e3o de p\u00e1gina em disco \u00e9 destinada a comprimir o armazenamento principal e pode oferecer um n\u00edvel m\u00e9dio de compress\u00e3o. A compress\u00e3o de instant\u00e2neos de p\u00e1gina WAL proporcionar\u00e1 um n\u00edvel m\u00e9dio de compress\u00e3o para os arquivos WAL, possivelmente at\u00e9 aumentando o desempenho. A compacta\u00e7\u00e3o do WAL n\u00e3o afetar\u00e1 positivamente o desempenho, mas reduzir\u00e1 ao m\u00e1ximo o tamanho dos arquivos WAL, eliminando registros f\u00edsicos.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sberbank\/blog\/502136\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0430\u0445. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0436\u0430\u0442\u0438\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443, \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81937,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81936","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\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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-05-17T23:42:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-17T23:42:37+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\udd47Compress\u00e3o de dados no Apache Ignite. Experi\u00eancia do Sber | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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-05-17T23:42:37+00:00","article:modified_time":"2020-05-17T23:42:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81936","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 15:47:30","updated":"2022-10-02 17:21:32","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\/81936","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=81936"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/81936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/81937"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=81936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=81936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=81936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}