Zookeeper是开源的、分布式的协调服务框架。是Apache Hadoop的子件,适用于绝大部分的分布式集群的管理。
分布式引发的问题:
1.死锁:至少有一个线程占用资源,但是不占用CPU
2.活锁:所有的线程都没有占用资源,但是线程却是在不断的调度占用资源
3.需要引入一个管理节点
4.为了防止入口的单点问题,需要引入管理节点的集群
5.需要在管理节点中选出一个子节点
6.需要确定一套管理算法
7.主节点和从节点之间要保持数据的一致性
Zookeeper的单机版安装
JAVA api
public class ZooKeeperDemo01 {
private ZooKeeper zk;
@Before
public void connect() throws IOException, InterruptedException{
CountDownLatch cdl = new CountDownLatch(1);
// connectString - 连接地址+端口号
// sessionTimeout - 会话超时时间 - 表示连接超时时间,单位默认为毫秒
// watcher - 监控者 - 监控连接状态
// Zookeeper本身是一个非阻塞式连接
zk = new ZooKeeper("10.10.10.10:2181", 5000, new Watcher() {
// 监控连接状态
public void process(WatchedEvent event) {
if (event.getState() == KeeperState.SyncConnected) {
System.out.println("连接成功~~~");
cdl.countDown();
}
}
});
cdl.await();
}
@Test //创建一个节点
public void create () throws KeeperException, InterruptedException{
// path - 节点路径
// data - 数据
// acl - acl策略
// createMode - 节点类型
// 返回值表示节点的实际路径
String str = zk.create
("/node06", "hello world".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(str);
}
@Test //删除一个节点
public void delete() throws InterruptedException, KeeperException {
// path - 节点路径
// version - 数据版本
// 在删除节点的时候回比较指定的数据版本和节点的实际数据版本是否一致
// 如果一致则删除,如果不一致则放弃该操作
// zk.delete("/node04", 0);
// -1表示强制执行
zk.delete("/node04", -1);
}
@Test //修改一个节点内容
public void set() throws KeeperException, InterruptedException {
Stat s = zk.setData("/node01", "你好".getBytes(), -1);
System.out.println(s);
}
@Test //获取节点内容
public void get() throws KeeperException, InterruptedException, UnsupportedEncodingException {
//path -- 节点路径
//watch - 监控
//stat - 节点信息
Stat s = new Stat();
byte[] data = zk.getData("/node01", null, s);
System.out.println(new String(data,"utf-8"));
}
//判断节点是否存在
@Test
public void exist() throws KeeperException, InterruptedException {
//path - 节点路径
//watch - 监控者
//返回的节点的信息
Stat s = zk.exists("/node06", null);
System.out.println(s);
}
//获取子节点
@Test
public void getChildren() throws KeeperException, InterruptedException {
//path
//watch
//返回子节点的路径
List<String> nodes = zk.getChildren("/", null);
for (String str : nodes) {
System.out.println(str);
}
}
}