zoukankan      html  css  js  c++  java
  • Apache Zookeerper搭建

    08-Apache Zookeerper--概述和集群相关概念(主从、主备)
        01) zookeeper的介绍
            01) 分布式协调服务的开源框架,主要解决分布式集群中应用系统间的一致性问题.
            02) 小文件的存储系统(数据存放在内存中,数据量有大小限制), 以树形结构进行组织数据
            03) 可以维护和监控数据状态的变化,通过监控数据状态的变化,达到分布式系统中集群管理的效果.
            04) 分布式程序: 可以多台服务器部署(可靠 稳定)
            05) zookeeper是一个主从架构集群(一个大哥带着多个小弟干活)
        02) 主从  主备概念介绍
            01) 主从
                主角色: master leader 大哥
                从角色: slave  follower 小弟
                常见一主多从架构(storm hadoop等),主从架构各司其职,互相配合,共同对外提供服务
            02) 主备
                主角色: active(活跃的)
                备角色: standby(备用状态)
                主备角色常用于解决单点故障问题,常见的是一主一备, 只有主角色发生故障时,备角色才会切换成主角色
                同一时刻只能有一个主角色(一山不容二虎)
            高可用架构:  现实中的集群大多数是一主多从架构,同时给主角色搞一个备角色
    09-Apache Zookeerper--zk全局数据一致性特性
        01) 全局数据一致性
            无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的.
        02) 原子性
            一次数据更新要么成功(过半更新成功),要么失败,不存在中间状态
        03) 可靠性
            一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖
        04) 顺序性
            客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去
    10-Apache Zookeerper--集群角色介绍
        01) 主角色:leader
            事务性请求的唯一处理和调度者,保证集群事务处理的顺序性,同时全局统一协调管理各个follower
        02) 从角色
            响应非事务处理请求(查询请求),转发事务请求给leader,参与leader的选举投票
        03) observer 观察者角色
            没有投票选举权的follower,可以响应非事务处理请求,转发事务请求给leader
            通常用于zk集群扩大读性能

    11-Apache Zookeerper--集群搭建--java安装
        01) 卸载centos自带的openjdk
        02) 上传jdk安装包
        03) 解压jdk安装包到指定的目录
        04) 配置JAVA_HOME和jdk环境变量
        05) 让环境变量生效
        06) 验证是否安装成功
    12-Apache Zookeerper--集群搭建--配置文件详解&启动关闭
        01) 前提条件:
            监测jdk是否安装成功
            检测集群时间是否同步
            检测防火墙是否关闭
            检测主机 ip映射有没有配置
                一般windows也会配置主机名和ip映射
            检查SSH免密登录
        02) 安装步骤:
            01) 上传zookeeper的安装包到一台服务器上
                cd /export/software
                rz  选择zookeeper的安装包进行上传
            02) 解压zookeeper到指定的目录
                tar -zxf zookeeper-3.4.5-cdh5.14.0.tar.gz -C /export/servers/
                cd /export/servers/
            03) 修改zookeeper的配置文件
                cd /export/servers/zookeeper-3.4.5-cdh5.14.0/conf
                mv zoo_sample.cfg  zoo.cfg
                vi zoo.cfg

                修改内容如下:
                    dataDir=/export/data/zk
                配置文件底部添加如下内容:
                    server.1=hadoop01:2887:3887
                    server.2=hadoop02:2887:3887
                    server.3=hadoop03:2887:3887
                备注:
                    2181: zookeeper客户端连接端口
                    2887: 服务器间通信的端口
                    3887: 选举的端口
            04) 将配置好的zookeeper分发给其他两台主机上
                cd /export/servers/
                scp -r zookeeper-3.4.5-cdh5.14.0/ root@hadoop02:$PWD   //将zookeeper复制到node02的同级目录下
                scp -r zookeeper-3.4.5-cdh5.14.0/ root@hadoop03:$PWD   //将zookeeper复制到node03的同级目录下

                备注:
                    scp远程拷贝
                    -r  拷贝文件夹
                    $PWD: 和当前目录一致
            05) 分别在三台主机上创建数据存放目录和myid文件
                hadoop01:执行的命令
                    mkdir -p  /export/data/zk
                    echo "1" > /export/data/zk/myid       //将1字符串写入myid这个文件中,文件位置和文件名不可以修改
                    cat /export/data/zk/myid             //此命令用于查看此文件有没有正确写入 1

                hadoop02:执行的命令
                    mkdir -p  /export/data/zk
                    echo "2" > /export/data/zk/myid
                    cat /export/data/zk/myid             //此命令用于查看此文件有没有正确写入 2

                hadoop03:执行的命令
                    mkdir -p  /export/data/zk
                    echo "3" > /export/data/zk/myid
                    cat /export/data/zk/myid            //此命令用于查看此文件有没有正确写入 3

            06) 配置zookeeper的环境变量
                vim /etc/profile
                    export ZK_HOME=/export/servers/zookeeper-3.4.5-cdh5.14.0
                    export PATH=$PATH:$ZK_HOME/bin
                source /etc/profile 让环境变量生效
            07) 启动和关闭zookeeper集群
                三台服务器逐个启动: zkServer.sh start
                停止zookeeper的命令: zkServer.sh stop
            08) 查看zookeeper集群的状态
                zkServer.sh status
            09) 编写一键启动脚本
                #!/bin/sh
                echo "启动zookeeper中...."
                for host in hadoop01 hadoop02 hadoop03
                do
                ssh -q $host "source /etc/profile; /export/servers/zookeeper-3.4.5-cdh5.14.0/bin/zkServer.sh start"
                done
    13-Apache Zookeerper--数据模型和节点类型
        01) 简单的数据模型
            01) 典型的树形层次结构
            02) zookeeper树上的每个节点被称为znode,znode具有以下特性:
                01) znode兼具有文件和目录的特性
                    既可以像文件存储数据,还可以作为路径标识的一部分,并且可以具有子znode.
                02) znode通过路径引用
                    引用路径必须以斜杠(根目录)开头,必须是绝对路径,而且一个znode的路径都是唯一的
                03) znode存放的数据量有限
                    znode数据存放在内存中,存放数据大小至多1M
        02) znode的类型
            01) 两种节点类型
                01) 临时节点
                    临时节点是指这个Znode的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除
                02) 持久节点
                    持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNode将一直保存在Zookeeper上
            02) znode的序列化特性
                ZooKeeper还允许用户为每个节点添加一个特殊的属性: sequential(序列化)
                一旦节点被标记上这个属性,那么在这个节点被创建的时候,Zookeeper会自动在其节点名后面追加上一个整型数字,
                这个整型数字是一个由父节点维护的自增数字
            03) 整体节点类型:
                persistent: 永久节点
                ephemeral: 临时节点
                persistent_sequential: 永久节点 序列化
                ephemeral_sequential: 临时节点 序列化

            注意: 临时节点不能有子节点
    14-Apache Zookeerper--shell命令行操作znode
        01) 客户端连接
            zkCli.sh -server host:port   举例: zkCli.sh -server hadoop01:2181
            如果连接本机,不需要加-server参数  举例: zkCli.sh
        02) shell客户端操作
            01) 创建节点
                create [-s] [-e] path  data
                说明: -s sequential:序列化  -e  ephemeral: 临时的
                举例:
                    create /itcast 123123   创建永久非序列化节点
                    create -e /itcasttmp 123123  创建临时非序列化节点,会话结束,节点会被移除
                    create -s /itcast/a aaaa    创建永久序列化节点,会自动添加自增的序列化编号
            02) 读取节点
                ls path
                    说明: 列出指定节点下的所有子节点
                    举例: ls /itcast
                get path
                    说明: 获取指定节点的数据内容和属性信息
                    举例: get /itcast

            03) 更新节点
                set path data
                    说明: 更新节点的数据内容
                    举例: set /itcast 345345
            04) 删除节点
                delete path
                    说明: 删除节点(如果节点下存在子节点,需要先删除子节点,才能删除该节点)
                    举例: delete /itcast/b0000000003
                rmr path
                    说明: 递归删除节点
                    举例: rmr /itcast
            05) 其他命令:
                history: 列出来执行的历史命令
                setquota -n 2 /itcast
                    说明: 对节点增加限制  -n 子节点最大个数
                    注意: 首先该节点必须存在,才能限制, 其次限制为软限制,超出限制仅仅会在日志中警告
                listquota path  列出指定节点的quota
                    举例: listquota /itcast
                delquota path  删除指定节点的quota
                    举例: delquota /itcast
    15-Apache Zookeerper--节点属性和watch监听机制
        01) 节点属性:
            cZxid = 0x1200000010        //创建时的事务id
            ctime = Fri Aug 30 10:08:36 CST 2019
            mZxid = 0x1200000023        //最后一次更新时的事务id
            mtime = Fri Aug 30 10:42:56 CST 2019
            pZxid = 0x120000002e        //当前节点子节点列表最后一次被修改时的事务id
                                        //引起子节点列表变化的两种情况:删除子节点或者新增子节点
            cversion = 4                //子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。
            dataVersion = 2             //数据的版本(每修改一次,就加1)
            aclVersion = 0
            ephemeralOwner = 0x0        //创建临时节点时的事务id(也就是sessionid)
            dataLength = 27             //数据长度
            numChildren = 4             //子节点个数
        02) Watcher监听机制
            01) 介绍:
                Watcher(事件监听器),是Zookeeper中的一个很重要的特性.
                Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,
                ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性
            02) 监听机制的步骤
                1 设置监听
                2 监听的执行
                3 触发监听,通知给设置监听者(回调 callback)
            03) 监听机制的特点
                1 监听需要先注册才能触发
                2 客户端可以去监听zk目录树几种事件的发生: 节点创建事件 节点删除事件  节点数据改变  子节点改变
                3 设置监听是一次性的,每次都需要重新注册

            04) 演示举例:
                设置节点数据变动监听:  get /itcast watch
                使用另外一个客户端更改节点数据:  set /itcast  bbbb
                此时设置监听的客户端会收到通知(节点数据变动通知): WatchedEvent state:SyncConnected type:NodeDataChanged path:/itcast

    16-Apache Zookeerper--zk java api
        01) 节点的增删改查API操作:
            public class ZkDemo {

                ZooKeeper zk = null;
                //连接字符串
                public static final String connectString = "node01:2181,node02:2181,node03:2181";
                //超时时间
                public static final int sessionTimeout = 3000;


                /**
                 * 初始化zookeeper客户端连接对象
                 *
                 * @throws Exception
                 */
                @Before
                public void init() throws Exception {
                    this.zk = new ZooKeeper(connectString, sessionTimeout, null);
                }

                /**
                 * 创建znode节点
                 */
                @Test
                public void testCreate() throws InterruptedException, KeeperException {
                    //参数1: 路径, 参数2: 数据 , 参数3: 访问权限列表, 参数4: 节点类型(4种节点类型)
                    String create = zk.create("/itheima", "专注于it培训".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

                    System.out.println(create);

                    zk.close();
                }


                /**
                 * 获取节点数据
                 *
                 * @throws Exception
                 */
                @Test
                public void testGet() throws Exception {
                    // 参数1:节点路径    参数2:是否需要监听    参数3:所要获取的数据的版本,null表示最新版本的节点数据
                    byte[] data = zk.getData("/itheima", false, null);

                    System.out.println(new String(data, "utf-8"));

                    zk.close();
                }


                /**
                 * 修改节点数据
                 *
                 * @throws Exception
                 */
                @Test
                public void testUpdate() throws Exception {
                    //参数1: 节点路径,  参数2: 修改成的数据内容    参数3: 版本, -1 代表任何版本(系统来维护)
                    zk.setData("/itheima", "一样的教育,不一样的品质22".getBytes(), -1);

                    zk.close();
                }


                /**
                 * 删除节点数据
                 *
                 * @throws Exception
                 */
                @Test
                public void testDelete() throws Exception {
                    //参数1: 节点路径  参数2: 版本 -1 代表任何版本
                    zk.delete("/itheima", -1);

                    zk.close();
                }

            }
        02) 节点监听API操作:
            public class ZkWatchDemo {

                ZooKeeper zk = null;
                //连接字符串
                public static final String connectString = "node01:2181,node02:2181,node03:2181";
                //超时时间
                public static final int sessionTimeout = 3000;

                /**
                 * 初始化
                 */
                @Before
                public void init() throws IOException {
                    //参数3: 设置的监听器
                    zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                        public void process(WatchedEvent event) {
                            //如果注册了监听,一旦触发,就会调用这个process方法
                            if(event.getState() == Event.KeeperState.SyncConnected && event.getType() == Event.EventType.NodeDataChanged){
                                //节点数据变化事件
                                System.out.println("触发监听回调:");
                                System.out.println(event.getState());
                                System.out.println(event.getType());
                            }else if(event.getState() == Event.KeeperState.SyncConnected && event.getType() == Event.EventType.NodeChildrenChanged){
                                //子节点变化事件
                                System.out.println("触发监听回调:");
                                System.out.println(event.getState());
                                System.out.println(event.getType());
                            }
                        }
                    });
                }


                /**
                 * 测试监听
                 * @throws Exception
                 */
                @Test
                public void testGetWatch() throws Exception {
                    //监听节点数据的变化事件
                    byte[] data = zk.getData("/itheima", true, null);
                    //监听节点的子节点变化事件
                    List<String> children = zk.getChildren("/itheima", true);
                    System.out.println(new String(data, "UTF-8"));

                    //客户端不要关闭
                    Thread.sleep(Long.MAX_VALUE);

                }
            }
    17-Apache Zookeerper--选举机制
        01) 选举说明:
            01) 投票数超过半数则胜出,投票结束
            02) 服务器编号越大,权重越大
            03) 数据id(dataversion) 越大, 权重越大
            04) 逻辑时钟: 又叫投票次数,同一轮投票过程中的逻辑时钟值是相同的.
        02) 全新集群的选举机制:
            原则:
                每个人都是自私的
                服务器编号越大(myid),权重越大
                投票过半数则胜出,选举结束

        03) 非全新集群的选举机制:
            原则:优中择优
                找出数据最新的  dataversion最大
                找出状态最好的  逻辑时钟是否一致,小于当前时钟的,排除
                如果以上都情况,还无法确定一个leader, 最后比较服务器编号id,谁最大谁胜出

  • 相关阅读:
    scrapy 命令行传参 以及发送post请求payload参数
    scrapy框架+selenium的使用
    python 制作GUI页面以及多选框、单选框
    上线操作
    在Linux中使用selenium(环境部署)
    解读Java NIO Buffer
    Maven自定义Archetype
    解决spark streaming集成kafka时只能读topic的其中一个分区数据的问题
    在windows下使用pip安装python包遇到缺失stdint.h文件的错误
    maven-shade-plugin插件未生效原因分析
  • 原文地址:https://www.cnblogs.com/jjpbk/p/11728394.html
Copyright © 2011-2022 走看看