Zookeeper学习

今日目标

  • 计算机集群的安装和部署(根据课件安装)
  • zookeeper学习
    • zookeeper的概念 (了解)
    • zookeeper的架构和角色 3个角色(理解)
    • zookeeper的5个特性(了解)
    • zookeeper的安装(能够操作)
    • zookeeper的数据模型(理解)
    • zookeeper的节点类型(理解)
    • zookeeper的shell操作(会增删改查,watch)
    • zookeeper的 jAVA API(了解)
    • zookeeper的选举机制(理解,面试题)

apache zookeeper

zookeeper的概念

  • zookeeper为分布式应用提供分布式协调服务的软件

  • zookeeper的本质就是分布式小型文件系统和监控机制

  • 应用场景1-协调主机上下线
    在这里插入图片描述

  • 主备切换
    在这里插入图片描述

  • 其他应用场景

    1. 统一命名服务
    2. 统一配置管理
    3. 统一集群管理
    4. 服务器动态上下线
    5. 软负载均衡

分布式和集群的理解

  • 集群

    将一个应用或者软件进行重复部署,每个节点的数据和状态都是一致。

    每个人同时具备 洗菜 配菜 做菜 端菜 两个人都具备这个功能。

  • 分布式

    将一个应用或者软件根据应用步骤分别部署到不同的节点上进行计算。

    一个人: 洗菜 配菜

    一个人: 做菜

    一个人: 端菜

  • 分布式集群

    每个步骤都会有多个人同时操作,备份。

zookeeper的集群架构和角色

在这里插入图片描述

总结: zookeeper有三个角色

  1. leader 主节点
  2. follower 从节点
  3. observer 观察者节点(一般情况下不设置)

读频率会远远大于写。

注意:zookeeper集群不能正常运行时,节点都会进入Looking状态(角色)

zookeeper的5大特性

  • 全局数据的一致性

    连接不同的服务器,数据读取的都是一致的。

  • 可靠性

    只要数据被任意一台所接受,其他的节点也同样被接受。

  • 顺序性

    1. 全局有序

      指的是针对服务器来说,如果其中的一个节点事务型操作,另外一台也进行事务操作,他们之间的操作是有序的。

在这里插入图片描述

  1. 偏序

    指的是针对客户端来说,如果先事务操作了 a 在操作c ,执行顺序就是 a c

在这里插入图片描述

  • 数据更新的原子性

需要满足更新成功半数以上的服务器

  • 实时性

    zookeeper 小型的服务器,从节点拉取数据,保证数据的实时性。

部署zookeeper集群环境

计算机集群的安装
部署三台节点(克隆两台)
  • 在node1上点击管理 => 克隆 出来两台虚拟机
配置节点内存和CPU
  • 需要多少内存?

    总内存 / 4 每台虚拟机需要的内存数

  • 设置每台虚拟机的内存

    编辑虚拟机属性 -> 内存 调整

  • 设置 MAC 地址

    MAC 就是网卡中唯一标识,路由优化 mac 找到你 家庭地址

    IP 就是在互联网中找到你的位 个人的位置信息 会变化

    如何修改MAC

    • 网络编辑器 -> 高级 -> mac 自动生成唯一编码
  • 设置每台节点的IP地址(静态ip)

    设置的三台节点分别是

    192.168.88.161 node1

    192.168.88.162 node2

    192.168.88.163 node3

    配置网关

在这里插入图片描述

如何设置ip

vim /etc/sysconfig/network-scripts/ifcfg-ens32

在这里插入图片描述

重启服务

systemctl restart network

判断是否设置成功

ping www.baidu.com
  • 设置主机名称

    主机别名

    如何设置主机名

    vim /etc/hostname
    
  • 域名映射

    vim /etc/hosts
    
    192.168.88.161 node1 node1.itcast.cn
    192.168.88.162 node2 node2.itcast.cn
    192.168.88.163 node3 node3.itcast.cn
    
  • 关闭防火墙和selinux

    防火墙: 配置屏蔽(开放)规则,ip和port

    如何关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld
    systemctl status firewalld
    

    关闭selinux

    vim /etc/selinux/config
    SELINUX=enforcing 改成 disabled
    
  • 重启服务器

    reboot

  • 设置三台节点之间的免密登录

