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;
private static CountDownLatch countDownLatch=new CountDownLatch(1);
public static void main(String[] args) throws Exception{
ZooKeeper zooKeeper = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, (x)-> {
Watcher.Event.KeeperState keeperState=x.getState();
Watcher.Event.EventType eventType=x.getType();
if (Watcher.Event.KeeperState.SyncConnected == keeperState) {
countDownLatch.countDown();
log.info(" 连接zookeeper 服务 ok ");
}
});
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;
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
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();
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 "
);
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 "
);
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 "
);
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();
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="www.ygy.com:2181";
private static final int SESSION_TIME_OUT=10 * 1000;
public static CountDownLatch countDownLatch=new CountDownLatch(1);
private static ZooKeeper zooKeeper ;
private static Stat stat=new Stat();
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);
log.warn("data = " + new String(zooKeeper.getData("/zk-test",true,stat )) );
log.warn(" stat = "+ stat);
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 ");
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;
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);
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());
countDownLatch.countDown();
} 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);
}
}
}
});
}
}