4. 下载:
cd /Users/guanguan/tools; 创建文件夹
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 下载
tar xvf zookeeper-3.4.9.tar.gz 解压缩
cd zookeeper-3.4.9; ls -l
5.配置环境变量
➜ export ZOOKEEPER_HOME=/Users/guanguan/tools/zookeeper-3.4.9
➜ export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
6.单机模式的配置情况如下:ZooKeeper的运行默认是读取zoo.cfg文件
里面的内容的。
~mkdir /Users/guanguan/tools/zoo/zk0
~cp conf/zoo_sample.cfg conf/zk0.cfg
~vim conf/zk0.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk0
clientPort=2181
在zk0.cfg这个文件中,我们需要指定 dataDir 的值,它指向了一个目录,这个目录在开始的时候需要为空
。下面是每个参数的含义:
tickTime :基本事件单元,以毫秒为单位
。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir :存储内存中数据库快照的位置
,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里
。
clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口
,Zookeeper 会监听这个端口,接受客户端的访问请求。
使用单机模式时用户需要注意:这种配置方式下没有 ZooKeeper 副本,所以如果 ZooKeeper 服务器出现故障, ZooKeeper 服务将会停止
。
6.1。zookeeper服务的启动
6.2。查看服务状态
6.3。关闭zookeeper服务
7.集群模式(单机集群:在一台pc上启动多个zookeeper实例)
7.1。创建目录环境
7.2.修改各个配置文件
修改
:dataDir,clientPort
增加
:集群的实例,server.X,”X”表示每个目录中的myid的值
~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk1
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk2
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk3
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
initLimit
:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器
)初始化连接时最长能忍受多少个心跳时间间隔数
。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
syncLimit
:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度
,总的时间长度就是 5*2000=10 秒。
server.A=B:C:D
:其中 A 是一个数字,表示这个是第几号服务器,就是集群模式下配置的myid文件所存放的数值;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号
。
由于三个服务都在同一台电脑上,因此这里要保证地址的唯一性,因此要特别注意IP地址和端口号不要互相冲突,以免影响程序的正确执行。
3个节点的ZooKeeper集群配置完成,接下来我们的启动服务。
7.3.启动集群
7.4.查看zookeeper物理文件目录
8。分布式集群
to do...
9.命令行简单操作
当zookeeper服务开启之后,输入一下命令连接zookeeper服务
➜ zookeeper-3.4.9 bin/zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
2017-08-31 16:25:52,978 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2017-08-31 16:25:52,982 [myid:] - INFO [main:Environment@100] - Client environment:host.name=172.20.158.239
2017-08-31 16:25:52,982 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_92
2017-08-31 16:25:52,983 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/Users/guanguan/tools/zookeeper-3.4.9/bin/../build/classes:/Users/guanguan/tools/zookeeper-3.4.9/bin/../build/lib/*.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../conf:
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/Users/guanguan/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/var/folders/rj/lcp0d7815kl2v5xh0j4zm6h00000gn/T/
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Mac OS X
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=x86_64
2017-08-31 16:25:52,984 [myid:] - INFO [main:Environment@100] - Client environment:os.version=10.12.5
2017-08-31 16:25:52,985 [myid:] - INFO [main:Environment@100] - Client environment:user.name=guanguan
2017-08-31 16:25:52,985 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/Users/guanguan
2017-08-31 16:25:52,985 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/Users/guanguan/tools/zookeeper-3.4.9
2017-08-31 16:25:52,986 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@531d72ca
Welcome to ZooKeeper!
2017-08-31 16:25:53,019 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2017-08-31 16:25:53,108 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@876] - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
[zk: 127.0.0.1:2181(CONNECTING) 0] 2017-08-31 16:25:53,186 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15e374985180000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
9.1 使用ls命令查看当前zookeeper中所包含的内容:
ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
[zookeeper]
9.2 创建一个znode,这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串:
[zk: 127.0.0.1:2181(CONNECTED) 2] create /zoo "myData"
Created /zoo
9.3.运行get命令来获取znode中的所创建的字符串:
get /zoo
9.4通过set命令来对zoo所关联的字符串进行修改:
set /zoo "gg"
9.5。znode删除
delete /zoo
9.6 help命令
[zk: 127.0.0.1:2181(CONNECTED) 7] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
9.7退出命令行
quit
10.通过Java编程实现简单的命令。
pom.xml文件
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// 创建一个与服务器的连接
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 60000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("EVENT:" + event.getType());
}
});
// 查看根节点
System.out.println("ls / => " + zk.getChildren("/", true));
//创建一个目录节点
if (zk.exists("/node", true) == null) {
/**
* CreateMode.PERSISTENT :代表创建一个持久的znode
* ZooDefs.Ids.OPEN_ACL_UNSAFE :代表对所有的连接完全开放的权限
*/
zk.create("/node", "guanguan".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("create /node guanguan");
//查看/node节点数据
System.out.println("get /node:: " + new String(zk.getData("/node", false, null)));
//查看根节点
System.out.println("ls / ::" + zk.getChildren("/", true));
}
//创建一个子目录节点
if (zk.exists("/node/sub1", true) == null) {
zk.create("/node/sub1", "sub1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("create /node/sub1 sub1");
//查看node节点
System.out.println("ls node:" + zk.getChildren("/node", true));
}
//修改节点数据
if (zk.exists("/node", true) != null) {
zk.setData("/node", "changed".getBytes(), -1);
//查看/node节点数据
System.out.println("get /node ::" + new String(zk.getData("/node", false, null)));
}
//删除节点
if (zk.exists("/node/sub1", true) != null) {
zk.delete("/node/sub1",-1);
zk.delete("/node",-1);
//查看根节点
System.out.println("ls / ::"+zk.getChildren("/",true));
}
//关闭连接
zk.close();
}
运行结果如下:
10:03:34.319 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
10:03:34.321 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
10:03:34.339 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15e374985180006, negotiated timeout = 40000
EVENT:None
10:03:35.246 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 1,8 replyHeader:: 1,8589934619,0 request:: '/,T response:: v{'zookeeper}
ls / => [zookeeper]
10:03:35.261 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 2,3 replyHeader:: 2,8589934619,-101 request:: '/node,T response::
10:03:35.292 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:35.294 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeCreated path:/node for sessionid 0x15e374985180006
EVENT:NodeCreated
10:03:37.323 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:37.324 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ for sessionid 0x15e374985180006
EVENT:NodeChildrenChanged
10:03:39.335 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 3,1 replyHeader:: 3,8589934620,0 request:: '/node,#6775616e6775616e,v{s{31,s{'world,'anyone}}},0 response:: '/node
create /node guanguan
10:03:39.345 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 4,4 replyHeader:: 4,8589934620,0 request:: '/node,F response:: #6775616e6775616e,s{8589934620,8589934620,1504231415283,1504231415283,0,0,0,0,8,0,8589934620}
get /node:: guanguan
10:03:39.348 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 5,8 replyHeader:: 5,8589934620,0 request:: '/,T response:: v{'node,'zookeeper}
ls / ::[node, zookeeper]
10:03:39.351 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 6,3 replyHeader:: 6,8589934620,-101 request:: '/node/sub1,T response::
10:03:39.354 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:39.354 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeCreated path:/node/sub1 for sessionid 0x15e374985180006
10:03:39.415 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 7,1 replyHeader:: 7,8589934621,0 request:: '/node/sub1,#73756231,v{s{31,s{'world,'anyone}}},0 response:: '/node/sub1
create /node/sub1 sub1
EVENT:NodeCreated
10:03:41.495 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 8,8 replyHeader:: 8,8589934621,0 request:: '/node,T response:: v{'sub1}
ls node:[sub1]
10:03:41.496 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 9,3 replyHeader:: 9,8589934621,0 request:: '/node,T response:: s{8589934620,8589934620,1504231415283,1504231415283,0,1,0,0,8,1,8589934621}
10:03:41.505 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:41.506 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDataChanged path:/node for sessionid 0x15e374985180006
EVENT:NodeDataChanged
10:03:42.673 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 10,5 replyHeader:: 10,8589934622,0 request:: '/node,#6368616e676564,-1 response:: s{8589934620,8589934622,1504231415283,1504231421500,1,1,0,0,7,1,8589934621}
10:03:42.677 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 11,4 replyHeader:: 11,8589934622,0 request:: '/node,F response:: #6368616e676564,s{8589934620,8589934622,1504231415283,1504231421500,1,1,0,0,7,1,8589934621}
get /node ::changed
10:03:42.686 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 12,3 replyHeader:: 12,8589934622,0 request:: '/node/sub1,T response:: s{8589934621,8589934621,1504231419352,1504231419352,0,0,0,0,4,0,8589934621}
10:03:42.695 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:42.695 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDeleted path:/node/sub1 for sessionid 0x15e374985180006
EVENT:NodeDeleted
10:03:43.766 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:43.766 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node for sessionid 0x15e374985180006
EVENT:NodeChildrenChanged
10:03:44.787 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 13,2 replyHeader:: 13,8589934623,0 request:: '/node/sub1,-1 response:: null
10:03:44.792 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:44.793 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ for sessionid 0x15e374985180006
10:03:44.794 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 14,2 replyHeader:: 14,8589934624,0 request:: '/node,-1 response:: null
EVENT:NodeChildrenChanged
10:03:45.804 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 15,8 replyHeader:: 15,8589934624,0 request:: '/,T response:: v{'zookeeper}
ls / ::[zookeeper]
10:03:45.804 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x15e374985180006
10:03:45.804 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x15e374985180006
10:03:45.817 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 16,-11 replyHeader:: 16,8589934625,0 request:: null response:: null
10:03:45.817 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x15e374985180006
10:03:45.817 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x15e374985180006 closed
Disconnected from the target VM, address: '127.0.0.1:57022', transport: 'socket'
Process finished with exit code 0