JavaRush /Blogue Java /Random-PT /Zookeeper ou como é a vida de um zookeeper
Viacheslav
Nível 3

Zookeeper ou como é a vida de um zookeeper

Publicado no grupo Random-PT
Zelador do zoológico ou como vive um funcionário do zoológico - 1

Introdução

Os aplicativos Java geralmente têm configurações diferentes. Por exemplo, endereço e porta de conexão. Por exemplo, poderia ficar assim se usássemos a classe Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
E isso parece ser suficiente, porque... podemos obter propriedades do arquivo. E tudo parece funcionar bem conosco em uma máquina. Mas imagine que nosso sistema comece a consistir em diferentes sistemas separados uns dos outros? Tal sistema também é chamado de sistemas distribuídos. Na Wikipedia você pode encontrar a seguinte definição: Sistemas distribuídos são sistemas cujos componentes estão localizados em diferentes computadores em rede que se comunicam entre si e coordenam suas ações trocando mensagens entre si. Você pode observar o seguinte diagrama:
Zelador do zoológico ou como vive um funcionário do zoológico - 2
Com esta abordagem, um único sistema é dividido em componentes. A configuração é um componente comum separado. Cada um dos outros componentes atua como cliente para o componente de configuração. Este caso é denominado " Configuração distribuída ". Existem muitas implementações diferentes de configuração distribuída. E na revisão de hoje proponho conhecer um deles, chamado Zookeeper.
Zelador do zoológico ou como vive um funcionário do zoológico - 3

Funcionário do zoológico

O caminho para conhecer o Zookeeper começa pelo site oficial: zookeeper.apache.org No site oficial você precisa ir até a seção “ Download ” . Nesta seção, baixe o arquivo no formato .tar.gz, por exemplo “zookeeper-3.4.13.tar.gz”. tar é um formato de arquivo tradicional para sistemas Unit. gz - significa que gzip é usado para compactar o arquivo. Se trabalharmos em uma máquina Windows, isso não deverá nos incomodar. A maioria dos arquivadores modernos (por exemplo, 7-zip ) pode funcionar perfeitamente com eles no Windows. Vamos extrair o conteúdo para algum diretório. Ao mesmo tempo, veremos a diferença - no disco no estado extraído ele ocupará aproximadamente 60 megabytes e baixamos um arquivo com cerca de 35 megabytes de tamanho. Como você pode ver, a compactação realmente funciona. Agora você precisa iniciar o Zookeeper. Em geral, Zookeeper é uma espécie de servidor. O Zookeeper pode ser executado em um de dois modos: Independente ou Replicado . Consideremos a opção mais simples, também conhecida como primeira opção - modo Standalone. Para que o Zookeper funcione, ele precisa de um arquivo de configuração. Portanto, vamos criá-lo aqui: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Para Windows, usaremos a recomendação do Medium: “ Instalando o Apache ZooKeeper no Windows ”. O conteúdo do arquivo de configuração será mais ou menos assim:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Vamos adicionar a variável de ambiente ZOOKEEPER_HOME contendo o caminho para o diretório raiz do zookeper (como nas instruções no meio) e também adicionar o seguinte fragmento à variável de ambiente PATH: ;%ZOOKEEPER_HOME%\bin; Além disso, o diretório especificado em dataDir deve existir, caso contrário, o Zookeeper não será capaz de iniciar o servidor. Agora podemos iniciar o servidor com segurança usando o comando: zkServer. Graças ao fato de o diretório Zookeeper ter sido adicionado à variável de ambiente path, podemos chamar comandos do Zookeper de qualquer lugar, não apenas do diretório bin.
Zelador do zoológico ou como vive um funcionário do zoológico - 4

ZNode

