zookeeper-crud

    github:地址 https://github.com/github-ygy/zookeeper.git

安装

//安装zookeeper  3台vm本地ip 130 132 133
[root@localhost ~]# mkdir -p /usr/local/software
[root@localhost ~]#  mv zookeeper-3.4.5.tar.gz /usr/local/software/
[root@localhost ~]# cd /usr/local/software/
[root@localhost software]# tar -zxvf zookeeper-3.4.5.tar.gz  -C /usr/local/
[root@localhost software]# cd ..
[root@localhost local]# mv zookeeper-3.4.5/ zookeeper
 //配置环境变量
[root@localhost local]# vim /etc/profile   
# /etc/profile

       export  JAVA_HOME=/usr/local/jdk1.8.0_131
       export  ZOOKEEPER_HOME=/usr/local/zookeeper
       export  PATH=.:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
[root@localhost local]# source /etc/profile
//修改zookeeper配置
[root@localhost local]# cd ./zookeeper/conf/
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
[root@localhost conf]# vim zoo.cfg

dataDir=/usr/local/zookeeper/data
server.0 = 192.168.150.130:2888:3888
server.2 = 192.168.150.132:2888:3888
server.3 = 192.168.150.133:2888:3888
//创建myid文件
[root@localhost conf]# cd ..
[root@localhost zookeeper]# mkdir data
[root@rocketmq-nameserver2 zookeeper]# cd data/
[root@rocketmq-nameserver2 data]# vim myid
分别3台机器对应为 0 2 3 

//启动服务
[root@rocketmq-nameserver2 zookeeper]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@rocketmq-nameserver2 zookeeper]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
//查看日志 报错信息
java.net.NoRouteToHostException: No route to host (Host unreachable)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:224)
        at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:71)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:740)

//132 133是我新创建的vm 需要关闭防火墙
[root@localhost local]# ping 192.168.150.133   //网络无问题 
PING 192.168.150.133 (192.168.150.133) 56(84) bytes of data.
64 bytes from 192.168.150.133: icmp_seq=1 ttl=64 time=0.461 ms
64 bytes from 192.168.150.133: icmp_seq=2 ttl=64 time=0.374 ms
[root@localhost local]# service iptables stop      //关闭防火墙 
iptables: Flushing firewall rules: [  OK  ]
iptables: Setting chains to policy ACCEPT: filter [  OK  ]
iptables: Unloading modules: [  OK  ]
[root@localhost local]#  chkconfig iptables off  //查看状态 启动ok
[root@rocketmq-nameserver2 zookeeper]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

配置文件

tickTime: 基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔 tickTime时间就会发送一个心跳。

dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。

clientPort: 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper
会监听这个端口,接受客户端的访问请求。

initLimit: 这个配置项是用来配置 Zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 10 个心跳的时间(也就是 tickTime)长度Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是
10*2000=20 秒。

syncLimit: 这个配置项标识 Leader 与 Follower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime的时间长度,总的时间长度就是 5*2000=10 秒

server.A = B:C:D 
A表示这个是第几号服务器,
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader服务器交换信息的端口;
D 表示的是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader

crud

Zookeeper_Start
package test.ygy.alone;

import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

/**
 * Created by guoyao on 2017/8/24.
 */
