Conceitos
Compressão de séries temporais (delta-de-delta e XOR)
Intuição
Imagine um caderno em que você anota, de minuto em minuto, a hora e a temperatura de uma sala. Quase sempre a leitura chega no ritmo certo e a temperatura quase não muda. Em vez de reescrever a hora completa e o número completo a cada linha, você anota só o que mudou em relação à linha anterior, e na maioria das vezes isso é 'nada mudou'. O caderno fica muito menor, e dá para manter as anotações recentes à mão, na memória, para consultar rápido.
Como funciona
No Gorilla, cada série é comprimida separadamente e em fluxo, ponto a ponto, usando só informação dos pontos anteriores; um ponto original ocupa 16 bytes (timestamp de 64 bits e valor double de 64 bits). Para os timestamps, como os dados costumam chegar em intervalo fixo, calcula-se o delta entre timestamps consecutivos e depois o delta-de-delta (deltas 60, 60, 59, 61 viram 0, -1, 2). A codificação tem tamanho variável: um único bit '0' quando o delta-de-delta é zero, e cabeçalhos '10', '110', '1110' e '1111' seguidos de 7, 9, 12 e 32 bits para faixas de valores cada vez maiores. Para os valores, faz-se o XOR do double atual com o anterior: se os valores são próximos, sinal, expoente e primeiros bits da mantissa coincidem, e o resultado tem muitos zeros à esquerda e à direita, com os bits relevantes agrupados no meio. Se o XOR é zero, grava-se um único bit '0'; senão grava-se '1' mais um bit de controle, que indica se os bits significativos cabem no mesmo bloco de zeros do valor anterior (grava-se só eles) ou se é preciso gravar de novo o número de zeros à esquerda (5 bits) e o comprimento do trecho significativo (6 bits). Os dados são organizados em blocos de duas horas, e blocos maiores comprimem melhor mas obrigam consultas curtas a decodificar mais. Juntas, as duas técnicas levaram o custo médio de 16 bytes para 1,37 byte por ponto, uma redução de 12x.
Na prática
Essa compressão foi o que permitiu ao Gorilla manter em RAM, como cache write-through sobre o HBase, as últimas 26 horas de dados, já que ao menos 85% das consultas pediam essa janela; as 26 horas couberam em 1,3 TB distribuídos em 20 máquinas no lançamento. O caminho de escrita foi desenhado para priorizar disponibilidade: cada escrita vai a duas instâncias independentes em regiões distintas, sem garantir consistência entre elas, e o log local aceita perder poucos dados em uma queda. Você escolheria essa abordagem para monitoramento e métricas, com escritas dominantes, leituras sobre dados recentes e agregações, e métricas de valores estáveis em intervalo regular.
Use em um desenho
Pratique na escola de System Design os casos que dependem deste conceito.