zookeeper集群搭建与原理分析

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

一、zookeeper的来源:

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

二、zookeeper的定义:

分布式协调服务

三、zookeeper架构:

在这里插入图片描述
3.1、角色
在这里插入图片描述
3.2、Watcher(监听)机制在这里插入图片描述
(1)有一个写入请求,将请求传给follower
(2)fllower将请求转发给leader
(3)leader将请求下发到各个follower,投票
(4)follower将自己的想法返回给leader
注意点:少数服从多数
原则:过半原则 ---------------节点最好的单数
3.3、zookeeper的特点
·最终一致性
分布式系统中,在一段时间后,节点间的数据最终会达到一致状态的特性。
注意:数据经过一段时间最终会达成一致
·原子性
更新只能成功或者失败,没有中间状态的特性
注意:事务更新没有中间状态
·可靠性
在ZooKeeper中,如果消息被一台服务器接受,那么它将被所有服务器接受的特性。
注意:消息要么被所有的Zookeeper服务器接受,要么所有的Zookeeper服务器不接受
·实时性
Zookeeper能保证客户端得到刚更新的数据的特性。
注意:客户端获取的数据一定是Zookeeper集群中刚新的
·顺序性
ZooKeeper的所有Server端,同一个消息发布顺序一致的特性
注意:每个Zookeeper不一定是同时收到数据,但是每个Zokeeper内部收到的数据的顺序都是一致的
3.4、zab协议
广播模式
已经选举出来的leader,开始对外提供服务
恢复模式
还没有leader(集群刚启动、leader死了新的个还没有起来)
looking --观望
fllowing --跟从但是有想法 fllower
leading --继承人(准备被继承) leader
observering observer
3.5、znode–zookeeper的文件节点
定义:Znode是Zookeeper存储数据的数据单元
分类:
持久 :永远存在 ,zookeeper即使重启也不会丢失
临时(-e):当客户端创建了Znode,只被这个客户端占有使用,一旦客户端停止,断开,临时的znode会被删除
顺序(-s):防止名字冲突,节点后会跟随一个10位数字的顺序号
启动客户端:
zkCli.sh -server ip:port(2181)
3.6、zookeeper命令与编程
1.命令
1.1连接指定的zookeeper
./zkCli.sh -server ip:port(2181)
1.2命令操作
ls /:列出“/”下面的其它的节点
create -e /name1 xiaozhang 创建临时节点,用quit命令退出或结束,会话节点消失
create -s /name2 xiaowang 创建顺序节点
creae -e -s /name3 xiaoli 创建临时数据节点
get /name 通过名字获取节点
rmr /name 删除指定名字的节点
set /name3 xiaoxiao 设置节点内容
1.3编程
开发步骤:
eclipes建立java工程------>将zookeeper设计到的jar包添加到构建路径------->创建java类------>编写代码-----》用zookeeper哭客户端对象操作zookeeper
创建zookeeper客户端对象
Zookeeper client = new Zookeeper(“192.168.110.131”,1000,null)
分别指 :ip,超时时间,监听

//创建节点
/*String create = client.create("/name", "kk".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(create);*/	

/name 指定在”/”下创建一个znode节点name
Ids.OPEN_ACL_UNSAFE是将所有ADMIN之外的权限授予每个人
CreateMode.PERSISTENT 指定创建的节点是持久节点

 //获取指定节点
  /*byte[] data = client.getData("/name/sex", true, null);
   String string = new String(data);
   System.out.println(string);*/

  //设置指定节点内容
  //Stat stat = client.setData("/name", "2222".getBytes(), client.exists("/name", true).getVersion());
  
  //获取指定节点子节点
/*List<String> list = client.getChildren("/name", true);
  for (String str : list) {
    System.out.println(str);
    }*/
    
   //删除指定节点
    client.delete("/name",-1);

猜你喜欢

转载自blog.csdn.net/power_k/article/details/92800307