public class Zookeeper_Start {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_Start.class);

    private static final String CONNECT_STRING="192.168.150.130:2181,192.168.150.132:2181,192.168.150.133:2181";

    private static final int SESSION_TIME_OUT= 10* 1000;  // 10秒

    private static CountDownLatch countDownLatch=new CountDownLatch(1);

    public static void main(String[] args) throws  Exception{

        //构造zookeeper
        //public ZooKeeper(String connectString,    // Zookeeper 连接服务器地址
        // int sessionTimeout,                      //会话超时时间(毫秒)
        // Watcher watcher,                         //事件通知处理器
        // long sessionId,                          //会话id
        // byte[] sessionPasswd,                    //会话秘钥   // 会话id 秘钥 复用可以恢复会话
        // boolean canBeReadOnly)                   //只读模式
        //创建最基本的zookeeper

        ZooKeeper zooKeeper = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, (x)-> {
            //获取事件的状态
            //Disconnected(0),
            //SyncConnected(3),
            //AuthFailed(4),
            //ConnectedReadOnly(5),
            //SaslAuthenticated(6),
            //Expired(-112);
            Watcher.Event.KeeperState keeperState=x.getState();
            //事件类型
            //None(-1),
            //NodeCreated(1),
            //NodeDeleted(2),
            //NodeDataChanged(3),
            //NodeChildrenChanged(4);
            Watcher.Event.EventType eventType=x.getType();
            if (Watcher.Event.KeeperState.SyncConnected == keeperState) {
                //建立了连接后,设置加入主线程
                countDownLatch.countDown();
                log.info(" 连接zookeeper 服务 ok ");
            }
        });

        //等待zookeeper连接结束
        countDownLatch.await();
        System.out.println( " main class over");
        zooKeeper.close();   //释放资源
    }
}
Zookeeper_Provider
package test.ygy.alone;

import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

/**
 * Created by guoyao on 2017/8/24.
 */
public class Zookeeper_Provider {
    private static final Logger log=LoggerFactory.getLogger(Zookeeper_Provider.class);

    private static final String CONNECT_STRING="192.168.150.130:2181,192.168.150.132:2181,192.168.150.133:2181";

    private static final int SESSION_TIME_OUT=10 * 1000;  // 10秒

    public static CountDownLatch countDownLatch=new CountDownLatch(1);

    public static ZooKeeper getZK() throws Exception {
        return new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, (x) -> {
            if (Watcher.Event.KeeperState.SyncConnected == x.getState()) {
                //建立了连接后,设置加入主线程
                countDownLatch.countDown();
                log.warn(" 连接zookeeper 服务 ok ");
            }
        });
    }
}
Zookeeper_CreateSyn
package test.ygy.alone;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by guoyao on 2017/8/24.
 */
public class Zookeeper_CreateSyn {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_CreateSyn.class);


    public static void main(String[] args) throws  Exception{

        ZooKeeper zk=Zookeeper_Provider.getZK();
        Zookeeper_Provider.countDownLatch.await();
        //创建节点
        //public void create(
        // String path,    //数据节点路径
        // byte[] data,    //节点数据
        // List<ACL> acl,   //acl策略
        // CreateMode createMode, // 节点类型 PERSISTENT 持久化  PERSISTENT_SEQUENTIAL 顺序持久化  EPHEMERAL 临时  EPHEMERAL_SEQUENTIAL 顺序临时
        // StringCallback cb,     // 异步回调方法
        // Object ctx)      //异步回调传递参数
        String result1=zk.create("/test-zk", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        log.warn(" result is " + result1);   //节点路径

        String result2=zk.create("/test-zk", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        log.warn(" result is " + result2);   // 报错,不能创建相同的节点

        String result3=zk.create("/test-zk-seq", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        log.warn(" result is " + result3);   // 节点路径 + 数字

        Thread.sleep(20000);
        log.warn( " main class over");
        zk.close();
    }
}
Zookeeper_CreateASyn
package test.ygy.alone;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by guoyao on 2017/8/24.
 */
public class Zookeeper_CreateASyn {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_CreateASyn.class);


    public static void main(String[] args) throws  Exception{

        ZooKeeper zk=Zookeeper_Provider.getZK();

        Zookeeper_Provider.countDownLatch.await();

        //异步调用参数说明
        //rc = -110 表示已经有此节点 -4 客户端与服务端断开连接 -112 会话已过期  0 接口调用成功
        //path 节点路径
        //接口传入 ctx 参数
        //实际zookeeper服务器节点创建路径(顺序节点后有数字)
        zk.create("/test-zk-asyn", "ygy-test1".
                        getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL, new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        log.warn(" rc = " + rc + " path = " + path + " ctx = " + ctx  + " name = " + name);
                    }
                }," param "
        );
        //23:32:32.772 [main-EventThread] WARN test.ygy.alone.Zookeeper_CreateASyn -  rc = 0 path = /test-zk-asyn ctx =  param  name = /test-zk-asyn
        zk.create("/test-zk-asyn", "ygy-test1".
                        getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL, new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        log.warn(" rc = " + rc + " path = " + path + " ctx = " + ctx  + " name = " + name);
                    }
                }," param "
        );
        //23:32:32.773 [main-EventThread] WARN test.ygy.alone.Zookeeper_CreateASyn -  rc = -110 path = /test-zk-asyn ctx =  param  name = null
        zk.create("/test-zk-asyn-seq", "ygy-test1".
                        getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL_SEQUENTIAL, new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        log.warn(" rc = " + rc + " path = " + path + " ctx = " + ctx  + " name = " + name);
                    }
                }," param "
        );
        //23:32:33.424 [main-EventThread] WARN test.ygy.alone.Zookeeper_CreateASyn -  rc = 0 path = /test-zk-asyn-seq ctx =  param  name = /test-zk-asyn-seq0000000003
        Thread.sleep(20000);
        log.warn( " main class over");
        zk.close();
    }
}
Zookeeper_delSynAsyn
package test.ygy.alone;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by guoyao on 2017/8/24.
 */
