Explicando o Apache ZooKeeper

376

Estou tentando entender o ZooKeeper, como ele funciona e o que faz. Existe algum aplicativo comparável ao ZooKeeper?

Se você souber, como descreveria o ZooKeeper a um leigo?

Eu tentei o apache wiki, zookeeper sourceforge ... mas ainda não consigo me relacionar com ele.

Acabei de ler http://zookeeper.sourceforge.net/index.sf.shtml , então não existem mais serviços como este? É tão simples quanto replicar um serviço de servidor?

topgun_ivard
fonte
6
Semelhante, mas não é a resposta exata que você está procurando: stackoverflow.com/questions/1479442/real-world-use-of-zookeeper
zengr
Você pode ler este documento ZooKeeper: coordenação sem espera para sistemas de escala da Internet Escrito por dois Yahoo! engenheiros
yaphet
Aqui está uma palestra técnica que é uma introdução ao Apache ZooKeeper de Camille Fournier, CTO da RentTheRunway. Espero que seja útil.
Genadinik
@Luca Geretti ... De acordo com mim, o Zookeper fornece um conjunto de APIs para que possamos usá-lo para coordenar o aplicativo distribuído. Corrija-me se eu estiver enganado.
User3797438

Respostas:

434

Em poucas palavras, o ZooKeeper ajuda a criar aplicativos distribuídos.

Como funciona

Você pode descrever o ZooKeeper como um serviço de sincronização replicado com consistência eventual. É robusto, uma vez que os dados persistentes são distribuídos entre vários nós (esse conjunto de nós é chamado de "conjunto") e um cliente se conecta a qualquer um deles (ou seja, um "servidor" específico), migrando se um nó falhar; Enquanto a maioria estrita dos nós estiver funcionando, o conjunto de nós do ZooKeeper estará ativo. Em particular, um nó principal é escolhido dinamicamente por consenso dentro do conjunto; se o nó principal falhar, a função de mestre será migrada para outro nó.

Como as gravações são tratadas

O mestre é a autoridade para gravações: dessa maneira, pode-se garantir que as gravações sejam mantidas em ordem, ou seja, gravações são lineares . Cada vez que um cliente grava no conjunto, a maioria dos nós persiste as informações: esses nós incluem o servidor para o cliente e, obviamente, o mestre. Isso significa que cada gravação atualiza o servidor com o mestre. Isso também significa, no entanto, que você não pode ter gravações simultâneas.

A garantia de gravações lineares é a razão do fato de o ZooKeeper não ter um bom desempenho para cargas de trabalho dominantes na gravação. Em particular, não deve ser usado para intercâmbio de dados grandes, como mídia. Desde que sua comunicação envolva dados compartilhados, o ZooKeeper o ajudará. Quando os dados podem ser gravados simultaneamente, o ZooKeeper realmente atrapalha, porque impõe uma ordem estrita de operações, mesmo que não seja estritamente necessário da perspectiva dos escritores. Seu uso ideal é para coordenação, onde as mensagens são trocadas entre os clientes.

Como as leituras são tratadas

É aqui que o ZooKeeper se destaca: as leituras são simultâneas, pois são atendidas pelo servidor específico ao qual o cliente se conecta. No entanto, esse também é o motivo da consistência eventual: a "visualização" de um cliente pode estar desatualizada, pois o mestre atualiza o servidor correspondente com um atraso limitado mas indefinido.

Em detalhe

O banco de dados replicado do ZooKeeper compreende uma árvore de znodes , que são entidades que representam aproximadamente os nós do sistema de arquivos (pense neles como diretórios). Cada znode pode ser enriquecido por uma matriz de bytes, que armazena dados. Além disso, cada znode pode ter outros znodes, praticamente formando um sistema de diretório interno.

Znodes sequenciais

Curiosamente, o nome de um znode pode ser seqüencial , o que significa que o nome que o cliente fornece ao criar o znode é apenas um prefixo: o nome completo também é fornecido por um número sequencial escolhido pelo conjunto. Isso é útil, por exemplo, para fins de sincronização: se vários clientes desejam obter um bloqueio em um recurso, cada um pode criar simultaneamente um znode seqüencial em um local: quem obtém o número mais baixo tem direito ao bloqueio.

