2.zookeeper知识点

day01—————

零、复习

1. 大数据的概述
	--概念和特征 (重点)
2. hadoop的概述
	--hadoop的核心模块(重点):三个,HDFS,Mapreduce,Yarn
	--google的三篇论文(重点):《GFS》《Mapreduce》《Bigtable》
	--Hadoop的特点:
		 apache,开源,免费,JAVA语言,跨平台性,运行在廉价机器,具有高可靠高容错性,扩展性良好
3. Hadoop的安装
	--本地模式
	--伪分布式模式
	--完全分布式模式(重点)
4. hdfs的块思想
	-- 块大小的选择(重点)
		(1)最小化寻址开销时间
		(2)内存的使用率(块太小,集群存储能力差)
		(3)网络带宽稀缺(是固定的,块越大,网络带宽相对越小)
	-- hdfs的优缺点
         (1)不适合低延迟的工作
         (2)不适合小文件的存储
         (3)只支持一个作者的写入,只能追加。
5. hdfs的体系结构(重点)
	-- 主从架构,四个组成部分,以及每个组成部分的作用
6. hdfs的工作机制(重点)
	-- 开机过程
	-- 心跳反馈机制
	-- 检查点机制
	-- 机架感知
7. 客户端API接口的使用
	-- 获取文件状态的逻辑代码(重点)
8. 数据流(重点)
	--写流程
	--读流程

一. Zookeeper的概述

1.1 zookeeper的概念和特点

--1. 是apache的开源框架
--2. 为分布式应用程序做协调服务,是hdfs和hbase的重要组成部分
--3. 本身就是一个分布式应用框架
--4. 提供了类似unix的文件系统树状图的数据存储模型
--5. 提供了监听和通知功能(重点)
--6. 提供了一组机器指令,提供了java和c语言的接口

还有的特点是:

--1. 是一个分布式集群框架,有一个leader和多个follower
--2. 集群节点只要存在半数以上就可以提供协调服务,因此适合安装在奇数台机器上   
	 也就是只要存在(n+1)/2台就可以,换句话说允许最多(n-1)/2台宕机
--3. 全局数据具有一致性(也就是每个节点上的数据完全一样,因此zookeeper的客户端访问到哪一个follower都是可以的)
--4. 请求按照顺序执行
--5. 数据更新具有原子性,要么成功,要么回滚
--6. 数据更新时,由于数据量比较小,所以是实时的,几乎没有延迟
--7. 由于数据的一致性,所以具有高可靠性,高性能。

1.2 zookeeper的数据模型(重点)

--1. 是一个类似Unix文件系统的层次化树形结构
--2. 每一个节点都被称之为znode,而不是文件或目录
--3. znode可以存储1M以内的数据,类似文件系统的文件(zookeeper是用来协调服务的,而不是用来存储数据)
--4. znode可以存储子节点的名称,类似文件系统的目录
--5. znode使用绝对路径进行唯一标识

二. Zookeeper的安装与使用

2.1 安装

##1. 上传,解压,并更名
[root@qianfeng01 local]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
[root@qianfeng01 local]# mv zookeeper-3.4.10 zookeeper

##2. 配置环境变量
[root@qianfeng01 local]# vim /etc/profile
..........省略.............
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
[root@qianfneg01 local]# source /etc/profile

##3. 修改配置文件zoo.cfg
[root@qianfeng01 local]# cd ./zookeeper/conf/               
[root@qianfeng01 conf]# cp  zoo_sample.cfg  zoo.cfg   #复制出zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000				#  定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10				#follower连接并同步leader的初始化连接时间。
syncLimit=5					#心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData       #修改zookeeper的存储路径,zkData目录一会要创建出来
clientPort=2181							 #客户端连接服务器的port
server.1=qianfeng01:2888:3888    			 # 添加三个服务器节点
server.2=qianfeng02:2888:3888
server.3=qianfeng03:2888:3888

-------下面是解析,不要复制------------------
解析Server.id=ip:port1:port2
id:		服务器的id号,对应zkData/myid文件内的数字
ip: 	服务器的ip地址
port1:	follower与leader交互的port
port2:	选举期间使用的port


注意:此配置文件中,不支持汉字注释

##4. 创建存储目录以及myid文件的编写
[root@qianfeng01 conf]# mkdir ${ZOOKEEPER_HOME}/zkData
[root@qianfeng01 conf]# echo "1" > ${ZOOKEEPER_HOME}/zkData/myid

##5. 同步到另外两台机器上,并修改myid为对应的server.x的值
[root@qianfeng01 local]# scp -r zookeeper/ mei02:/usr/local
[root@qianfeng01 local]# scp -r zookeeper/ mei03:/usr/local

[root@qianfeng01 local]# scp /etc/profile mei02:/etc/
[root@qianfeng01 local]# scp /etc/profile mei03:/etc/

注意:千万别忘记修改第二台和第三台的myid文件

2.2 启动

--1. 启动脚本与指令
[root@qianfeng01 ~]# zkServer.sh start
 
需要注意的是:
(1)多台机器必须一起执行启动脚本
(2)日志的存储位置:在哪里启动,就在哪里生成,文件名zookeeper.out
(3)运行start,不代表就启动成功了,还需要查询状态  zkServer.sh status,
     即使没有启动成功,jps后也能看到服务项

2.3 常用指令

2.3.1 客户端脚本连接zookeeper
语法:zkCli.sh  -server host:port

案例1:  输入指令直接回车,连接的是本机上的服务项
[root@qianfeng01 ~]# zkCli.sh       

案例2:  连接其他机器上的服务项
[root@qianfeng01 ~]# zkCli.sh -server qianfeng02:2181       

案例3:  可以省略端口号
[root@qianfeng01 ~]# zkCli.sh -server qianfeng03

2.3.2 常用指令
[zk: qianfeng03(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setAcl path acl
        setquota -n|-b val path
        history
        redo cmdno
        printwatches on|off
        delete path [version]
        sync path
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        addauth scheme auth
        quit
        getAcl path
        close
        connect host:port
比较常用的如下:
1. ls -- 查看某个znode下有哪些子znode  
2. ls2 -- 功能与ls基本一致,但是可以多查出来一些属性信息,比如time,version
3. create -- 创建znode,必须设置初始内容,例如:
4. get -- 获取znode的数据
5. set -- 修改znode内容
6. delete -- 删除znode
7. rmr -- 删除znode
7. quit -- 退出客户端
8. help -- 帮助命令

2.4 znode的类型

znode的类型分为两大类:
	一类是永久节点:客户端窗的永久节点,与客户端是否退出无关,只要不手动删除,就一直存在
	一类是临时节点:客户端创建的临时节点,一旦客户端的会话断开,临时节点就会被删除
每一类节点中都有两种情况:
	分别是有序节点和自定义节点

三. Zookeeper的工作机制

3.1 zookeeper开机时的选举机制

3.1.1 说明
--1. zookeeper集群服务,是必须满足半数以上的节点存活才可以正常提供服务
--2. zookeeper里并没有配置谁是leader和follower,而是通过一种选举算法选择出来谁是leader。

3.1.2 刚启动时的选举流程

假设有五台机器,分别是server-1,server-2,server-3,server-4,server-5,并且启动顺序也是数字顺序。

1. 服务器1启动
	此时只有它一台服务器启动了,它发出去的投票信息没有任何响应,所以它的选举状态一直是 LOOKING 状态。
2. 服务器2启动
	它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大
	的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以
	服务器 1、 2 还是继续保持LOOKING 状态。
3. 服务器3启动
	根据前面的理论分析,服务器 3 成为服务器 1、 2、 3 中的老大,而与上面不同的是,此时有三台服务器选
	举了它,所以它成为了这次选举的 leader。
4. 服务器4启动
	根据前面的分析,理论上服务器 4 应该是服务器 1、 2、 3、 4 中最大的,但是由于前面已经有半数以上的
	服务器选举了服务器 3,所以它只能接收当小弟的命
    了。
5. 服务器5启动
	同 4 一样当小弟

3.2 选举机制中的几个概念

- Server状态:选举状态
  ​ LOOKING:竞选状态
  ​	FOLLOWING:随从状态,同步leader状态,参与选票
  ​	OBSERVING:观察状态,同步leader状态,不参与选票
  ​	LEADER:领导者状态
--逻辑时钟:
	指的是第几任选leader。比如之前已经挂掉了四个leader, 再投票选举时,就是选举第五次leader,这一任leader不是一次投票就选出来的。
--数据id:
  服务器中存放的最大数据ID。值越大说明数据越新.             
--serverid
  就是配置文件zoo.cfg中的server.x的x值。
  
  
在重新选举leader期间,逻辑时钟,数据id,服务器id所占的权重不一样。权重越大,当leader的概率就越大。

逻辑时钟(epoch)>数据id>服务器id    (重点)

3.3 监听原理(重点理解)

--1. 客户端首先调用zookeeper的客户端API接口
--2. 客户端会维护两个对象,一个是连接对象Connect,一个是监听对象Listen
--3. 客户端会通过连接对象,告诉zookeeper服务器,要监听的事件。
     事件1:可能是某一个znode里存储的数据变化      /citys/shenzhen "aa"
     事件2:可能是某一个znode的子znode的数量变量   /citys/shezhen
                                              /citys/guangzhou
--4. zookeeper会将客户端要监听的事件注册到服务中
--5. 如果监听事件发生了变化,就会通知客户端
--6. 客户端收到通知后,就会执行自己的逻辑,也就是process方法中的逻辑

测试:

测试1: 监听/citys这个znode的子znode数量的编号
 ls /citys  watch  
 
测试2: 监听/citys这个znode的存储数据的变化
get /citys watch

3.4 写流程

1. Client向Zookeeper的server1上写数据,发送一个写请求
2. 如果server1不是leader,那么server1会把请求进一步转发给leader。
3. 这个leader会将写请求广播给所有server。
4. 各个Server写成功后就会通知leader。
5. 当leader收到半数以上的server写成功的通知,就说明数据写成功了。写成功后,leader会告诉server1数据写成功了。
6. server1会进一步通知Client数据写成功了。这时就认为整个写操作成功。

四. Zookeeper的应用场景(熟悉)

4.1 集群应用程序的配置文件统一管理

比如 集群上的所有应用程序都连接mysql  都需要url,driver,username,pwd
    那么,每个应用程序都会有自己独立的配置文件配置上述四个参数
    
    假如有一天老板让修改mysql的密码,那么所有的应用程序都需要修改密码才能正常使用。相对来说是比较麻烦的。
    
但是,如果将配置文件的四个参数保存到zookeeper的某一个znode里。然后应用程序在连接mysql时,读取这个znode里的数据,就能访问mysql成功。

   假如有一天老板让修改mysql的密码,只需要修改znode里的pwd的值。而所有的应用程序在mysql都还会读取znode里的数据,因此,这样的管理配置方式,非常简单,不需要为每一个应用程序单独修改配置属性

4.2 集群应用程序的管理节点的选举

比如namenode高可用,就是两个namenode。 那么这个两个namenode如果选举出来一个来管理集群,剩下一个当备用。
比如两个namenode,分别是qianfeng01和qianfeng02, 这两个守护进程都作为客户端向zookeeper的某一个znode(/hadoop-ha)下创建一个临时子节点(active),谁创建成功,谁就是活跃的namenode,来管理集群。没有创建成功的那个namenode监听/hadoop-ha/下的子节点的变量,如果发现消失,就立即创建active这个临时znode,就接管整个集群的工作。
/hadoop-ha/active (qianfeng01)

4.3 服务节点的动态上下线感知

/cluster/mei01
/cluster/mei02
/cluster/mei03

namenode只负责监听/cluster节点的子节点的数量以及名称

假如mei04想要上线,会先在/cluster下创建mei04子节点

zookeeper发现多一个节点,会通知namenode。namenode知道后,就可以将mei04当成工作节点为其分配任务

4.4 服务节点的软负载均衡

参考 https://blog.csdn.net/Michael__One/article/details/106630922

4.5 分布式锁

参考 https://blog.csdn.net/Michael__One/article/details/106630922

4.6 分布式队列

参考 https://blog.csdn.net/Michael__One/article/details/106630922

day02—————

一、HDFS的HA搭建

1.1 企业中使用HA的原因

namenode是一个时,出现以下问题,集群可用性极差
--1. 单点故障(SPOF)
--2. 硬件升级

1.2 搭建两个namenode

一个namenode作为active节点,表示正在管理整个集群
一个namenode作为standby节点,表示备用namenode,当active节点宕机时,这个standby节点接替工作。

注意:
datanode的心跳反馈也需要向standby节点反馈,这个优势,是standby节点可以立即接管工作,对于用户体验来说,是感觉不到有替换的间隙。

standby namenode在接替工作后,也要进行检查点机制,因此接替前的edit文件以及fsimage文件也要有,否则数据不准确。

当是HA时,standbyNamenode接替了secondaryNamenode的工作,即检查点机制由备用的namenode进行。

缺点:standbyNamenode在同步activeNamenode的edit文件时,出现网络震荡时,容易导致数据丢失,

1.3 journalnode集群

1.3.1 使用journalnode的原因
基于standbynamenode在同步activeNamenode的edit文件时,出现网络震荡时,容易导致数据丢失,所以使用journalNode集群。
1.3.2 journalnode的功能
--1. 存储activeNamenode的所有的edit日志文件
     (1)activeNamenode会将edit日志文件写入journalnode
     (2)journalnode集群有数据一致性的特点
     (3)standbyNamenode会监听journalnode,一旦有数据更新,就同步到自己的内存和磁盘
--2. journalnode可以防止脑裂的产生(两个ActiveNamenode的情况就是脑裂)
     journalNode只允许一个作者(activeNamenode写日志到journalnode上),如果active出现了网络延迟,那么standby会切换成Active。原来的Active网络延迟消失后,会被journalnode强制转为standby。
1.3.3journalnode集群的其他特点
--(1)适合安装在奇数台机器上
--(2)只要有半数以上(n+1)/2就可以提供服务
--(3)至少3个Journalnode节点
1.3.4 journalnode的缺点
故障发生后,只能手动进行故障转移,因此接管工作的时间间隙会比较明显,体验差。

因此需要提供一个能自动故障转移的机制,可以使用zookeeper。

1.4 使用zookeeper进行自动容灾

1.4.1 zookeeper集群
--zookeeper集群提供协调服务
--zookeeper集群有自己的数据模型(类似unix的文件系统的层次化结构)
--zookeeper提供监听和通知功能(核心技术)
1.4.2 ZKFC
--1. 是zookeeper在hdfs上的一个客户端程序
--2. zkfc会连接zookeeper服务器,始终保持连接
--3. zkfc和namenode在同一个机器上
--4. zkfc会定期的ping本机上的namenode,如果通信正常,则认为namenode是健康的
--5. zkfc会进行active与standby状态切换 
     (1) 开机时,两个zkfc会争抢创建active的znode,谁创建成功,谁对应的namenode就是active状态
     (2) 如果有一个namenode宕机了,对应的zkfc会知道,然后zookeeper服务器的active的Znode会发生变化,然后zookeeper通知另一个zkfc,zkfc会将standby转为active状态

1.5 HA的配置

1.5.1 布局
mei01:	namenode journalnode datanode nodemanager resourcemanager	QuorumPeerMain
mei02:	namenode journalnode datanode nodemanager					QuorumPeerMain
mei03:			 journalnode datanode nodemanager					QuorumPeerMain
1.5.2 修改hdfs-site.xml
1)配置逻辑名称

2)配置两个namenode的唯一标识符

3)配置rpc协议的ip和port

4)配置http协议的ip和port

5)配置journalnode集群和存储目录

6)配置java类型

7)配置防护机制,私钥文件,超时时间

8)配置自动容灾
1.5.3 修改core-site.xml
1)修改hdfs的schame,ip和port为逻辑名称

2)设置journalnode的日志存储目录的具体路径

3)设置hdfs的对应zookeeper集群
1.5.4 三台机器都要同步
scp /usr/local/hadoop/etc/hadoop/{core-site.xml,hdfs-site.xml} mei02:/usr/local/hadoop/etc/hadoop/
scp /usr/local/hadoop/etc/hadoop/{core-site.xml,hdfs-site.xml} mei03:/usr/local/hadoop/etc/hadoop/

1.6 HA的启动

1.6.1 说明
HA的启动分两种情况

--情况1. 搭建集群时,直接搭建HA,  这个时候还没有fsimage和edit文件
--情况2. 普通集群使用一段时间后,转为HA, 这个时候有一个挺大fsimage和一大堆edit文件
1.6.2 情况2的启动演示
1. 启动三个节点上的journalnode服务,(请注意,如果集群启动了,先把集群stop掉)
	[root@mei01 ~]# hadoop-daemon.sh start journalnode
	[root@mei02 ~]# hadoop-daemon.sh start journalnode
	[root@mei03 ~]# hadoop-daemon.sh start journalnode

2. 同步日志到journalnode集群上
	[root@mei01 ~]# hdfs namenode -initializeSharedEdits

3. 启动以前节点上的namenode进程
	[root@mei01 ~]# hadoop-daemon.sh start namenode

4. 在新的namenode节点上拉取镜像文件
	[root@mei02 ~]# hdfs namenode -bootstrapStandby

5. 格式化zkfc
	- 1、前提QuorumPeerMain服务必须处于开启状态,客户端zkfc才能格式化成功
    [root@mei01 ~]# zkServer.sh start
    [root@mei02 ~]# zkServer.sh start
    [root@mei03 ~]# zkServer.sh start
	- 2、选择其中一个namenode节点进行格式化zkfc
    [root@mei01 ~]# hdfs zkfc -formatZK

6. 你就可以快乐的开启HA集群进行测试了
	[root@mei01 ~]# start-all.sh

注意,注意,注意:以后开HA集群时,要先开zookeeper服务,再开HDFS。

1.6.3 守护进程的说明
- QuorumPeerMain:zookeeper服务组件对应的进程
- JournalNode:qjm对应的守护进程
- DFSZKFailoverController:zookeeper对应的自动容灾客户端进程,运行在Namenode节点上
- NameNode:
- ZookeeperMain:手动连接zookeeper服务所产生的客户端进

1.7 HA转普通集群

--1. 关掉HA的所有进程
--2. 修改配置文件为普通集群的样式
--3. 将journalnode集群管理的所有edit文件复制到namenode的管理目录下,有写edit文件会重复,可以覆盖或者不覆盖都可以
--4. 删除旧的edit_inpro....,留下最新的
--5. 修改seen_txid的值为正在使用的日志的后面的数字

二、MAVEN的使用

2.1 maven的简介

--1. 是一个项目构建,项目管理的工具,可以跨平台,是基于java语言平台的项目管理工作
--2. 有自己的指令集
--3. 其中有一个功能是jar包依赖的管理

2.2 maven的安装

1)解压
2)配置本地仓库路径
3)配置远程仓库路径
4)配置环境变量

2.3 idea与maven的整合

参考文件

2.4 jar包下载

将今天的文档目录下的仓库压缩包,解压到你自己的本地仓库目录下
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值