Conforme declarado na " Visão geral do Zookeeper ", os dados no Zookeper são representados na forma de ZNodes (nós) que são organizados em uma estrutura de árvore. Ou seja, cada ZNode pode conter dados e ter ZNodes filhos. Mais informações sobre a organização ZNode podem ser encontradas na documentação do Zookeeper: " Modelo de dados e namespace hierárquico ". Para trabalhar com Zookeeper e ZNode usaremos Zookeeper CLI (interface de linha de comando). Anteriormente, iniciamos o servidor usando o comando zkServer. Agora, para conectar, vamos executar. zkCli.cmd -server 127.0.0.1:2181 Se for bem-sucedido, uma sessão de conexão com o Zookeeper será criada e veremos aproximadamente a seguinte saída:
Zelador do zoológico ou como vive um funcionário do zoológico - 5
Curiosamente, mesmo imediatamente após a instalação, o Zookeeper já possui o ZNode. Possui o seguinte caminho:/zookeeper/quota
Zelador do zoológico ou como vive um funcionário do zoológico - 6
São as chamadas “ cotas ”. Conforme declarado em " Apache ZooKeeper Essentials ", cada ZNode pode ter uma cota associada a ele, limitando os dados que pode armazenar. Um limite para o número de znodes e a quantidade de dados armazenados pode ser especificado. Além disso, se este limite for ultrapassado, a operação com ZNode não será cancelada, mas será recebido um aviso sobre a ultrapassagem do limite. Recomenda-se ler sobre ZNode em " ZoKeeper Programmer's Guide: ZNodes ". Alguns exemplos de como você pode trabalhar com ZNode:
Zelador do zoológico ou como vive um funcionário do zoológico - 7
Também gostaria de observar que os ZNodes são diferentes. ZNodes regulares (a menos que você especifique sinalizadores adicionais) são do tipo " persistente ". Existe um ZNode do tipo " Nó Efêmero ". Esses ZNodes existem apenas durante a sessão de conexão do Zookeeper na qual foram criados. Existe um ZNode do tipo " Sequence Node ". Esses ZNodes são anexados a um número da sequência para garantir exclusividade. O nó de sequência pode ser persistente ou efêmero. Algumas informações básicas sobre o ZNode também são recomendadas aqui: “ Zokeeper ZNodes – Características e exemplo ”.
Zelador do zoológico ou como vive um funcionário do zoológico - 8

Observador ZNode

Eu também gostaria de falar sobre observadores. Detalhes sobre eles estão escritos na documentação do Zookeeper: " ZooKeeper Watches ". Resumindo, um observador é um gatilho único que é acionado por algum evento. Ao recuperar dados executando as operações getData(), getChildren() ou exist(), podemos criar um gatilho como uma ação adicional. Zookeeper garante a ordem em que o evento é processado. Além disso, a documentação afirma que antes de podermos ver o novo valor ZNode, veremos um evento sobre a alteração do valor antigo para o novo. Você pode ler mais sobre Watchers aqui: “ Relógios ZooKeeper – Recursos e Garantias ”. Para tentar isso, vamos usar a CLI novamente : Vamos supor que temos algum ZNode com um valor onde armazenamos o status de algum serviço:
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
Agora, se os dados /services/service1/statusmudarem, nosso gatilho único será acionado:
Zelador do zoológico ou como vive um funcionário do zoológico - 9
É interessante que ao nos conectarmos ao Zookeeper, também vemos como funciona o observador:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected é um dos possíveis eventos do Zookeper. Mais detalhes sobre isso podem ser encontrados na descrição da API.
Zelador do zoológico ou como vive um funcionário do zoológico - 10

Zelador do Zoológico e Java

