一、windows环境下的安装
直接下载成功以后 进入conf目录 复制zoo_sample.cfg 创建一份zoo.cfg文件
具体配置如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=E:\\zookeeperDir
dataLogDir=E:\\zookeeperDir\\logs
# the port at which the clients will connect
clientPort=4180
二、Server的启动
进入bin目录下 运行命令
zkServer.cmd
t to 2000
2017-02-08 14:00:59,986 [myid:] - INFO [main:ZooKeeperServer@824] - minSessionT
imeout set to -1
2017-02-08 14:00:59,987 [myid:] - INFO [main:ZooKeeperServer@833] - maxSessionT
imeout set to -1
2017-02-08 14:01:00,006 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding
to port 0.0.0.0/0.0.0.0:4180
打印出如下信息,说明启动完成。
检查是否启动成功的方式
另开一个窗口 运行 netstat -ano 展示结果如下
活动连接
协议 本地地址 外部地址 状态 PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 996
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 2972
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:902 0.0.0.0:0 LISTENING 2536
TCP 0.0.0.0:912 0.0.0.0:0 LISTENING 2536
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 2052
TCP 0.0.0.0:4180 0.0.0.0:0 LISTENING 8580
发现4180 端口已经处于监听状态,说明zkServer启动完成。
三、Client端启动
进入bin目录下 运行命令
zkCli.cmd -server localhost:4180
打印结果如下:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
说明客户端已经连接成功
四、简单操作命令学习
1、查看节点
ls /
结果:
[zk: localhost:4180(CONNECTED) 6] ls /
[zookeeper]
2、创建节点
[zookeeper]
[zk: localhost:4180(CONNECTED) 7] create /t1 abc
Created /t1
[zk: localhost:4180(CONNECTED) 8] ls /
[t1, zookeeper]
3、退出
quit
[zk: localhost:4180(CONNECTED) 9]
[zk: localhost:4180(CONNECTED) 9] quit
Quitting...
2017-02-08 14:11:46,911 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x15a1c4
f8d790000 closed
2017-02-08 14:11:46,916 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread
@519] - EventThread shut down for session: 0x15a1c4f8d790000
代码连接服务器:
package zk_1;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class zk {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException{
// 创建一个与服务器的连接
//第一个参数:ZooKeeper服务器的连接地址,如果ZooKeeper是集群模式或伪集群模式(即ZooKeeper服务器有多个),那么每个连接地址之间使用英文逗号间隔,单个连接地址的语法格式为“主机IP:ZooKeeper服务器端口号”;
//第二个参数:session超时时长(单位:毫秒)
//第三个参数:用于监控目录节点数据变化和子目录状态变化的Watcher对象
ZooKeeper zk = new ZooKeeper("127.0.0.1:4180", 60000, new Watcher() {
// 监控所有被触发的事件
// 当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。
@Override
public void process(WatchedEvent event) {
System.out.println("EVENT:" + event.getType()+" path:"+event.getPath());
}
});
// 查看根节点
// 获取指定 path 下的所有子目录节点,同样 getChildren方法也有一个重载方法可以设置特定的 watcher 监控子节点的状态
// System.out.println("ls / => " + zk.getChildren("/", true));
// System.out.println("t1是否已经存在:"+zk.exists("/t1", true));
// zk.create("/t2", "RootNodeData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//创建一个节点名为“/RootNode”的目录节点
// System.out.println("“/t2”节点状态:" + zk.exists("/t2",true));//判断指定目录节点是否存在
// System.out.println("“t2”节点上数据:"+new String(zk.getData("/t2", false, null)));//获取“RootNode”节点上的数据
//zk.create("/t2/tt1", "second dir tt1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//zk.create("/t2/tt2", "second dir tt2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//System.out.println("t2下的所有子目录: "+zk.getChildren("/t2", false));
// zk.delete("/t2/tt1", -1); //删除某节点的数据
//System.out.println("t2下的所有子目录: "+zk.getChildren("/t2", false));
//修改某节点的数据
zk.setData("/t2/tt2", "update tt2's data".getBytes(), -1);
System.out.println("修改后的数据:"+new String(zk.getData("/t2/tt2", false, null)));
zk.close();
}
}
客户端命令操作:
ls /
[t2, t1, zookeeper]
[zk: localhost:4180(CONNECTED) 1] get /t2
RootNodeData
cZxid = 0xd
ctime = Wed Feb 08 14:26:36 CST 2017
mZxid = 0xd
mtime = Wed Feb 08 14:26:36 CST 2017
pZxid = 0xd
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: localhost:4180(CONNECTED) 2] get /t1
abc
cZxid = 0x6
ctime = Wed Feb 08 14:10:54 CST 2017
mZxid = 0x6
zoo.cfg配置文件解释(抄袭的解释哈哈):
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。