在这里插入图片描述

  1. 首先生成一个密钥对,公钥拷贝给连接的节点,node2
  2. ssh 连接node2,node2会随机生成一个文本串,用公钥进行加密
  3. 将加密的数据发送给node1,node1会通过私钥进行解密
  4. 解密之后的数据会发送给node2,node2会将解密的数据和生成的数据进行比对
  5. 如果比对成功允许免密登录,不需要输入密码。
  • 如何操作免密登录

    1. 三台节点都生成一对秘钥对

      ssh-keygen -t rsa

    2. 将三台节点的公钥全部先拷贝给node1

      ssh-copy-id node1

    3. 将node1中三台的公钥在拷贝分发到另外两台 node2 node3

      scp -r authorized_key root@~/.ssh/

      scp /root/.ssh/authorized_keys node2:/root/.ssh
      scp /root/.ssh/authorized_keys node3:/root/.ssh
      
  • 时钟同步

    主要保证不同的服务器之间的时间一致,状态一致。

    如何进行操作?

    1. 都连接到外部服务器
    crontab -e
    * * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
    
    1. 同时连接同一台内网主机
    yum install -y ntp
    # 设置参数
    vim /etc/ntp.conf 
    # 设置哪些节点能够同步当前node1
    restrict  192.168.88.0  mask  255.255.255.0  nomodify  notrap
    # 如果连接不上外网 就使用当前时间
    server   127.127.1.0 
    fudge    127.127.1.0  stratum  10
    # 禁用当前节点连接外网
    #server  0.centos.pool.ntp.org
    #server  1.centos.pool.ntp.org
    #server  2.centos.pool.ntp.org
    #server  3.centos.pool.ntp.org
    
    # 设置 BIOS和系统时间保持同步
    # 主板上的基本输入输出部件
    vim /etc/sysconfig/ntpd
    SYNC_HWLOCK=yes
    

    补充内容: 定时任务(linux)
    在这里插入图片描述

# 12点半执行脚本
30 12 * * * 脚本 参数
# 每三个小时跑一次
* */3 * * * 脚本 参数
# 1-3 跑一次
* 1-3 * * * 脚本 参数
  1. node2 node3如何同步node1时间

    # 将node1同步到node2 和node3
    */1 * * * * /usr/sbin/ntpdate 192.168.88.161
    
  • 安装JDK1.8_241 版本

    1. 解压缩
    tar -zxvf /export/software/jdk1.8_241 -C /export/server
    
    1. 配置环境变量
    #不建议之间修改 /etc/profile 文件
    vim /etc/profile.d/my_env.sh
    
    export JAVA_HOME=/export/software/jdk1.8_241
    export PATH=:$PATH:$JAVA_HOME
    
    1. 立即生效
    source /etc/profile
    
    1. 执行java命令,验证安装

    java -version

    javac -version

  • 虚拟机镜像快照

    保存一个快照,快速进行数据的恢复。

zookeeper安装
  1. 下载zookeeper软件包 zookeeper3.4.6.tar.gz

  2. 将压缩包解压缩到 /export/server

  3. 修改zookeeper的配置文件 cp zoo_sample.xml zoo.xml

    tickTime=2000
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=/export/server/zookeeper-3.4.6/zkdatas/
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the 
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    autopurge.purgeInterval=1
    
    # 集群中服务器地址
    # server.A=B:C:D
    #	A是一个数字,表示这个是第几号服务器
    #	B是这个服务器的地址
    #	C是这个服务器Follower与集群中的Leader服务器交换信息的端口
    #	D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的
    server.1=node1:2888:3888
    server.2=node2:2888:3888
    server.3=node3:2888:3888
    
  4. 添加每台节点 myid

  5. 将修改好的zookeeper 软件包分发给 node2 和 node3

    scp 服务器之间的文件拷贝

    scp 文件 用户名@主机名:目录

    scp -r 文件夹 用户名@主机名:目录

  6. 修改node2 和node3 的myid

  7. 启动zookeeper服务器

/export/server/zookeeper-3.4.6/bin/zkServer.sh start
  • 启动的角色分别是:

node1:follower

node2:leader

node3:follower

zookeeper的数据模型

在这里插入图片描述

  • 目录树,名称空间 (一本书的目录)

  • 与普通文件系统不同的地方

    1. 每个节点既可以存储数据,又可以有子节点
    2. 节点存储的大小默认是 1MB ,远远小于1MB
    3. 通过引用路径访问,必须要从 / 目录开始读取文件或者数据 ls /

    Znode的组成:

    1. stat 状态

在这里插入图片描述

  1. 子Znode childre

在这里插入图片描述

  1. data 数据

在这里插入图片描述

zookeeper的节点类型

  • zookeeper节点类型分为:

    1. 临时节点

    session会话,会话结束的时候,关闭当前的节点。

    客户端 => 服务器 建立连接,产生一个 session 会话,与会话 session相关

    1. 永久节点

    不与session相关,只要创建,会永久存在。

    1. 序号

    带上序号节点被分为了 4 类:

    1. 临时序号的节点
    2. 永久序号的节点
    3. 临时节点
    4. 永久节点

使用 shell 操作zookeeper

  1. 通过客户端连接 zookeeper

    zkCli.sh -server 主机名:端口
    
    zkCli.sh -server node1:2181
    
  2. 通过shell操作zookeeper (需要掌握)

    help 将所有的操作命令列出来

