MO806/MC914 - Tópicos em Sistemas Operacionais
ZooKeeper
O
ZooKeeper é um sistema que oferece serviços de
coordenação para aplicações
distribuídas. O ZooKeeper
é distribuído
sob uma licença livre e é utilizado por empresas
como o Yahoo!. Veja também
uma página
da IBM sobre o Zookeeper.
Experimento 01
- Ativar uma conta no cluster do IC-03. Um aspecto muito relevante deste cluster é que todos os nós enxergam o mesmo sistema de arquivos!
- Instalar o ZooKeeper.
-
O Grupo01
da disciplina de Laborató de Sistemas Distribuídos
de 2s2010 fez um vídeo muito bom que pode servir de
guia. Note que atualmente a saída dos servidores é
redirecionada para zookeeper.out e não é
mais exibida na tela.
- Cuidado com o conflito de portas: cada grupo/pessoa
deverá escolher um conjunto distinto de portas para
operar, caso contrário, erros inesperados poderão
ocorrer.
Experimento 02
- Rodar o ZooKeeper Java Example com os códigos
Executor.java
e DataMonitor.java, seguindo o
segundo vídeo fornecido
pelo Grupo01
de 2s2010.
- Note que um dos comandos mostrado no vídeo deve ser
atualizado, de maneira a incluir todos os arquivos .jar do
diretório lib. Veja este Makefile
exemplo.
- Rodar uma receita do diretório recipes. Podemos
utilizar uma aplicação teste desenvolvida
pelo Grupo
1 de Laboratório de 2011. Uma cópia da
aplicação teste acoplada à
implementação atual das receitas está
disponível no diretório
zk_lock_imp. Infelizmente, esta implementação ainda não incorporou a correção do bug descrito em ZOOKEEPER-645 e não garante exclusão mútua.
Ideias para projeto
- Alterar o código da receita de locks, de maneira a implementar
algoritmo semelhante ao da glibc. Possíveis vantagens:
- código mais eficiente;
- diferenciação entre caso de falha no cliente que detém o lock e
liberação com sucesso.
Desvantagem:
- possibilidade de starvation (como na glibc)
- Criar biblioteca para contadores inteiros; Veja
issue ZOOKEEPER-686.
Dicas
- Veja a API do Zookeeper. A Class Zookeeper tem uma descrição dos principais métodos disponíveis.
- Para simular a operação de compare and exchange, muito empregada na glibc, será necessário utilizar a operação setData, com um número de versão adequado, obtido previamente via getData.