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,谁最大谁胜出

原文地址:https://www.cnblogs.com/jjpbk/p/11728394.html