...

Compressão de páginas do MariaDB: poupar espaço de armazenamento com perdas mínimas de desempenho

Página do MariaDB A compressão reduz as necessidades de memória física, comprimindo as páginas do InnoDB antes de serem gravadas no disco, o que diminui significativamente os volumes de E/S. Vou mostrar-lhe como poupar memória e manter a latência baixa, quais são os pré-requisitos e quais as configurações que têm maior impacto na prática.

Pontos centrais

Estes pontos-chave concisos apresentam os aspetos mais importantes.

  • Página a página A compressão reduz o espaço ocupado e as operações de E/S.
  • Não comprimido O buffer pool limita a carga da CPU na RAM.
  • Flexível Ativação por tabela com PAGE_COMPRESSED.
  • sistema de ficheiros- O suporte para Sparse/Hole Punching é obrigatório.
  • Escolha do algoritmo controla a taxa, a latência e o consumo de CPU.

Como funciona, do ponto de vista técnico, a compressão de páginas do InnoDB

Compacto cada página InnoDB imediatamente antes de esta ser gravada no disco, de modo a que o espaço de tabela ocupe apenas os bytes efetivamente reduzidos e o sistema de ficheiros marque as áreas livres como «sparse». No Pool de buffer Continuo a manter as páginas não comprimidas, o que mantém baixo o consumo de CPU na memória principal e garante que os acessos de leitura frequentes continuem a ser rápidos. Por predefinição, as páginas InnoDB têm 16K, mas os blocos armazenados ficam variavelmente menores após a compressão, o que poupa muito espaço, especialmente em campos de texto ou JSON. Durante a leitura, descompacto a página logo após o carregamento na RAM, ou seja, exatamente no limite de E/S, onde a poupança na transmissão é mais significativa. Desta forma, transfiro a carga de E/S em relação à CPU, mas apenas nos casos em que tal se justifica.

Compressão de páginas vs. compressão clássica de tabelas InnoDB

A compressão clássica baseia-se em ROW_FORMAT=COMPRESSED e KEY_BLOCK_SIZE, o que cria um formato de página comprimido fixo e implica uma carga de decisão adicional durante a gravação ou atualização. Eu prefiro a Página Compressão, porque mantém a flexibilidade: se uma compressão não for bem-sucedida, o InnoDB pode armazenar a página sem compressão, sem alterar todo o formato do ficheiro. O buffer pool continua a funcionar com páginas de 16K sem compressão, o que agiliza os acertos na cache e mantém os percursos da CPU simples. Em cargas de trabalho OLTP típicas, com muitas inserções e atualizações moderadas, a compressão de páginas proporciona um melhor equilíbrio entre poupança de espaço e latência. Como resultado, obtenho frequentemente uma vantagem perceptível em termos de E/S, sem um overhead elevado em cada Atualização ao risco.

Requisitos e configuração básica

Para a compressão de páginas, assumo que o InnoDB está instalado e ativo innodb_file_per_table, para que cada tabela utilize o seu próprio espaço de tabela. O sistema de ficheiros é determinante: tem de suportar ficheiros esparsos e a técnica de «hole-punching», o que é o caso do ext4 e do XFS e que, em regra, está presente nos volumes modernos da nuvem. Para a escolha do algoritmo, defino o parâmetro `innodb_compression_algorithm`, normalmente `zlib`, `lz4` ou `lzo`, dependendo da taxa desejada e do perfil da CPU. Quem ponderar a camada de armazenamento beneficia de um formato compacto Comparação de sistemas de ficheiros e tem também em conta as opções de controladores e de volume. Desta forma, obtém-se uma Configuração, que poupa espaço, reduz as operações de E/S e funciona de forma fiável.

Ativação ao nível da tabela

Ativo a compressão de páginas por tabela, depois de verificar se as variáveis globais estão corretas, para poder abordar especificamente os registos que proporcionam o maior benefício possível. Para tabelas novas, defino as opções diretamente no DDL; no caso das tabelas existentes, um comando ALTER TABLE efetua a alteração através da reescrita. Defino o nível de compressão com PAGE_COMPRESSION_LEVEL; o comportamento depende do Algoritmo . Como a transição leva tempo, prevejo janelas de manutenção e verifico o espaço necessário com e sem compressão, com base em excertos de dados reais. É assim que verifico Despesas e um resultado sem surpresas.