ZooKeeper -server host:port cmd args
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setquota -n|-b val path
        history 
        delete path [version]
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        connect host:port
        
# 创建一个持久 znode 节点 hadoop
create /hadoop hadoop
# 创建一个临时 zonode 节点 hive
create -e /hive hive
# 创建一个带序号的 znode 临时节点 spark
create -s -e /spark spark
# 修改节点的数据 将 hadoop 修改为 hive
set /hadoop hive
# 删除当前没有子节点的 Znode 的节点
delete /hadoop
# 删除带子节点的 Znode 的节点
rmr /hadoop/hive
# 查询当前的子节点
ls /hadoop
# 查询当前的子节点包括 stat 状态数据
ls2 /hadoop
# 想连接到其他的节点  node2
connect node2:2181
# 设置配额信息 ,节点数据的大小,子节点的个数
setquota -n|-b val path
-n 子节点的个数
-b 子节点的数据的大小
# 允许当前的hive节点下只能有两个子节点(不生效)
setquota -n 2 /hive
# 查询配额的信息列表
listquota /hive

在这里插入图片描述

扩充内容:

  • 临时节点不能创建子节点
watch机制特点
  • 一次性触发

  • 事件触发

    state 状态 type 事件的类型 path 监控的路径

  • 先注册再触发

ls /hive watch

在这里插入图片描述

zookeeper 通过 JAVA Api 操作

  1. 需求

    对zookeeper节点进行创建、修改节点数据、获取节点数据、watch 节点

  2. 分析步骤

    //1.创建 Znode 节点,添加 createZnode 方法
        //1.1 定制一个重试策略
        //1.2 工厂类获取一个客户端对象
        //1.3 开启一个客户端对象
        //1.4 创建Znode 节点对象,在节点/hello2下写入一个 world 内容
        //1.5 关闭客户端对象
    //2.修改 Znode 节点数据,创建 nodeData 方法
        //2.1 定制一个重试策略
        //2.2 工厂类获取一个客户端对象
        //2.3 开启一个客户端对象
        //2.4 客户端设置指定路径下的数据
        //2.5 关闭客户端对象
    //3.Znode 节点的数据查询 getData方法
        //3.1 定制一个重试策略 
        //3.2 工厂类获取一个客户端对象
        //3.3 开启一个客户端对象
        //3.4 判断路径并获取 /hello2 的数据
        //3.4.1 实例化 ZkClient
        //3.4.2 通过zkClient判断路径是否存在,如果存在了获取此节点下的值
        //3.4.3 如果不存在路径提示,路径不存在
        //3.5 打印输出此路径下的数据
        //3.6 关闭客户端对象
    //4.创建监听节点事件 watchNode方法
        //4.1 定制一个重试策略
        //4.2 工厂创建客户端对象
        //4.3 开启客户端对象
        //4.4 将监听的节点树指定给缓存TreeCache中
        //4.5 自定义监听事件,实现匿名内部类,判断事件类型
        //4.6 开启缓存树进程
        //4.7 阻塞进程
    
  • 代码实现

    ctrl + h : 用于显示当前的抽象类或者接口的所有子类

    ctrl + p : 快速显示当前参数的类型列表 快捷键

    /**
     * Author itcast
     * Date 2020/12/20 16:46
     * 需求:
     * 1.创建一个节点 hive 内容 hive
     * 2.修改这个节点的内容 /hive hive -> hadoop
     * 3.判断如果当前的节点/hive存在,读取/hive下的数据
     * 4.创建一个带监听/hive的事件,捕捉当前这个节点做了什么操作
     */
    public class ZookeeperDemo {
        public CuratorFramework client;
    
        @Before
        public void init() {
            //连接字符串
            String connectString = "node1:2181,node2:2181";
            ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(2000, 3);
            //创建一个客户端 CuratorFrameworkFactory
            client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
            //开启这个客户端
            client.start();
        }
    
        //1.创建 Znode 节点,添加 createZnode 方法
        //1.1 定制一个重试策略
        //1.2 工厂类获取一个客户端对象
        //1.3 开启一个客户端对象
        //1.4 创建Znode 节点对象,在节点/hello2下写入一个 world 内容
        //1.5 关闭客户端对象
    
        public void createZnode() throws Exception {
            //写入数据 /hello2 world
            client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2", "world".getBytes());
        }
    
        //2.修改 Znode 节点数据,创建 nodeData 方法
        //2.1 定制一个重试策略
        //2.2 工厂类获取一个客户端对象
        //2.3 开启一个客户端对象
        //2.4 客户端设置指定路径下的数据
        //2.5 关闭客户端对象
    
        public void nodeData() throws Exception {
            Stat stat = client.setData().forPath("/hello2", "hive".getBytes());
            long ctime = stat.getCtime();
            long mtime = stat.getMtime();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String ctimeStr = dateFormat.format(ctime);
            String mtimeStr = dateFormat.format(mtime);
            System.out.println(ctimeStr);
            System.out.println(mtimeStr);
        }
    
        //3.Znode 节点的数据查询 getData方法
        //3.1 定制一个重试策略
        //3.2 工厂类获取一个客户端对象
        //3.3 开启一个客户端对象
        //3.4 判断路径并获取 /hello2 的数据
        //3.4.1 实例化 ZkClient
        //3.4.2 通过zkClient判断路径是否存在,如果存在了获取此节点下的值
        //3.4.3 如果不存在路径提示,路径不存在
        //3.5 打印输出此路径下的数据
        //3.6 关闭客户端对象
        public void getData() throws Exception {
            //判断节点是否存在 如果存在在获取数据
            ZkClient zkClient = new ZkClient("node1:2181");
            if (zkClient.exists("/hello2")) {
                byte[] value = client.getData().forPath("/hello2");
                String values = new String(value);
                System.out.println(values);
            }
        }
    
        //4.创建监听节点事件 watchNode方法
        //4.1 定制一个重试策略
        //4.2 工厂创建客户端对象
        //4.3 开启客户端对象
        //4.4 将监听的节点树指定给缓存TreeCache中
        //4.5 自定义监听事件,实现匿名内部类,判断事件类型
        //4.6 开启缓存树进程
        //4.7 阻塞进程
        @Test
        public void watchNode() throws Exception {
            TreeCache treeCache = new TreeCache(client, "/hello2");
            treeCache.getListenable().addListener(new TreeCacheListener() {
                @Override
                public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                    //如果是创建节点 打印当前节点被创建
                    //如果当前节点被修改 被修改
                    //如果当前节点被删除 被删除
                    switch (event.getType()) {
                        case NODE_ADDED:
                            System.out.println("当前节点被创建");
                            break;
                        case NODE_UPDATED:
                            System.out.println("当前节点被更新");
                            break;
                        case NODE_REMOVED:
                            System.out.println("当前节点被删除");
                            //client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("")
                    }
                }
            });
            treeCache.start();
            Thread.sleep(100000);
        }
    
        @After
        public void close() {
            //客户端关闭
            client.close();
        }
    }
    

