上文中,zk的环境变量已经配置完成。
启动zk
zkServer.sh start
进入zk客户端
zkCli.sh
查找
ls / ls/zookeeper
创建并赋值
create /zh value
获取值
get /zh
设置值
set /zh value1
可以看到zk集群的数据一致性
递归删除节点
rmr /path 递归删除节点
删除指定某个节点
delete /path/node
创建节点有两种类型:短暂(ephemeral)持久(persistent)
zoo.conf详解
tickTime:基本事件单元,以毫秒为单位。这个时间是zk服务器之间或客户端与服务器之间维持心跳的时间间隔。
datadir:存储内存中数据快照的位置,zk保存数据的目录,默认情况下,将写数据的日志文件也保存在这个位置。
clientPort:这个端口就是客户端连接zk服务器的端口,zk会监听这个端口,接收客户端的请求访问。
initLimit:配置zk接收客户端初始化连接时最长能忍受多少个心跳时间间隔。当超过10个心跳的时间(tickTime)长度后,zk服务器还没有收到客户端的返回信息,那么这个客户端连接失败,总的时长10*2000*20秒。
syncLimit:这个配置标识Leader与Follower之间发送消息,请求和应答时间长度。最长不能超过多个tickTime的时间长度,总时长5*2000*10秒。
server.0=a:b:c:0表示第几个服务器,a标识第几个服务器地址,b表示这个服务器与集群中lader服务器交换信息的端口,d表示万一集群中的lader的服务器挂了,需要一个端口从新进行选举,选出一个新的lader。
java操作zk?
准备工作:zookeeper-3.4.5.jar
public class ZookeeperBase {
/** zookeeper地址 */
static final String CONNECT_ADDR = "192.183.131.88:2181,192.168.183.134:2181,192.168.183.135:2181";
/** session超时时间 */
static final int SESSION_OUTTIME = 2000;//ms
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){
@Override
public void process(WatchedEvent event) {
//获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
//如果是建立连接
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
//如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
connectedSemaphore.countDown();
System.out.println("zk 建立连接");
}
}
}
});
//进行阻塞
connectedSemaphore.await();
System.out.println("..");
//创建父节点
// zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//创建子节点
// zk.create("/testRoot/children", "children data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//获取节点洗信息
// byte[] data = zk.getData("/testRoot", false, null);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false));
//修改节点的值
// zk.setData("/testRoot", "modify data root".getBytes(), -1);
// byte[] data = zk.getData("/testRoot", false, null);
// System.out.println(new String(data));
//判断节点是否存在
// System.out.println(zk.exists("/testRoot/children", false));
//删除节点
// zk.delete("/testRoot/children", -1);
// System.out.println(zk.exists("/testRoot/children", false));
zk.close();
}
}