1,安装zookeeper
2,在目录和环境变量上做对应配置,太多了,懒得写
3,D:\zookeeper\zookeeper-3.4.10-1\conf里的zoo.cfg(一开始是sample)改成对应的参数
dataDir=D://zookeeper//zookeeper-3.4.10-3//bin//data
clientPort=2181 默认是2181,也可以写成其他的,一台电脑上有多个机器的,要写成不同的port才不会冲突
server.1=127.0.0.1:2777:3777
server.2=127.0.0.1:2888:3888
…
最好配置单数,因为单数和双数,都需要保证过半机器能用的原则,所以其实双数和单数在使用的时候没有区别
4,在对应的bin/data文件夹下,创建myId文件,里面写上对应的数字,1 or 2 or …对应server的ip
5,windows上双击运行bin/zkServer来运行zookeeper服务器
6,把配置的所有服务器都开启来以后,双击zkCli尝试运行,看看是否成功
不成功的可能原因
1,ip冲突,server.1 =127.0.0.1:2777:3777
ip:端口1:端口2
如果ip相同的情况下,要保证端口1和端口2和其他server的不一样,不能重复占用
同理clientPort
2,myId配置重复或者漏配
7,在java上配置客户端
maven配置,根据自己对应的仓库,有什么版本用什么
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
connectString: ip可以配置多个,这里只配置一个,ip地址通过上面寻找,
运行的zkServer里运行成功后,会提示
binding to port 0.0.0.0/0.0.0.0:2181
用这个就可以了!!
sessionTimeout: 和心跳检测相关,在sessionTimeout时间内会进行心跳检测,连不上就断开(如果是本地可以设置长一点,因为打断点的时候是不能顺利心跳检测的)
watcher: 可以不设置,设置的话,会回调返回WatchedEvent类型,里面含有三个参数:
- KeeperState:连接状态,比如连接中断,仍然连接着,等等,
- EventType :事件类型,比如节点添加,节点删除,子节点变更,等等,
- path:路径
代码
final String ip1 = "0.0.0.0:2181";
zooKeeper = new ZooKeeper(ip1 , 30000, null);
源码
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);
设置数据
path:路径
byte data[]:数据,byte[]格式
version:版本号,-1表示无所谓,如果不是-1,就表示,只有在xx版本下,才进行更新,乐观锁
代码
Stat stat = zooKeeper.setData(path , ("data").getBytes(), -1);
源码
public Stat setData(final String path, byte data[], int version)
获取数据
获取到的数据是byte[]格式的
path:略
watcher:监听器注册,这里用默认的监听器watcher的回调watchedEvent,也可以填null,不管回调
stat:可以通过stat去接收stat的值,这里选择null,不需要
byte[] s = zooKeeper.getData(path , event -> {
if (EventType.NodeDataChanged.equals(event.getType())
|| EventType.NodeChildrenChanged.equals(event.getType())) {
//......
}
}, null);
源码
public byte[] getData(final String path, Watcher watcher, Stat stat);
获取子节点
List<String> childrenList = zooKeeper.getChildren(path,false);
watcher:false
childrenList :子节点的相对路径,不是绝对路径!
节点存在
Stat stat = zooKeeper.exists(path, null/*watcher*/);
if(null ==stat){
//path not exists
}
监听:
1,监听是一次性的
2,重复add监听的话,那边是真的会有多个,就会导致一次调用,多个监听响应,其他懒得说了
create见另一篇