Znodes efêmeros

Além disso, um znode pode ser efêmero : isso significa que é destruído assim que o cliente que o criou se desconecta. Isso é útil principalmente para saber quando um cliente falha, o que pode ser relevante quando o próprio cliente tem responsabilidades que devem ser assumidas por um novo cliente. Tomando o exemplo do bloqueio, assim que o cliente com o bloqueio for desconectado, os outros clientes poderão verificar se têm direito ao bloqueio.

Relógios

O exemplo relacionado à desconexão do cliente pode ser problemático se for necessário pesquisar periodicamente o estado dos znodes. Felizmente, o ZooKeeper oferece um sistema de eventos em que um relógio pode ser configurado em um znode. Esses relógios podem ser configurados para acionar um evento se o znode for especificamente alterado ou removido ou se novos filhos forem criados sob ele. Isso é claramente útil em combinação com as opções seqüenciais e efêmeras para znodes.

Onde e como usá-lo

Um exemplo canônico do uso do Zookeeper é o cálculo da memória distribuída, onde alguns dados são compartilhados entre os nós do cliente e devem ser acessados ​​/ atualizados de uma maneira muito cuidadosa para considerar a sincronização.

O ZooKeeper oferece a biblioteca para construir suas primitivas de sincronização, enquanto a capacidade de executar um servidor distribuído evita o problema de ponto único de falha que você possui ao usar um repositório de mensagens centralizado (semelhante a um broker).

O ZooKeeper é leve, o que significa que mecanismos como eleição do líder, bloqueios, barreiras etc. ainda não estão presentes, mas podem ser escritos acima das primitivas do ZooKeeper. Se a API C / Java for muito pesada para seus propósitos, você deve confiar em bibliotecas criadas no ZooKeeper, como gaiolas e, principalmente, curador .

Onde ler mais

Além da documentação oficial, o que é bastante bom, sugiro ler o Capítulo 14 do Hadoop: O Guia Definitivo, que possui ~ 35 páginas explicando essencialmente o que o ZooKeeper faz, seguido de um exemplo de serviço de configuração.

Luca Geretti
fonte
2
Não sei se entendi o esquema de comunicação que você está sugerindo, mas você pode usar o ZooKeeper para "publicar" informações de um produtor e fazer com que vários consumidores as leiam. Se, por outro lado, existe apenas uma instância de cada tipo de servidor, há pouco benefício em usar o ZK.
Luca Geretti
57
Na IMO, isso não explica o que o ZooKeeper é para um leigo. Quando eu precisaria do ZooKeeper? O que eu escreveria para ele? Qual problema isso resolve? É um armazenamento de valores-chave? Um motor de busca? Um bloqueio distribuído? Por que escolheria o ZooKeeper em vez de, por exemplo, Redis ou um arquivo ou JIRA ou post-it notes? Você sabe claramente muito sobre o ZooKeeper - mas pode explicar menos tecnicamente?
precisa saber é o seguinte
11
Como o Zookeeper tem gravações lineares, isso não me impede de usar APIs assíncronas para criar nós e receber a resposta em um retorno de chamada? Embora internamente possa não permitir gravações simultâneas, ou estou perdendo alguma coisa?
jdk2588
11
"Cada vez que um cliente grava no conjunto, a maioria dos nós persiste as informações: esses nós incluem o servidor para o cliente e, obviamente, o mestre" => você poderia me indicar um documento. ou algo onde isso é explicado? Gostaria de saber se é possível que uma alteração de estado tenha sido feita com êxito, excluindo o servidor ao qual o cliente está conectado (nesse caso, o cliente pode experimentar o estranho comportamento de não conseguir ler sua própria gravação por um momento)
senseiwu 22/02
2
Completamente e totalmente antitético à pergunta. Se fosse um relógio, ele procuraria "dispositivo de controle do tempo", não uma descrição da mola principal, trem de roda, escapamento e sua interação com base no período de oscilação, momento de inércia e no impacto de cristais de safira artificiais.
Rick O'Shea
10

O Zookeeper é um dos melhores servidores e serviços de código aberto que ajuda a coordenar de forma confiável os processos distribuídos. O Zookeeper é um sistema CP (consulte o Teorema do CAP) que fornece tolerância de consistência e partição. A replicação do estado do Zookeeper em todos os nós o torna um serviço distribuído eventualmente consistente.

