分布式应用协调服务ZooKeeper

一.ZooKeeper简介

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目
Zookeeper=文件系统+通知机制

  • Zookeeper从设计模式上来看是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数
  • 据,然后接受观察者的注册
  • 一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式

二. ZooKeeper数据结构

znode

  • ZooKeeper数据模型的结构与Linux文件系统很像,整体上可以看作是一棵树,树的每个节点称做一个znode。每一个znode默认能够存储
  • 1MB的数据,每个znode都可以通过其路径唯一标识

节点类型

  • PERSISTENT:持久化节点,默认类型
  • PERSISTENT_SEQUENTIAL:持久化顺序编号节点
  • EPHEMERAL:临时节点
  • EPHEMERAL_SEQUENTIAL:临时顺序编号节点
  • ``

三. ZooKeeper客户端命令

首先输入zkCli.sh进入命令行模式

命令基本语法 命令功能描述
help 显示所有操作命令
ls path 使用ls命令查看当前znode中所包含的内容
ls2 查看当前节点数据并能看到更新次数等数据
create 创建节点,默认是持久化节点 create -s:创建带序列的节点 create -e:创建临时节点
get path 获取节点的值
set 设置节点的具体值
stat 查看节点状态
delete 删除节点,不可删除带有子节点的节点
rmr 递归删除节点
quit 退出zk客户端

使用Java API访问zookeeper

  • 1.创建maven工程添加依赖
 <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
    </dependency>
  • 2.代码实现
package hadoop;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

/**
 * @author sunyong
 * @date 2020/07/06
 * @description
 */
public class ZKClientDemo {
    private static  final  String CONNECTSTRING = "hadoop110,hadoop111,hadoop112:2181";//zk的集群连接信息
    private static final int SESSIONTIMEOUT = 2000;//集群超时时间
    private static ZooKeeper zkClient;//zk对象
    //初始化zk对象
    @Before
    public void init() throws IOException {

        zkClient=new ZooKeeper(CONNECTSTRING,SESSIONTIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {

            }
        });
    }
    //创建节点
    @Test
    public void CareateNode() throws KeeperException, InterruptedException {
      String path =   zkClient.create("/kgc/hadoop110","hadoop110".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(path);
    }
    //获取所有子节点
    @Test
    public void getChildrenNode() throws KeeperException, InterruptedException {
      List<String> children=  zkClient.getChildren("/kgc",true);
        for (String child : children) {
            System.out.println(child);
        }
    }
    //判断节点是否存在
    @Test
    public void existsNode() throws KeeperException, InterruptedException {
       Stat exists =  zkClient.exists("/kgc/1",false);
        System.out.println(exists==null?"不存在":"存在");
    }
}

四. ZooKeeper角色

Leader(领导者)

  • 负责进行投票的发起和决议,更新系统状态

Follower(跟随者)

  • 用于接收客户端请求并向客户端返回结果,在选主过程中参与投票

Observer(观察者)

  • 可以接收客户端连接,将写请求转发给Leader节点。但Observer不参加投票过程,只同步Leader状态。Observer的目的是为了扩展系统,提高读取速度。

五.ZooKeeper选举机制

半数机制

  • 集群中半数以上机器存活,集群可用(双数的节点会浪费资源且可能诞生不出来leader(也叫脑裂),所以总机器数是奇数)
  • ZooKeeper工作时,有一个节点为Leader,其他为Follower,Leader是通过内部选举机制临时产生的
  • Leader选举是保证分布式数据一致性的关键所在

leader选举触发时机

  • 服务器初始化启动,开始选举,超过半数以上就决定了leader,后面启动都是follwer
  • 服务器运行期间无法和Leader保持连接,即leader网络通信不好等情况,按照数据的新旧,越新的就是leader

ZooKeeper集群中超过半数机器存活,就可提供服务
ZooKeeper是树形结构,每个节点都能存储数据
ZooKeeper中节点有Leader和Follower之分

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/107145157