Na Parte 1 desta série sobre snapshots do Apache HBase, você aprendeu a usar o novo recurso Snapshots e um pouco de teoria por trás da implementação. Agora, é hora de mergulhar nos detalhes técnicos um pouco mais profundamente.
O que é uma Tabela?
Uma tabela HBase compreende um conjunto de informações de metadados e um conjunto de pares chave/valor:
- Informações da tabela :um arquivo de manifesto que descreve as "configurações" da tabela, como famílias de colunas, codecs de compactação e codificação, tipos de filtro bloom e assim por diante.
- Regiões :As “partições” da tabela são chamadas de regiões. Cada região é responsável por lidar com um conjunto contíguo de chaves/valores, e eles são definidos por uma chave inicial e uma chave final.
- WALs/MemStore :Antes de gravar dados no disco, as puts são gravadas no Write Ahead Log (WAL) e, em seguida, armazenadas na memória até que a pressão da memória acione uma liberação para o disco. O WAL fornece uma maneira fácil de recuperar puts não liberados para o disco em caso de falha.
- Arquivos :Em algum momento, todos os dados são liberados para o disco; um HFile é o formato HBase que contém a chave/valores armazenados. HFiles são imutáveis, mas podem ser excluídos na compactação ou na exclusão da região.
(Observação:para saber mais sobre o HBase Write Path, dê uma olhada na postagem do blog HBase Write Path.)
O que é um instantâneo?
Um instantâneo é um conjunto de informações de metadados que permite ao administrador voltar a um estado anterior da tabela em que foi usado. Um instantâneo não é uma cópia da tabela; a maneira mais simples de pensar nisso é como um conjunto de operações para acompanhar os metadados (informações e regiões da tabela) e os dados (HFiles, memstore, WALs). Nenhuma cópia dos dados está envolvida durante a operação de instantâneo.
- Instantâneos off-line :O caso mais simples para tirar um instantâneo é quando uma tabela está desabilitada. Desabilitar uma tabela significa que todos os dados são liberados no disco e nenhuma gravação ou leitura é aceita. Nesse caso, tirar um instantâneo é apenas uma questão de percorrer os metadados da tabela e os HFiles no disco e manter uma referência a eles. O mestre executa essa operação e o tempo necessário é determinado principalmente pelo tempo necessário pelo namenode HDFS para fornecer a lista de arquivos.
- Resumos on-line :Na maioria das situações, no entanto, as tabelas são habilitadas e cada servidor de região está processando solicitações de colocação e obtenção. Nesse caso, o mestre recebe a solicitação de instantâneo e solicita que cada servidor de região tire um instantâneo das regiões pelas quais é responsável.
A comunicação entre os servidores mestre e de região é feita via Apache ZooKeeper usando uma transação do tipo commit de duas fases. O mestre cria um znode que significa “preparar o instantâneo”. Cada servidor de região processará a solicitação e preparará o instantâneo para as regiões da tabela pela qual é responsável. Quando terminar, eles adicionam um sub-nó ao znode prepare-request com o significado de “Terminei”.
Uma vez que todos os servidores da região reportaram seu status, o mestre cria outro znode que significa “Commit snapshot”; cada servidor de região finalizará o instantâneo e relatará o status antes de ingressar no nó. Depois que todos os servidores da região reportarem, o mestre finalizará o instantâneo e marcará a operação como concluída. No caso de um servidor de região relatar uma falha, o mestre criará um novo znode usado para transmitir a mensagem de aborto.
Como o servidor de região está processando continuamente novas solicitações, diferentes casos de uso podem exigir modelos de consistência diferentes. Por exemplo, alguém pode estar interessado em um instantâneo desleixado sem os novos dados no MemStore, alguém pode querer um instantâneo totalmente consistente que exija gravações de bloqueio por um tempo e assim por diante.
Por esse motivo, o procedimento para obter uma captura instantânea no servidor da região é conectável. Atualmente, a única implementação presente é o “Flush Snapshot”, que executa um flush antes de tirar um snapshot e garante apenas consistência de linha. Outros procedimentos com diferentes políticas de consistência podem ser implementados no futuro.
No caso online, o tempo necessário para tirar um instantâneo é limitado pelo tempo exigido pelo servidor de região mais lento para executar a operação de instantâneo e relatar o sucesso de volta ao mestre. Esta operação é geralmente da ordem de alguns segundos.
Arquivando
Como vimos antes, HFiles são imutáveis. Isso nos permite evitar copiar os dados durante as operações de snapshot ou clone, mas durante a compactação eles são removidos e substituídos por uma versão compactada. Nesse caso, se você tiver um instantâneo ou uma tabela clonada que faça referência a um desses arquivos, em vez de excluí-los, eles serão movidos para um local de “arquivo”. Se você excluir um instantâneo e ninguém mais estiver referenciando os arquivos referenciados pelo instantâneo, esses arquivos serão excluídos.
Clonagem e restauração de tabelas
Os instantâneos podem ser vistos como uma solução de backup onde podem ser usados para restaurar/recuperar uma tabela após um erro de usuário ou aplicativo, mas o recurso de instantâneo pode permitir muito mais do que um simples backup e restauração. Depois de clonar uma tabela de um snapshot, você pode escrever um trabalho MapReduce ou um aplicativo simples para mesclar seletivamente as diferenças, ou o que você considera importante, na produção. Outro caso de uso é que você pode testar alterações de esquema ou atualizações nos dados sem ter que esperar horas por uma cópia da tabela e sem acabar com muitos dados duplicados no disco.
Clone uma tabela de um instantâneo
Quando um administrador executa uma operação de clonagem, uma nova tabela com o esquema de tabela presente no instantâneo é criada pré-dividida com as chaves de início/fim nas informações das regiões do instantâneo. Depois que os metadados da tabela são criados, em vez de copiar os dados, é usado o mesmo truque do instantâneo. Como os HFiles são imutáveis, apenas uma referência ao arquivo de origem é criada; isso permite que a operação evite cópias de dados e permite que o clone seja editado sem afetar a tabela de origem ou o instantâneo. A operação de clonagem é realizada pelo mestre.
Restaurar uma tabela a partir de um instantâneo
A operação de restauração é semelhante à operação de clonagem; você pode pensar nisso como excluir a tabela e cloná-la do instantâneo. A operação de restauração traz de volta os dados antigos presentes no snapshot removendo quaisquer dados da tabela que não estejam também no snapshot, e também o esquema da tabela é revertido para o do snapshot. Sob o capô, a restauração é implementada fazendo uma diferença entre o estado da tabela e o instantâneo, removendo arquivos que não estão presentes no instantâneo e adicionando referências àqueles no instantâneo, mas não presentes no estado atual. Além disso, o descritor da tabela é modificado para refletir o “esquema” da tabela no momento do instantâneo. A operação de restauração é realizada pelo mestre e a tabela deve ser desabilitada.
Futuros
Atualmente, a implementação do instantâneo inclui todas as funcionalidades básicas necessárias. Como vimos, as novas políticas de consistência de instantâneos para os instantâneos online podem fornecer mais flexibilidade, consistência ou melhorias de desempenho. Um melhor gerenciamento de arquivos pode reduzir a carga no nó de nome HDFS e melhorar o gerenciamento do espaço em disco. Além disso, métricas, UI da Web (Hue) e muito mais estão na lista de tarefas.
Conclusão
Os snapshots do HBase adicionam novas funcionalidades, como a “coordenação de procedimentos” usada pelo snapshot online ou o snapshot copy-on-write, restauração e clones.
Os instantâneos fornecem uma alternativa mais rápida e melhor às soluções artesanais de “backup” e “clonagem” baseadas em distcp ou CopyTable. Todas as operações de snapshot (snapshot, restore, clone) não envolvem cópias de dados, resultando em snapshots mais rápidos da tabela e economia de espaço em disco.
Para obter mais informações sobre como habilitar e usar instantâneos, consulte o documento de gerenciamento operacional do HBase.
Matteo Bertozzi é engenheiro de software na equipe da plataforma e HBase Committer.