Além disso, qualquer líder recém-eleito atualizará seus seguidores com propostas ausentes ou com um instantâneo do estado, se houver muitas propostas faltando.

O Zookeeper também fornece uma API muito fácil de usar. Esta postagem no blog, exemplos da API Java do Zookeeper , tem alguns exemplos, se você estiver procurando por exemplos.

Então, onde usamos isso? Se o seu serviço distribuído precisar de um gerenciamento de configuração centralizado, confiável e consistente, bloqueios, filas etc., você encontrará o Zookeeper uma opção confiável.

Binu George
fonte
4
"O Zookeeper é um sistema de CP (consulte o Teorema do CAP) que fornece tolerância de consistência e partição", acho que o Zookeeper tem mestre e seguidores, quando o mestre desce, então um dos seguidores seria eleito como Líder, portanto o Zookeeper deve fornecer o AP, no entanto, o C é eventualmente consistente.
YuFeng Shen
5
Em termos do teorema da PAC, "C" na verdade significa linearizabilidade. O ZooKeeper de fato fornece "consistência sequencial" e significa que as atualizações dos clientes serão aplicadas na ordem em que foram recebidas. Isso é mais fraco que a linearizabilidade, mas ainda é muito forte, muito mais forte que a "consistência eventual". O tratador não é A e isso ocorre porque se o líder não puder ser eleito (sem quorum), o tratador falhará nas solicitações. É por isso que não está altamente disponível.
Binu George
7

Eu entendo o ZooKeeper em geral, mas tive problemas com os termos "quorum" e "cérebro dividido", para que talvez eu possa compartilhar minhas descobertas com você (considero-me também um leigo).

Digamos que temos um cluster do ZooKeeper de 5 servidores. Um dos servidores se tornará o líder e os outros se tornarão seguidores.

  • Esses 5 servidores formam um quorum. Quorum significa simplesmente "esses servidores podem votar em quem deve ser o líder".

  • Portanto, a votação é baseada na maioria. Maioria significa simplesmente "mais da metade", portanto mais da metade do número de servidores deve concordar que um servidor específico se torne o líder.

  • Portanto, existe essa coisa ruim que pode acontecer chamada "cérebro dividido". Um cérebro dividido é simplesmente isso, pelo que entendi: o cluster de 5 servidores se divide em duas partes, ou vamos chamá-lo de "equipes de servidores", com talvez uma parte de 2 e a outra de 3 servidores. Esta é realmente uma situação ruim, como se ambas as "equipes de servidores" precisassem executar uma ordem específica. Como você decidiria qual equipe deveria ser preferida? Eles podem ter recebido informações diferentes dos clientes. Portanto, é realmente importante saber qual "equipe do servidor" ainda é relevante e qual pode / deve ser ignorada.

  • Maioria também é a razão pela qual você deve usar um número ímpar de servidores. Se você tem 4 servidores e um cérebro dividido em que 2 servidores separados, as duas "equipes de servidores" podem dizer "ei, queremos decidir quem é o líder!" mas como você deve decidir quais 2 servidores deve escolher? Com 5 servidores, é simples: a equipe de servidores com 3 servidores tem a maioria e pode selecionar o novo líder.

  • Mesmo que você tenha apenas 3 servidores e um deles falhe, os outros 2 ainda formam a maioria e podem concordar que um deles se tornará o novo líder.

Percebo que depois de pensar um pouco e entender os termos, não é mais tão complicado. Espero que isso também ajude alguém a entender esses termos.

Investir
fonte
1

O Zookeeper é um servidor de código aberto centralizado para manter e gerenciar informações de configuração, convenções de nomenclatura e sincronização para o ambiente em cluster distribuído. O Zookeeper ajuda os sistemas distribuídos a reduzir sua complexidade de gerenciamento, fornecendo baixa latência e alta disponibilidade. O Zookeeper foi inicialmente um subprojeto do Hadoop, mas agora é um projeto independente de nível superior da Apache Software Foundation.

Mais Informações

neel4soft
fonte
2
O que faz você dizer que o tratador é centralizado? O tratador pode e deve ser executado distribuído.
Benjamin Hammer Nørgaard