CREATE TABLE log_entries (
    id BIGINT UNSIGNED PRIMARY KEY,
    created_at DATETIME NOT NULL,
    level VARCHAR(20),
    message TEXT
) ENGINE=InnoDB
  PAGE_COMPRESSED=1
  PAGE_COMPRESSION_LEVEL=6;

ALTER TABLE log_entries
  ENGINE=InnoDB,
  PAGE_COMPRESSED=1;

Poupança de espaço de armazenamento na prática

Quanto mais homogéneos e ricos em texto forem os dados, melhor será o efeito da Compressão; As tabelas de registo e de relatórios proporcionam, na maioria das vezes, efeitos significativos. Em cargas de trabalho típicas, vejo frequentemente uma redução de 40–60 % na memória ocupada com o zlib, enquanto o lz4 atende a muitos casos com 30–50 %, deixando assim mais largura de banda disponível. Os dados binários altamente distribuídos trazem menos benefícios, mas mesmo nesses casos os volumes de E/S e os custos reduzem-se frequentemente de forma notável. Faço sempre testes com instantâneos de produção no ambiente de staging, para obter rácios significativos e identificar picos de latência. O resultado: menos dados no suporte de armazenamento, tempos de transferência mais curtos, melhor Escalonamento.

Desempenho: Avaliar corretamente a relação entre E/S e CPU

Primeiro, verifico se o problema se encontra no suporte de dados ou no CPU é importante, pois é disso que depende a escolha do método de compressão. Em ambientes limitados em termos de E/S, os volumes de leitura e escrita diminuem significativamente, pelo que o desempenho efetivo aumenta, muitas vezes com apenas 5–10 % de carga adicional em comparação com tabelas não comprimidas, quando se utilizam algoritmos rápidos. Os sistemas limitados pela CPU beneficiam do lz4 ou do lzo, que funcionam muito rapidamente e atingem taxas apenas ligeiramente inferiores. Além disso, tenho em conta o Buffer de gravação dupla, porque influencia o comportamento de gravação e, juntamente com a compressão de páginas, determina as características de E/S. Uma vez que o conjunto de buffers permanece não comprimido, os acertos frequentes na cache quase não têm impacto na Latência de.

Escolha do algoritmo e nível de compressão

Eu decido o Algoritmo-Avalio com base em padrões de dados, velocidade de leitura/gravação e margem de CPU, em vez de me orientar apenas pela taxa de compressão. O Zlib proporciona frequentemente a maior poupança de espaço com um esforço computacional moderado, enquanto o lz4/lzo se destaca pela baixa latência. Utilizo o LZMA ou o bzip2 principalmente para arquivos ou tabelas que raramente são alteradas, uma vez que os custos de CPU são mais elevados. O nível de compressão (PAGE_COMPRESSION_LEVEL) regula a relação entre velocidade e esforço, embora com um utilidade marginal decrescente para além dos níveis médios. Uma breve série de medições com o conjunto de dados real permite identificar rapidamente a melhor Nível.

Algoritmo Taxa típica Custos da CPU Adequação Notas
zlib 40–60 % Médio Muitas tabelas OLTP/de relatórios Bom Equilíbrio em termos de taxa/latência
lz4 30–50 % Baixa Elevados requisitos de rendimento Muito rápido Descompressão
lzo 30–50 % Baixa Tarefas que envolvem muita escrita Baixa latência nas inserções
lzma 50–70 % Elevado Arquivos/dados inativos Para doenças raras Alterações
bzip2 50–70 % Elevado Histórias seletivas Devagar, boa audiência

Manter-se a par do monitorização e das métricas

Medo a taxa de transferência, a latência, a utilização da CPU e Pool de buffer-Taxa de acertos, porque só a visão global revela o efeito real. Uma diminuição dos volumes de E/S com uma latência estável ou melhor indica que a configuração está a funcionar bem. Se a utilização da CPU ultrapassar um nível saudável, verifico o algoritmo e o nível e, se necessário, mudo para o lz4. Além disso, tenho em conta o tamanho do redo log e o comportamento dos checkpoints, uma vez que ambos influenciam o perfil de gravação. A longo prazo, identifico tendências e posso reagir de forma proativa às alterações Cargas de trabalho reagir.