在这里插入图片描述

  • 监控节点的事件信息

在这里插入图片描述

zookeeper的选举机制

在这里插入图片描述

  • 新集群的选举机制

    首先第一台进行选举,发现没有其他的节点,没有选出leader,当前还是looking

    当第二台开机,进行选举,各投自己一票,信息的交换,发现第二台的级别 myid比第一台大

    node2会获取两票,node1 0 票,node2 两票没有超过半数,两个节点都是looking状态,

    当第三台开机,各投自己一票,信息的交换,发现第三台的级别最高,第三台获取3票,超过半数

    状态变成leader

    第四台,发现没有选举looking ,直接变成 follower

    第五台同第四台。

  • 老集群选举机制

    只需要考虑 zxid 事务id,事务id的级别是最高的,如果事务id一样的情况,看myid谁大选谁做leader。

问题集锦

  1. ssh srt 不能连接 vmware 虚拟机

    解决办法:

    1. 修改 vmware 网络编辑器中 网关 192.168.88.1

    2. 修改本地适配器 IPV4
      在这里插入图片描述



个人导图笔记

zookeeper概念

在这里插入图片描述
zookeeper安装要点
在这里插入图片描述

重要概念

监听器

在这里插入图片描述

ZBA协议

在这里插入图片描述

写流程

在这里插入图片描述
在这里插入图片描述


知识点回顾

下面我们通过一些简单问题来回顾一下知识点

zookeeper概念:是____________________应用(框架)

zookeeper的本质是_____________系统和______________机制

zookeeper的应用场景:统一的配_______、集________

我们使用zookeeper主要是因为它__________________的特性

5大 特性:1,全__________,2,___靠____,3,顺____,4,数据更______,5,实_____(快)

zookeeper集群(至少___台):配置_______文件并分发,各节点配置自己的_____文件,注意时___

zookeeper使用____数据结构,兼顾_____和_____ 的特点

4种节点类型:持______,临______,______顺序,______顺序

节点大小限制_____M;顺序号由_________维护

监听器原理:使用______,一个______,另一个________

ZBA协议:是___________协议,两种工作模式:______播,______复

ZBA协议的选举机制:_________,_______的权重最高,其次是__________

写流程:收到请求后由______广播写请求;各节点_____,若同意则______;leader统计,超半数则______

在写流程时,若flower不同意,则会______,原因:___________

在shell中,查看节点的命令是_____,数据的增删查改命令是__________

如何使用Java API操作zookeeper?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值