public class Zookeeper_delSynAsyn {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_delSynAsyn.class);


    public static void main(String[] args) throws  Exception{

        ZooKeeper zk=Zookeeper_Provider.getZK();
        Zookeeper_Provider.countDownLatch.await();


        //同步删除  只能删除叶子节点
        //public void delete(final String path,  //节点路径
        // int version,       //版本  指定为-1时为所有
        // VoidCallback cb,  //回调函数
        // Object ctx)       //参数
        //zk.delete("/test-zk",-1);

        //00:00:39.073 [main-EventThread] WARN test.ygy.alone.Zookeeper_delSynAsyn -  rc = 0 path = /test-zk ctx =  param
        zk.delete("/test-zk", -1, new AsyncCallback.VoidCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx) {
                log.warn(" rc = " + rc + " path = " + path + " ctx = " + ctx );
            }
        }," param ");

        Thread.sleep(20000);
        log.warn( " main class over");
        zk.close();
    }
}
Zookeeper_DataSynAsyn
package test.ygy.alone;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

/**
 * Created by guoyao on 2017/8/25.
 */
public class Zookeeper_DataSynAsyn  {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_Provider.class);

    //private static final String CONNECT_STRING="192.168.150.130:2181,192.168.150.132:2181,192.168.150.133:2181";

    private static final String CONNECT_STRING="www.ygy.com:2181";

    private static final int SESSION_TIME_OUT=10 * 1000;  // 10秒

    public static CountDownLatch countDownLatch=new CountDownLatch(1);

    private  static  ZooKeeper zooKeeper ;

    private static Stat stat=new Stat();  //数据信息(每次从zookeeper获取后将会被替换为获取的数据信息)

    public static void main(String[] args) throws  Exception {

         zooKeeper=getZkData();
        countDownLatch.await();

        zooKeeper.create("/zk-test", "ygy".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        //打印节点数据信息,同时开启watch事件
        log.warn("data = " + new String(zooKeeper.getData("/zk-test",true,stat )) );
        log.warn(" stat = "+ stat);

        //设置数据参数
        //public void setData(
        // String path,     //节点路径
        // byte[] data,     //数据
        // int version,    //版本
        // StatCallback cb,   //回调函数
        // Object ctx) {     //回调函数 param

        //同步
        //修改数据,触发watch事件
        //zooKeeper.setData("/zk-test", "redata-ygy".getBytes(), -1);
        //14:49:29.224 [main] WARN test.ygy.alone.Zookeeper_Provider - data = ygy
        //14:49:29.225 [main] WARN test.ygy.alone.Zookeeper_Provider -  stat = 10,10,1503643768812,1503643768812,0,0,0,0,3,0,10
        //14:49:29.310 [main-EventThread] WARN test.ygy.alone.Zookeeper_Provider - watch = redata-ygy
        //14:49:29.310 [main-EventThread] WARN test.ygy.alone.Zookeeper_Provider -  watch stat = 10,11,1503643768812,1503643768911,1,0,0,0,10,0,10


        //异步
        zooKeeper.setData("/zk-test", "redata-ygy".getBytes(), -1, new AsyncCallback.StatCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, Stat stat) {
                log.warn(" rc = " + rc + " path = " + path + " ctx = " + ctx + " stat = " + stat);
            }
        }," param ");
        //15:13:26.629 [main] WARN test.ygy.alone.Zookeeper_Provider - data = ygy
        //15:13:26.629 [main] WARN test.ygy.alone.Zookeeper_Provider -  stat = 18,18,1503645206488,1503645206488,0,0,0,0,3,0,18
        //15:13:26.710 [main-EventThread] WARN test.ygy.alone.Zookeeper_Provider - watch = redata-ygy
        //15:13:26.711 [main-EventThread] WARN test.ygy.alone.Zookeeper_Provider -  watch stat = 18,19,1503645206488,1503645206589,1,0,0,0,10,0,18
        //15:13:26.713 [main-EventThread] WARN test.ygy.alone.Zookeeper_Provider -  rc = 0 path = /zk-test ctx =  param  stat = 18,19,1503645206488,1503645206589,1,0,0,0,10,0,18
        Thread.sleep(20000);
        zooKeeper.close();

    }


    private static ZooKeeper getZkData() throws  Exception  {
        return new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, (x) -> {
            if (Watcher.Event.KeeperState.SyncConnected == x.getState()) {
                //初始创建时
                if (Watcher.Event.EventType.None == x.getType() && null == x.getPath()) {
                    countDownLatch.countDown();
                    log.warn(" 连接zookeeper 服务 ok ");
                } else if (x.getType() == Watcher.Event.EventType.NodeDataChanged) {
                    //数据状态发生改变
                    try {
                        //获取数据
                        log.warn("watch = " + new String(zooKeeper.getData(x.getPath(),true,stat )) );
                        log.warn(" watch stat = " + stat.toString());
                    } catch (Exception e) {
                        log.error(" data get error ",e);
                    }
                }
            }
        });
    }



}
Zookeeper_childrenSynAsyn
package test.ygy.alone;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * Created by guoyao on 2017/8/25.
 */