Planear cuidadosamente as cópias de segurança e a manutenção

As cópias de segurança completas e incrementais beneficiam da menor volume de dados, porque são copiados menos bytes, enquanto os dumps lógicos mantêm, na maioria das vezes, o seu tamanho. Testo os tempos de recuperação com dados reais, para poder ponderar a poupança de espaço obtida em relação ao tempo prático de recuperação. Documento as alterações no algoritmo ou no nível e verifico a compatibilidade das ferramentas de cópia de segurança com a versão do MariaDB utilizada. Além disso, valido a integridade após grandes operações ALTER TABLE, especialmente quando muitas tabelas foram convertidas para a compressão de páginas. Desta forma, a Hora de arranque previsível e a estratégia de segurança fiável.

Compreender o sistema de ficheiros e o nível de armazenamento

Para que os ficheiros esparsos funcionem, o sistema de ficheiros necessita de Perfuração, o que está disponível no ext4 e no XFS e é amplamente utilizado em configurações de alojamento. Presto atenção às opções de montagem e à profundidade da fila, uma vez que influenciam significativamente as características de E/S. No caso do ext4, verifico, por exemplo, os intervalos de commit e os modos de journaling, e tenho em conta o efeito da recolha de lixo (garbage collection) em SSD/NVMe. Uma análise das opções adequadas Opções do ext4 ajuda a ajustar os efeitos da compressão de páginas às características do sistema de ficheiros. É assim que utilizo o espaço físico Armazenamento é eficaz e evita efeitos secundários.

Guia prático para a introdução

Começo por criar um ambiente de teste e copio dados representativos da produção, para obter os primeiros valores de medição relativos à taxa, à latência e Rendimento . Depois, ativo a compressão de páginas, em primeiro lugar, em tabelas grandes, utilizadas principalmente para leitura, ou em arquivos com poucas atualizações. Avalio os resultados com base em indicadores claros e comparo-os com o estado inicial, antes de aplicar a alteração a outras tabelas. A comunicação atempada com as equipas de aplicações evita surpresas durante as janelas de manutenção e garante expectativas claras. Após cada expansão, ajusto o nível e Algoritmo até que a poupança de memória e a latência se situem no intervalo alvo.

Combinação com outras otimizações

Bons índices reduzem o número de páginas lidas, por isso verifico Cobertura do índice e cardinalidades regularmente. Consultas bem formuladas, junções adequadas e a utilização específica do EXPLAIN reduzem as operações de E/S e mantêm elevada a taxa de acertos na cache. Um tamanho de buffer pool suficientemente grande evita cargas desnecessárias a partir do disco e torna a sobrecarga da compressão no hotset praticamente imperceptível. No que diz respeito ao hardware, os SSDs e o NVMe compensam pelo elevado número de IOPS e pela baixa latência, o que reforça as vantagens da compressão de páginas. Em suma, a compressão interage com o design das consultas, o trabalho de indexação e Ampliação da capacidade de armazenamento juntas, formando assim um percurso de dados simplificado.

Compatibilidade, versões e limitações

Fico atento aos ambientes que suportam a compressão de páginas e aos seus limites. Em sistemas de ficheiros Linux comuns, como o ext4 e o XFS, o «hole-punching» funciona de forma estável. O ZFS comporta-se de forma diferente: uma vez que o «punching» não está disponível de forma equivalente nesse sistema, no ZFS opto mais pelo nativo Ativo a compressão ZFS e não utilizo a compressão de páginas. Em configurações de contentores com OverlayFS, prefiro montar o diretório de dados como uma montagem Bind a partir do anfitrião, para que o «punching» e os ficheiros esparsos funcionem de forma fiável. Além disso, não combino a compressão de páginas com a encriptação de tabelas InnoDB ao nível do ficheiro: a encriptação torna os dados, em grande parte, aleatórios para os algoritmos de compressão e, em alguns casos, também bloqueia o «punching». Quem necessite de ambas as funcionalidades deve optar pela encriptação de volume/sistema de ficheiros abaixo do InnoDB.

