一、zookeeper搭建
1、下载zookeeper

2、在Linux下面解压
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
3、配置zoo.cfg文件
在conf目录下复制zoo_sample.cfg文件。然后配置zoo.cfg
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
4、至此单机模式已经配置好了。
启动:会查找zoo.cfg文件
bin/zkServer.sh stop 停止服务,restart重启服务。
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
测试链接
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 

5、配置集群
client-port:供客户端连接服务的端口
server.x=ip:端口1:端口2
x:表示每个server的 myid文件中的值。
ip:每台服务器ip,如果是本地服务,对应ip可以配置为127.0.0.1。
端口1:是该服务器和集群中的Leader交换信息所用的端口
端口2:集群服务器选举Leader时所用

分别设置dataDir=/home/zookeeper/da ta
dataDir=/etc/zookeeper/da ta
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
在这两个目录下分别见myid文件,内容分别为1,2
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
启动:bin/zkServer.sh start   |    stop   | restart
测试:
1、zookeeper搭建 - lc793502240 - lc793502240的博客
 
在第一台服务器上创建的节点,能连第二台服务器进行访问,则集群搭建成功。

多台电脑可通过虚拟机实现。

1、zookeeper搭建 - lc793502240 - lc793502240的博客


二、Java连接zookeeper测试

package lc.java.zookeeper;

imp ort java.io.IOException;
imp ort java.util.List;

imp ort org.apache.zookeeper.AsyncCallback.StringCallback;
imp ort org.apache.zookeeper.CreateMode;
imp ort org.apache.zookeeper.KeeperException;
imp ort org.apache.zookeeper.WatchedEvent;
imp ort org.apache.zookeeper.Watcher;
imp ort org.apache.zookeeper.Watcher.Event.EventType;
imp ort org.apache.zookeeper.Watcher.Event.KeeperState;
imp ort org.apache.zookeeper.ZooDefs.Ids;
imp ort org.apache.zookeeper.ZooKeeper;

/**
 * 
 * @author liuchong
 *
 */
public class MyApp2 {

    public static void main(String[] args) {
        String connectString = "192.168.127.220:2181";
        int sessionTimeout = 500000;  // 会话时间。设置长一点,如果不够长,则会connect loss
        try {
            // 建立zookeeper链接
            ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, new Watcher(){
                public void process(WatchedEvent event) {
                    // 监控所有触发的事件
                    System.out.println("start do something");
                    EventType type = event.getType();        // 事件类型。枚举
                    KeeperState state = event.getState();    // 状态。 枚举
//                    type.getIntValue();
                    switch (type) {  
                    case None:  // int值对应 -1
                        System.out.println("none 事件触发");
                        break;
                    case NodeCreated:  // int值对应 1
                        System.out.println("创建节点事件发生了");
                        break;
                    case NodeDeleted:  // int值对应 2
                        System.out.println("删除节点事件发生了");
                        break;
                    case NodeDataChanged:  // int值对应 3
                        System.out.println("节点数据改变事件发生了");
                        break;
                    case NodeChildrenChanged:  // int值对应 4
                        System.out.println("子节点改变事件发生了");
                        break;
                    default:
                        System.out.println("I do not know what operate you do");
                        break;
                    }
//                    state.getIntValue();  NoSyncConnected 1和Unknown-1
                    switch (state) {
                    case Disconnected:  // 0
                        System.out.println("失去连接");
                        break;
                    case SyncConnected:  // 3
                        System.out.println("异步链接");
                        break;
                    case Expired:  // -112
                        System.out.println("超时过期");
                        break;
                    default:
                        break;
                    }

                    System.out.println("end");
                }
            });
            List<String> list = zk.getChildren("/", true); // 获取所有节点
            if(list != null) {
                for(String s : list)
                    System.out.println(s);
            }
            // 在/app5节点下创建child节点
            zk.create("/app5/child", "/app5的子节点数据".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 会对数据持久化,服务下次启动任然存在
            zk.create("/app6/child", "/app6的子节点数据".getBytes(), Ids.OPEN_ACL_UNSAFE, 
                    CreateMode.PERSISTENT, new StringCallback(){
                @Override
                public void processResult(int rc, String path, Object ctx, String name) {
                    System.out.println("rc: " + rc);
                    System.out.println("path: " + path);
                    System.out.println("Object:" + ctx);
                    System.out.println("name: " + name);
                }
            }, "ctx object");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}运行结果:
2、简单Java连接zookeeper测试 - lc793502240 - lc793502240的博客
  2、简单Java连接zookeeper测试 - lc793502240 - lc793502240的博客

如果节点存在了,再创建一样的节点,则会报错。
2、简单Java连接zookeeper测试 - lc793502240 - lc793502240的博客



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