public class Zookeeper_childrenSynAsyn {

    private static final Logger log=LoggerFactory.getLogger(Zookeeper_childrenSynAsyn.class);

    private static final String CONNECT_STRING="192.168.150.130:2181,192.168.150.132:2181,192.168.150.133:2181";

    private static final int SESSION_TIME_OUT=10 * 1000;  // 10秒

    private static CountDownLatch countDownLatch=new CountDownLatch(1);

    private static ZooKeeper zooKeeper ;

    public static  void main(String [] args ) throws  Exception {

        zooKeeper=getZK_Children();
        countDownLatch.await();

        zooKeeper.create("/test-zk", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        zooKeeper.create("/test-zk/test1", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        //开启watch时,则会观察下一个create节点时的childer事件
        //同步
        //List<String> children=zooKeeper.getChildren("/test-zk", true);
        //log.warn(children.toString());

        //异步
        zooKeeper.getChildren("/test-zk", true, new AsyncCallback.Children2Callback() {
            @Override
            public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
                log.warn(" rc = " + rc + " path = " + path + " ctx =" + ctx + " children = " + children.toString() + " stat = " + stat);
            }
        }," param ");

        zooKeeper.create("/test-zk/test2", "ygy-test1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);


        Thread.sleep(20000);
        zooKeeper.close();
    }


    public static ZooKeeper getZK_Children() throws Exception {
        return new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, (x) -> {
            if (Watcher.Event.KeeperState.SyncConnected == x.getState()) {
                log.warn(" 连接zookeeper 服务 ok ");
                if (x.getType() == Watcher.Event.EventType.None && null == x.getPath()) {
                    log.warn(x.toString());
                    //00:50:59.309 [main-EventThread] WARN test.ygy.alone.Zookeeper_Start - WatchedEvent state:SyncConnected type:None path:null
                    countDownLatch.countDown();
                    //发生node改变事件
                } else if (x.getType() == Watcher.Event.EventType.NodeChildrenChanged) {
                    try {
                        log.warn(" watch result = " + zooKeeper.getChildren(x.getPath() ,true));
                    } catch (Exception e) {
                        log.error(" get error",e);
                    }

                }
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值