No que diz respeito ao tamanho da página InnoDB (innodb_page_size), costumo manter o valor em 16K. Tamanhos de página mais pequenos podem dificultar a compressão e aumentar os custos de gestão. As tabelas temporárias ou as tabelas MEMORY/de trabalho não são afetadas pela compressão de páginas – o ganho ocorre apenas no respetivo espaço de tabela .ibd.

Ativação, desativação e reconstruções sem surpresas

A alteração através do comando ALTER TABLE implica sempre uma reconstrução da tabela. Por isso, pretendo:

  • Janela de manutenção com SLAs claros e espaço de armazenamento suficiente para a cópia temporária.
  • Verificação prévia com EXPLAIN para ALTER, para ver o procedimento esperado (INPLACE/COPY, nível de LOCK).
  • Estratégia opcional de processamento em lotes: primeiro as tabelas grandes, que raramente são alteradas; depois, as de tamanho médio; e, por fim, as tabelas mais ativas – se for o caso.

Para desativar esta funcionalidade, sigo um procedimento simétrico e defino PAGE_COMPRESSED=0. Em seguida, executo um OPTIMIZE TABLE ou um novo ALTER-Rebuild, para que o tablespace volte a ser gravado sem lacunas e o consumo de espaço físico seja refletido de forma realista.

Carregamentos em massa, atualizações a quente e desfragmentação

No caso de grandes volumes de dados, ou faço o carregamento diretamente de forma comprimida, quando a E/S é limitada, ou acelero a importação carregando os dados sem compressão e, posteriormente, alterando o formato para PAGE_COMPRESSED com o comando ALTER TABLE. Posteriormente, a reconstrução impõe o layout ideal com o máximo efeito de «perfuração». No caso de tabelas com um grande número de atualizações no local (in-place), planeio reescritas regulares (OPTIMIZE TABLE ou rollovers de partição), pois as alterações repetidas podem reduzir as vantagens da compressão ao longo do tempo. Para colunas BLOB/TEXT, opto por um formato de linha moderno (por exemplo, DYNAMIC), para que os dados off-page de grande dimensão sejam geridos de forma eficiente e a vizinhança da página não aumente desnecessariamente.

Verificar e comprovar a eficácia

Para verificar se a compressão de páginas está a funcionar, utilizo comandos simples do sistema e vistas do MariaDB:

# Comparar tamanho aparente vs. blocos ocupados
ls -ls --block-size=1 *.ibd
du -h --apparent-size *.ibd
du -h *.ibd

# Verificar a extensão da fragmentação (punching) por ficheiro
filefrag -v your_table.ibd | tail -n +1

# No MariaDB: verificar o estado das tabelas e as opções DDL
SHOW TABLE STATUS LIKE 'log_entries'\G
SHOW CREATE TABLE log_entries\G

O tamanho aparente (ls) mantém-se no volume lógico de dados, enquanto mostra os blocos efetivamente ocupados. Uma diferença percetível indica que o «hole-punching» está a funcionar corretamente. Correlaciono esta medição com métricas de E/S (leituras/gravações por segundo, profundidade da fila, latência) e a utilização da CPU, para avaliar o efeito global.

Detalhes da cópia de segurança: como efetuar uma cópia de segurança e restaurar ficheiros «sparse» corretamente

Para que as cópias de segurança respeitem a poupança de espaço, certifico-me de que as ferramentas suportam o formato „sparse“. Ao copiar ficheiros físicos, utilizo os parâmetros adequados para que os espaços vazios não sejam «preenchidos»:

# Copiar mantendo as áreas esparsas
cp --sparse=always source.ibd dest.ibd
rsync -S --progress source.ibd dest.ibd
tar --sparse -cvf backup.tar /var/lib/mysql/datadir

# Verificar se o destino continua a ser esparso
du -h dest.ibd
ls -ls dest.ibd

No caso das cópias de segurança do tipo «snapshot» (por exemplo, ao nível do dispositivo de bloco), a poupança varia consoante o fornecedor. No caso dos dumps lógicos (mysqldump, mariadb-dump), o tamanho da exportação praticamente não se altera, mas os tempos de restauração diminuem se a reconstrução subsequente reativar a compressão de páginas, reduzindo assim os volumes de E/S durante a reconstrução.

Replicação, HA e implementações em ambiente de produção