Agora temos uma compreensão básica do que o Zookeeper pode fazer. Vamos agora trabalhar com isso por meio de Java, e não por meio da CLI. E para isso precisaremos de uma aplicação Java, na qual veremos como trabalhar com o Zookeeper. Para criar a aplicação, usaremos o sistema de construção de projetos Gradle . Utilizando o " plugin Gradle Build Init " criaremos o projeto. Para isso, vamos executar o comando: gradle init --type java-application Se o Gradle nos solicitar esclarecimentos, deixaremos os valores padrão (basta pressionar Enter). Agora vamos abrir o script de construção, ou seja, arquivo build.gradle. Ele contém uma descrição do que nosso projeto é feito e de quais artefatos (bibliotecas, frameworks) ele depende. Porque queremos usar o Zookeeper, então precisamos adicioná-lo. Portanto, vamos adicionar uma dependência do Zookeeper ao bloco de dependências:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Você pode ler mais sobre o Gradle na revisão: " Uma Breve Introdução ao Gradle ". Então, temos um projeto Java, conectamos a biblioteca Zookeeper a ele. Vamos escrever algo agora. Como lembramos, usando a CLI conectamos algo assim: zkCli.cmd -server 127.0.0.1:2181 Vamos declarar o atributo “servidor” na classe App no ​​método principal:
String server = "127.0.0.1:2181";
A conexão não é uma ação instantânea. Teremos que esperar de alguma forma na thread principal de execução do programa para que a conexão ocorra. Portanto, precisamos de um bloqueio. Vamos declarar abaixo:
Object lock = new Object();
Agora precisamos que alguém diga que a conexão foi estabelecida. Como lembramos, quando fizemos isso por meio da CLI, o observador trabalhou para nós. Portanto, no código Java tudo é exatamente igual. Nosso observador exibirá uma mensagem sobre a conclusão bem-sucedida e notificará todos que estiverem aguardando por meio de um cadeado. Vamos escrever um observador:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
Agora vamos adicionar a conexão ao servidor zooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Tudo é simples aqui. Ao executar o método main na thread principal do programa, pegamos o lock e solicitamos uma conexão com o zookeeper. Ao mesmo tempo, liberamos a fechadura e esperamos até que alguém agarre a fechadura e nos avise que podemos continuar. Quando a conexão for estabelecida, o observador funcionará. Ele verificará se o evento SyncConnected chegou (como lembramos, foi isso que o observador capturou através da CLI) e então escreverá uma mensagem. Em seguida, pegamos o bloqueio (já que o thread principal o liberou anteriormente) e notificamos todos os threads que aguardam o bloqueio que podemos continuar. O thread de processamento de eventos sai do bloco sincronizado, liberando assim o bloqueio. A thread principal recebeu uma notificação e, após aguardar a liberação do bloqueio, continua a execução, pois até receber o bloqueio, não poderá sair do bloco sincronizado e continuar trabalhando. Assim, utilizando multithreading e a API Zookeeper, podemos realizar diversas ações. A API Zookeeper é muito mais ampla do que a CLI permite. Por exemplo:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
Como você pode ver, ao criar um nó podemos configurar uma ACL. Esta é outra característica importante. ACLs são permissões que se aplicam a ações com ZNode. Existem muitas configurações, então recomendo que você consulte a documentação oficial para obter detalhes: “ Zookeeper ACL Permissions ”.
Zelador do zoológico ou como vive um funcionário do zoológico - 11

Conclusão

Por que lemos isso? Porque o Zookeeper é usado em outras tecnologias populares. Por exemplo, o Apache Kafka requer o Zookeeper, sobre o qual você pode ler no " Guia de início rápido do Kafka ". Ele também é usado no banco de dados NOSQL HBase, sobre o qual você pode ler mais no " Guia de início rápido do HBase ". Na verdade, muitos outros projetos usam o Zookeeper. Alguns deles estão listados em “ Usando o Zookeeper no Mundo Real ”. Espero ter respondido à pergunta “por quê”. A questão mais importante agora é: “O que vem a seguir?” Primeiro, você pode ler os seguintes livros sobre o tema Apache Zookeeper: Em segundo lugar, existem excelentes reportagens em vídeo sobre o Zookeeper. Visualização recomendada: Em terceiro lugar, existem vários artigos úteis que irão complementar a imagem do mundo: Esta é uma revisão muito curta, mas como palavra introdutória, espero que seja útil. #Viacheslav
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION