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

Apache Zookeerper搭建的更多相关文章

  1. Django + Apache + 树莓派 搭建内网微信公众号服务器

    其实早在微信开放公众号开发平台时就想弄一个自己的公众号服务器,奈何对web服务器搭建和开发一窍不通,只是注册了一下开发者帐号,并没有采取行动,万恶的拖延症. 前一年,开始接触python,打开了神奇世 ...

  2. 【转】使用Apache Kylin搭建企业级开源大数据分析平台

    http://www.thebigdata.cn/JieJueFangAn/30143.html 本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭 ...

  3. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  4. Windows10 下Apache服务器搭建

    Windows10 下Apache服务器搭建   转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...

  5. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  6. centos6.X使用Apache+Mono搭建asp.net 环境

    mark 一下时间  2016年1月19日09:42:49 mono是指由Novell公司(由Xamarin发起,并由Miguel de lcaza领导的,一个致力于开创·NET在Linux上使用的开 ...

  7. Apache 服务器搭建 总结

    安装素材准备:<1>下载jdk <2>下载apache2.0.55 <3>下载tomcat5.5 <4>下载jk(mod_jk-apache-2.0.5 ...

  8. 使用Apache Archiva搭建Maven Repository Server

    关于 Maven 私服 的搭建 这里 采用 Apache Archiva 的 Standanlone 模式来安装 1) 首先到archiva主页上下载最新版(Archiva 2.2.1 Standal ...

  9. windows下PHP+Mysql+Apache环境搭建

    Apache版本:httpd-2.2.22-win32-x86-openssl-                   下载地址:http://pan.baidu.com/s/1sjuL4RV PHP版 ...

随机推荐

  1. nuxt中localstorage的替代方案

    采用异步的方式进行存储数据,更高效快速,使用localforage是你最好的选择 具体转载自博客 Heap Stack Blog(pingbook.top) Nuxt storage data in ...

  2. 解析node-cors模块

    (function () { 'use strict'; var assign = require('object-assign'); var vary = require('vary'); var ...

  3. 浅谈[0,1]区间内的n个随机实数变量中增加偏序关系类题目的解法

    浅谈[0,1]区间内的n个随机实数变量中增加偏序关系类题目的解法 众所周知,把[0,1]区间内的n个随机.相互独立的实数变量\(x_i\)之间的大小关系写成一个排列\(\{p_i\}\),使得\(\f ...

  4. 为什么mysql事务回滚后,自增ID依然自增

    因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysqlserver处于运行的时候,这个计数值只会随着insert改增长,不会随着de ...

  5. html页面添加左侧滑动菜单与内容部分的滚动条

    html + css + jquery 展示地址:https://migloo.gitee.io/front  或 https://www.igloo.xin/front 思路: 1.通过jquery ...

  6. RPA系列之(二)-UIPath学习目录

    如何一步步渐入佳境,跟着目录一点一点来 UiPath简介 UiPath下载安装与激活 UiPath第一个案例Hello World UiPath变量的介绍和使用-1 UiPath变量的介绍和使用-2 ...

  7. 使用vue搭建应用三引入scss

    Css.Sass.Scss的含义及区别 Css(Cascading Style Sheets) 层叠样式表 Sass(Syntactically Awesome StyleSheets) 是一款强化 ...

  8. phpcms新建模板页教程

    phpcms新建模板页教程1 直接去template文件夹里的复制的模板页 比方说list1.html2 去后台 界面模板风格 default 默认模板 点击详情列表 找到list1.htm 设置中文 ...

  9. 读懂 ECMA 规格

    一般我们都不关心 ECMA 规范,只需要学习怎么使用就好了.但有时候遇到一些难以解释的问题/现象,就不得不看一下规范是如何要求实现的了.规范内容庞杂,理解其中的术语有利于我们快速看懂规范. Envir ...

  10. Java8 新特性 函数式接口

    什么是函数式接口   函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了.  函数式接口的 ...