A compressão de páginas funciona de forma transparente para a replicação e os binlogs, uma vez que são replicadas as alterações SQL e não as páginas comprimidas. Prefiro aplicar primeiro as alterações DDL nas réplicas e observar a latência e a E/S antes de alterar a configuração do servidor primário. Em topologias multi-fonte ou em cascata, certifico-me de que está definido um algoritmo adequado (innodb_compression_algorithm) em todos os pontos, para que um DDL idêntico tenha o mesmo comportamento. Para implementações sem tempo de inatividade, combino a mudança com planos de switchover/failover.

Ajuste mais aprofundado: perfis de E/S e pontos de verificação

Como a compressão altera o número e o tamanho dos blocos a gravar, ajusto os parâmetros de E/S do InnoDB de acordo com o novo perfil. Um valor realista para innodb_io_capacity (e *_max) ajuda a gerar checkpoints limpos, sem picos repentinos de flush. Verifico se o buffer de dupla gravação está em sintonia com a nova característica de gravação e monitorizo a relação entre páginas sujas e taxa de fsync. Em dispositivos com elevado paralelismo (NVMe), dimensiono os threads de gravação e a profundidade da fila do dispositivo de bloco, para que a menor quantidade de dados se traduza numa redução real da latência.

Resolução de problemas e dificuldades típicas

  • Picos de utilização da CPU após a ativação: Mudar o algoritmo para lz4/lzo ou reduzir moderadamente o PAGE_COMPRESSION_LEVEL; aumentar os conjuntos ativos no buffer pool.
  • A E/S diminui, mas a latência oscila: Verificar o checkpointing e a taxa de páginas sujas; os registos de redo demasiado pequenos provocam flushes frequentes.
  • Poupança de espaço inesperadamente reduzida: Verificar a estrutura dos dados (muitos campos binários/aleatórios), forçar a reconstrução, analisar os padrões BLOB/TEXT e, se necessário, mudar para o zlib.
  • Sem impacto no tamanho do ficheiro: Verificar se o sistema de ficheiros suporta a função „Hole-Punching“, evitar a camada de contentores, não «despreencher» a cópia esparsa.
  • Tabelas muito comentadas: Utilizar a compressão de páginas de forma seletiva; avaliar alternativas (comprimir apenas as tabelas de arquivo/registo).

Exemplos práticos de configuração

Para começar de forma organizada, considero que a configuração global deve ser sucinta e fácil de gerir:

[mysqld]
innodb_file_per_table=1
innodb_compression_algorithm=zlib   # ou lz4/lzo, dependendo do perfil
# ajustar outros parâmetros de E/S de acordo com a plataforma
# innodb_io_capacity=...
# innodb_io_capacity_max=...

Para cada tabela, defino explicitamente a compressão, para evitar efeitos colaterais indesejados. Após grandes importações ou muitas atualizações, utilizo o comando OPTIMIZE TABLE de forma seletiva, para recalibrar os espaços vazios e reduzir a fragmentação acumulada ao longo do tempo.

Brevemente resumido

A compressão de páginas do InnoDB reduz significativamente o consumo de memória e alivia a carga de E/S para a CPU, sem alterar o buffer pool. Algoritmos bem escolhidos, como o lz4 ou o zlib, proporcionam uma redução de 30 a 60 % em muitas cargas de trabalho e mantêm a latência dentro dos limites aceitáveis. São fundamentais um sistema de ficheiros com «hole-punching», a opção innodb_file_per_table e uma ativação correta ao nível da tabela. Quem realizar testes com dados reais, integrar monitorização e ajustar com precisão os níveis e os algoritmos, consegue custos baixos de forma sustentável, com um desempenho fiável Desempenho. Desta forma, poupa espaço, mantém os seus sistemas ágeis e ganha capacidade para lidar com conjuntos de dados cada vez maiores.

Artigos actuais

Servidor Linux com indicadores visualizados de «Pressure Stall Information» no centro de dados
Administração

Linux PSI para uma análise e monitorização precisas do desempenho

O Linux PSI (Pressure Stall Information) mostra em que medida a CPU, a memória e as E/S estão a limitar o desempenho do teu sistema. Descobre como ativar o PSI e como utilizá-lo para uma monitorização precisa do desempenho.