Zookeeper

来源:
Zookeeper是google的chubby的一个开源实现,是分布式的**

定义:Z
ookeeper是Apache组织下的高性能,分布式的应用协调服务框架

1.选举机制**
少数服从多数
原则:过半原则—zookeeper节点数再好为单数,<255

2.角色
在1.这里插入图片描述
1).有一个写入请求,将请求传给follower
2).follower将请求转发给leader
3).leader将请求下发到各个follower,进行投票
4).follower将自己的想法返回给leader

在这里插入图片描述

3.原子广播和zab协议
原子广播就是上边的3)+4)

zab协议
广播模式—已经选举出来的leader,开始对外提供服务----原子广播
恢复模式–还没有leader(集群刚启动,leader死了新的leader还没有起来)
looking --观望
follwing–跟从但是有想法 follwer
leading–继承人(准备继承)leader
observing —observer

监听机制:
follower查看leader的状态,然后将状态信息进行更新和发送

znode节点
定义:Znode是Zookeeper存储数据的数据单元

有四种类型的znode:
1、PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、 PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

在这里插入图片描述
Zookeeper的基本操作和事件通知

    如何操作这些Znode节点呢?Zookeeper为我们提供了简单API。甚至提供了触发器机制。

Zookeeper提供了哪些基本操作呢?这里列出了常见的API:
create 创建节点
delete 删除节点
exists 判断节点是否存在
getData 获取一个节点的数据
getChildren 获取节点下的所有节点
其中,exists、getData、getChildren属于读操作。Zookeeper客户端在请求读操作的时候,可以选择是否设置Watch。

Zookeeper的特点
1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
2 .可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
4 .等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
5.原子性:更新只能成功或者失败,没有中间状态。
6 .顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面

Zookeeper工作流程
在这里插入图片描述

   **连接指定的Zookeeper**:
        ./zkCli.sh  -server ip:port

例如zkCli.sh -server 192.168.174.132:2181

Zookeeper命令操作
ls /:列出“/”下面的其它的节点
create -e /name1 xiaozhang 创建临时节点,用quit命令退出或结束,会话节点消失
create -s /name2 xiaowang 创建顺序节点
creae -e -s /name3 xiaoli 创建临时数据节点
get /name 通过名字获取节点
rmr /name 删除指定名字的节点
set /name3 xiaoxiao 设置节点内容

Zookeeper编程

创建客户端连接对象
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”,1000, null)

1**)创建name节点,name节点的内容是zhangsan,**
String create = client.create("/name", “zhangsan”.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
注释
/name 指定在”/”下创建一个znode节点name
Ids.OPEN_ACL_UNSAFE是将所有ADMIN之外的权限授予每个人
CreateMode.PERSISTENT 指定创建的节点是持久节点

2.)创建子节点/name/sex
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
public class TestZ {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”/链接字符串/, 1000, null);
String create = client.create("/name/sex", “man”.getBytes()/指定路径上存储的值/, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT/持久化节点/);
System.out.println(create);
}
}

3.)获取指定节点“/name/sex”的内容
public class TestZ {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”/链接字符串/, 1000, null);
byte[] data = client.getData(“/name/sex”/指定节点/, true, null);
String db = new String(data);//将获取的数据转换为字符串
System.out.println(db);//打印字符串
}
}

4.)删除指定节点“/name1111”
public class TestZ {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”/链接字符串/, 1000, null);
client.delete("/name1111", -1);
}
}

5.)设置指定节点“/namewjf”的内容未22222
public class Testset {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// TODO Auto-generated method stub
ZooKeeper zk = new ZooKeeper(“172.16.245.5:2181”, 1000, null);
zk.setData("/namewjf", “222222”.getBytes(), zk.exists("/namewjf", true).getVersion()/znode当前版本/);
}
}

6.)获取指定节点 “/name”的子节点
public class testgetchild {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”/链接字符串/, 1000, null);
List list = client.getChildren("/name", true);
for(String str:list){
System.out.println(str);
}
}
}

7.)监听指定节点/name
public class TestWatcher implements Watcher{
//watcher只有在长链接的情况下才起作用,而且只能监听一次。
private static final int SESSION_TIMEOUT=1000;
private ZooKeeper zk = null;
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper client = new ZooKeeper(“172.16.245.5:2181”/链接字符串/, 1000, null);
byte[] bs = client.getData("/name", new TestWatcher(), null);
System.out.println(new String(bs));
Thread.sleep(Long.MAX_VALUE);
}
//监听到指定的目录有变化,会触发此方法
@Override
public void process(WatchedEvent event) {
System.out.println(event.getPath());
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值