Zookeeper的学习

Updated on with 0 views and 0 comments

Zookeeper的学习

Zookeeper

Zookeeper介绍

  1. 概述

    Apache 基金会管理(像是Maven、Tomcat都是)

    开源分布式、提供协调服务(类似调度中心,协调服务的提供方

  2. 工作机制

    基于观察者模式设计的分布式服务管理框架(listener监听、setInterval计时、setTimeout定时)

    image-20210728094506134

    保存服务注册信息、对外提供服务信息

    Zookeeper 可以搭集群 每个成员是一个节点

    image-20210728210317801

    Server 三个角色:领导者、随从、观察者

    • Zookeeper 一个领导级别的存在,监测和管理多个服务
    • 集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务
    • 数据一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 Zookeeper 中去
    • 更新请求顺序进行:来自同一个 Client 的更新请求按照其发送顺序依此执行
    • 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
    • 实时性:在一定时间范围,Client 能读到最新的数据

Zookeeper 数据结构

image-20210728214005214

Zookeeper 数据模型的数据结构与 Unix 文件系统很类似,都是树结构,树上有若干节点,每个节点可以存1MB数据,同时每个节点都是通过其路径可以唯一标识

Zookeeper 企业应用场景

服务包括:统一命名服务(统一命名一般Dubbo使用域名、ip)、统一配置管理(配置文件同步、实时性的更新)、统一集群管理(节点特性watcher机制;掌握节点状态并调整,实时检测节点变化并更新【集群底部守护线程管理】)、服务器动态上下线(动态更新,不影响整体运行)、软负载均衡(...)等。

Zookeeper 的安装与配置

下载连接 https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz

zookeeper 客户端访问端口 2181,不是内部集群端口

jps 查看进程 ./zkServer.sh start/status/stop 开启服务、查看状态、停止服务 打开客户端:./zkCli.sh

Zookeeper 内部原理

  1. Zookeeper 选举机制

    1)半数机制:集群中半数以上机器存活,集群可用。所以 Zookeeper 适合安装奇数台服务器

    2)Zookeeper 虽然在配置文件中 没有指定 Master 和 Slave。 但工作时,是有一个节点为 Leader,其他则为 Follower,Leader 是通过内部的选举机制临时产生的。

    Follower 集群扩展 参与选举

    Observer 观察者 不参与选举

    3)

    image-20210728140941490

    image-20210728140914070

  2. Zookeeper 节点类型

    1)持久节点(Persistent):服务端客户端断开连接后,节点不删除 持久化目录节点、持久化顺序编号目录节点(只是 zook 给该节点名称进行顺序编号)

    2)短暂节点(Ephemeral):服务端客户端断开连接后,节点自己删除 持久化目录节点、持久化顺序编号目录节点(只是 zook 给该节点名称进行顺序编号)

  3. Zookeeper 读写机制

    image-20210728142043076

Zookeeper 分布式安装部署(伪集群)

复制三份,没份的data清空,data路径更改

增加 myid 文件对应 id 存一个数字编号 1...

增加配置 增加如下

服务端口

server.1=ip地址"2888:3888"

server.2=ip地址"2889:3889"

server.3=ip地址"2890:3890"

客户端端口也需要更改

第一个2181、第二个2182、依次递增

clientPort=2181

Zookeeper 常用命令

  1. 启动客户端:./zkCli.sh
  2. 显示所有操作命令:help
  3. 看当前 znode 中所包含的内容:ls /
  4. 查看当前节点详细数据:ls -s /
  5. 分别创建 2 个普通节点:create /shuihu "songjiang" create /shuihu/liangshan "liubei"
  6. 获得节点的值:get /shuihu
  7. 创建短暂节点:create -e /person2 "guanyu"
  8. 创建带序号的节点:create -s /person2 "zhangfei"
  9. 修改节点内容:set /person2 "zhangfei"
  10. 监听节点变化:get /person2 watch
  11. 监听子节点变化:ls /person2 watch
  12. 删除节点:delete /person2
  13. 递归方式删除节点:deleteall /person2
  14. 查看节点状态:stat /person2

Zookeeper 的 API 应用

  1. 导入 jar 包

        <dependencies>
            <!--zookeeper-->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.5.9</version>
            </dependency>
            <!-- 日志-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
  2. 测试

    public class ZookeeperTest {
    
        // 集群地址
        private String host = "192.168.159.128:2181,192.168.159.128:2182,192.168.159.128:2183,";
        // 超时时间
        private int timeOut = 60000;
        // 客户端属性
        private ZooKeeper zkCli;
    
        // 先客户端登录
        @Before
        public void before() throws IOException {
            zkCli = new ZooKeeper(host, timeOut, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    try {
                        // 连根节点
                        zkCli.getChildren("/",true);
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
        }
    
        // 创建节点的测试
        @Test
        public void testCreateNode() throws KeeperException, InterruptedException {
            // 参数1 要创建的节点路径 参数2 节点数据 参数3 节点权限 参数4 节点的类型
            String s = zkCli.create("/person2","caocao".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
            System.out.println(s);
        }
    
        // 获取节点的测试
        @Test
        public void testGetNode() throws KeeperException, InterruptedException {
            byte[] data = zkCli.getData("/person2", false, null);
            String str = new String(data);
            System.out.println(str);
        }
    
        // 获取某个上级节点的所有下级子节点
        @Test
        public void testGetChildren() throws KeeperException, InterruptedException {
            List<String> children = zkCli.getChildren("/", false);
            for (String child : children) {
                System.out.println(child);
            }
        }
    
        // 判断某个节点是否存在
        @Test
        public void testExists() throws KeeperException, InterruptedException {
            Stat exists = zkCli.exists("/person2", false);
            System.out.println(exists);
        }
    
        // 删除节点
        @Test
        public void testDelete() throws KeeperException, InterruptedException {
            zkCli.delete("/person2",0);
        }
    
    }
    
  3. Zookeeper 总结

    单节点 Zookeeper 集群 Zookeeper

    节点就是 存的 服务器服务地址 ip对外查询地址 位置地址 找到了去调用(服务协调)


标题:Zookeeper的学习
作者:HB2Ocean
地址:http://future-hb.top:8080/articles/2021/07/29/1627490141668.html