Linux zookeeper

From John Freier
Jump to: navigation, search

ZooKeeper is a cluster operator that stores values to be shared across multiply clients.

Shell Commands

The server works by using things called znodes, kind of like a file system /

This shell is very helpful for debugging issue and understand what Zoo Keeper does under the hood.

To Start the shell

 ./zkCli.sh -server localhost:2181
 ls - list out the directory
 create /test - creates the znode test
 get /test - gets the data for the znode


Spring Cloud ZooKeeper

This framework helps manage the clients that connect to zookeeper. You can also use this for sharing values amongst a cluster.

To start, I followed the spring guide and created an empty application with @EnableDiscoveryClient

 package com.example.zookeeper.zkexample;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @SpringBootApplication
 @EnableDiscoveryClient
 @RestController
 public class ZkExampleApplication {
 
     @RequestMapping("/")
     public String hello() {
         return "hello";
     }
 
     public static void main(String[] args) {
         SpringApplication.run(ZkExampleApplication.class, args);
     }
 
 }

After I create this, I ran it with the following command

 mvn spring-boot:run -Dserver.port=8081

Then I check zookeeper cli and looked for the znode

 ls /services/application

and what was returned was

 [959427f8-5629-4dcb-a606-2ed310134f8f]

When I started up another server

 mvn spring-boot:run -Dserver.port=8082

Then I ls the same location I found another znode.

 [959427f8-5629-4dcb-a606-2ed310134f8f, 106e739e-7422-414d-8cca-8d57fb443290]


I then created a method in class that returned all the URI of all the clients connected.

 @Autowired
 private DiscoveryClient discoveryClient;
 
 public String serviceUrl() {
 
         List<ServiceInstance> list = discoveryClient.getInstances("application");
         
         String result = list.stream().map(instance -> { return instance.getUri().toString(); }).collect(Collectors.joining(","));
 
         return result;
 }

When I hooked this up to a rest end point I was able to display all connected clients to zookeeper.

     @RequestMapping("/")
     public String hello() {
 
         System.out.println("appName:" + appName);
         System.out.println("services:" + discoveryClient.getServices());
 
         return serviceUrl();
     }

What I found out is that when spring-boot starts up it creates an instance of ServerInstance in ZooKeeper and this is retrievable. When I shutdown a client the znode was removed.

This is an easy but limited frame work for quick clustering of nodes. For any more in detailed work or customizing I would go with just implementing ZooKeeper client directly in java.

Resources

https://zookeeper.apache.org/doc/r3.3.3/zookeeperStarted.html https://cloud.spring.io/spring-cloud-zookeeper/