一、分布式思想
-
当某个文件数据的体量超出了某一台服务器所能存储的最大容量时,如要继续存储,则首先根据数据整体规模大小以及单台服务器所能存储的最大容量,计算出存储改文件所需要的服务器总台数,进而实现服务器节点数量的规划;
-
其次将这些规划好的服务器以网络的形式组织起来,形成一个集群;
-
在这个集群中,每一台服务器进行整个文件的部分数据的存储以及计算的操作,统一管理集群中的各个服务器资源,提供一个统一的文件的出入口(首领)负责和客户端交互
二、zookeeper概述
-
概述:zookeeper是分布式协调服务框架,用于解决分布式环境下的一些常见问题:集群统一管理、统一命名、信息配置、分布式一致性等等
-
分布式的解决方案:
a.引入zookeeper的监控和管理节点来保证集群中服务器之间的任务、资源调度
b.为了防止单一监控节点带来的单点故障问题,所以需要引入多个监控节点
c.为了防止多个监控节点之间的任务调度不同,需要从中选举出一个主监控节点,只有此节点提出的任务调度方案才会被接收
d.为了避免主监控节点宕机而导致所有数据丢失的问题,需要将监控节点的数据进行统一,以便以在其宕机之后,其余节点能够快速顶替工作
-
三台虚拟机的系统设置:
a.创建一个软件管理目录:mkdir -p /home/software
b.防火墙:
i.查看防火墙状态: systemctl status firewalld
ii.临时关闭:systemctl stop firewalld
iii.永久关闭:chkconfig firewalld off
c.后续几乎所有课程内容的大数据框架都需要JDK的支持,因此要先安装JDK并配置其环境变量:
i.先在jit-bigdata01上完成配置:
1)上传jdk的压缩包至软件管理目录下
2)解压:tar -zxf jdk-8u181-linux-x64.tar.gz
3)重命名:mv jdk1.8.0_181/ jdk1.8
4)配置环境变量:
a)编辑:vim /etc/profile
b)在文件末尾添加以下内容:
#set env varsJAVA_HOME=/home/software/jdk1.8CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jarPATH=$JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH
c)保存退出,重新加载使修改生效:source /etc/prpfile
5)验证指令是否处处可用:
ii.其余两台直接远程拷贝以上文件以及目录即可:
1)jit-bigdata01执行:
scp -r /home/software/jdk1.8 root@slave01:/home/software/ scp -r /home/software/jdk1.8 root@slave02:/home/software/ scp -r /etc/profile root@slave01:/etcscp -r /etc/profile root@slave02:/etc
2)jit-bigdata02 & jit-bigdata03执行: source /etcc/profile
java -version
三、zookeeper集群模式:
1.集群模式的搭建:
a. 首先在jit-bigdata01虚拟机也即master上安装部署zookeeper:
i.上传 zookeeper-3.4.7.tar.gz至软件管理目录
ii.解压安装:tar -zxvf zookeeper-3.4.7.tar.gz
iii.重命名:mv zookeeper-3.4.7 clusterZK
1)重要目录说明:
a)bin:zk的可执行文件所在目录,zk服务器指令与zk客户端指令
b)conf:配置文件所在目录,核心配置文件zoo.cfg(zk启动默认寻找此名称的配置文件,加载其中的配置项)
iv.zk服务的核心配置项:
1)切换到conf目录下:cd clusterZK/conf/
2)复制一份模板文件,命名为zoo.cfg:cp zoo_sample.cfg zoo.cfg
3)编辑zoo.cfg:vim zoo.cfg
a)修改其中dataDir属性的值,指定数据文件(版本信息、事务日志、快照文件等)的存储目录:
dataDir=/home/software/clusterZK/tmp
i)格式:server.zk服务器编号=服务器IP:原子广播端口:选举端口
ii)例如:
server.1=192.168.88.182:2888:3888server.2=192.168.88.183:2888:3888server.3=192.168.88.184:2888:3888
iii)注意:
One. 服务器编号一定是数字,并且不能重复,具有唯一性;此数字需要与服务器编号文件myid中的数字一致 Two. 原子广播端口&选举端口可以修改,前提不能是当前已经被使用的端口号
c)保存退出
v.编写服务器的编号:
1)切换回到clusterZK目录下,创建tmp目录:mkdir tmp
2)进入到tmp目录下,创建服务器编号文件myid:vim myid
3)编辑此文件,填入当前服务器对应的编号
vi.配置zk的环境变量:
1)编辑:vim /etc/profile
2)添加新的ZK_HOME:
#set env varsJAVA_HOME=/home/software/jdk1.8 ZK_HOME=/home/software/clusterZK CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$PATHexport JAVA_HOME CLASSPATH ZK_HOME PATH
3)保存退出,重新加载: source /etc/profile
b.然后将master上的部署完成的zookeeper远程拷贝至slave01&slave02:
i.clusterZK文件夹:
1)拷贝:
scp -r /home/software/clusterZK/ root@slave01:/home/software/scp -r /home/software/clusterZK/ root@slave02:/home/software/
- 修改服务器编号:
a)slave01上:myid值为2
b)slave02上:myid值为3
ai./etc/profile文件:
1)远程拷贝:
scp /etc/profile root@slave01:/etc scp /etc/profile root@slave02:/etc
2)重新加载:
a)slave01 & slave02上:source /etc/profile
2.启动集群:
a.依次在三台服务器上执行:zkServer.sh start
i.在哪个工作目录下执行,zk的启动日志zookeeper.out文件就位于那个目录
ai.若出现意料之外的一些错误异常,可以检查此文件的日志
b.查看集群状态:
1)此时要求Mode必须是leader或follower
2)若出现standalone或者not running,表示zk集群配置存在某些问题,导致集群通信失败未能正常启动
ai.指令:jps
1)此时要求必须存在一个QuorumPeerMain进程
3.登录zk客户端:
a.指令:zkCli.sh [-server localhost:2181]
i.不指定服务器,表示默认启动本机2181端口的zk服务
b.客户端的操作指令:
四、zookeeper的结构&特性
1.结构特点:
a.zookeeper是一个树状结构,根节点为/,zookeeper中的每一个节点都被称为znode,树状结构被称为znode树
b.znode树中的所有的znode节点都是从根节点出发(绝对路径形式)
c.每个znode的路径都是唯一不可重复的,可以基于此特点实现集群中的统一命名服务
d.znode节点的类型分为四种:
i.持久节点:一旦创建就会持久化到磁盘中,只要未被销毁,就会一直存在
ii.临时节点:跟随客户端会话销毁而销毁,从属于当前客户端会话,临时存在的;例如ephemeralOwner = 0x288b778dea80000
iii.持久顺序节点:持久化并编号
iv.临时顺序节点:临时并编号
e.每一个持久节点都可以挂在子节点
f.每一个znode节点都必须存储数据,但是不能存储海量数据:
i.znode树维系在内存中,并且假设集群模式下每个zk存储的数据都是相同的,必然会造成内存浪费甚至崩溃
ii.zk本质上是为了实现分布式协调服务而不是存储服务
g.znode树:
i.维系在内存:便于客户端快速访问、进行查找
ii.持久化到磁盘:便于容错、恢复数据
h. zookeeper会为每一次事务性操作(增删改)提供一个全局递增的事务id——zxid 2. znode节点信息:
3.退出客户端:quit
本质上是关闭了客户端会话,后续再次启动客户端会开启一个全新的会话,重新分配会话sessionID
4.zookeeper的事务日志:
a.存放在dataDir属性指定的目录下的version-2中:/home/software/clusterZK/tmp/version-2,其中log.n是持久化事务日志文件
b.概念:
i.在zookeeper正常运行过程中执行过的事务型操作,在返回客户端ack响应之前,zk会被保证已将本次事务操作写入到磁盘文件中
ii.此文件是二进制文件,无法通过vim/cat/tail这些查看工具进行编辑或查看
c.需要通过zk提供的日志工具包的API来实现查看事务日志:
i.将zookeeper-3.4.7.jar & slf4j-api-1.6.1.jar两个工具包拷贝到事务日志文件所在的version-2目录下:
cp /home/software/clusterZK/zookeeper-3.4.7.jar
/home/software/clusterZK/tmp/version-2/ cp
/home/software/clusterZK/lib/slf4j-api-1.6.1.jar
/home/software/clusterZK/tmp/version-2/
ii. 在version-2目录下,执行:
java -cp .:zookeeper-3.4.7.jar:slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.100000001
iii.一条事务日志信息说明:
创建时间 所属客户端会话编号 创建czxid编号 最大事务id 事务操作
5.集群特性
i.客户端不论连接到zookeeper集群中的哪个服务器上,展示给客户端的都是相同的视图;也即znode树结构一致以及数据一致 b. 原子性:
i.对于事务型决议的更新(增删改),只有成功或者失败两种可能,没有中间状态;
ii.要么都更新更新,要么都更新失败
iii.要么整个集群中所有机器都成功应用了某个事务,要么都没有应用某个事务;一定不会出现集群中部分机器应用了该事务,而另一部分机器没用应用的情况
c.可靠性:
i.一旦zookeeper集群中服务器端成功应用了某个事务(记录了该事务日志),并且完成了客户端的响应,那么该事务所引起的服务器端状态变化就会一直保留下来,直到有另一个事务对其进行了更改
d.顺序性:
i.只要某一台服务器上消息a是在消息b之前发布的,那么在所有的服务器上消息a都是消息b之前被发布
ii.客户端在发起请求时,都会跟着一个递增的命令号(在底层指的就是zxid);根据此机制,zookeeper会确保客户端提交的事务的执行顺序
e.实时性:
i.zookeeper可以保证客户端在非常短的时间间隔范围内感知到服务器的更新信息、失效信息或者指定监听事件的变化信息
ii.示例:
1)服务器关闭,此时客户端会立即感知到所连接到这台服务器出错:Session 0x186c4330ffe0000 for server null, unexpected error, closing socket connection and attempting reconnect
2)再次开启服务器:
a)若还在此时客户端会话的连接超时时间范围内,则会恢复当前客户端会话;
b)若此时已经超过连接时间,会提示当前客户端会话已经过期:Unable to reconnect to ZooKeeper service, session
0x186c47179020000 has expired, closing socket connection
3)若超时过期,则需要重新开启一个客户端; sessionid = 0x188b7e005850000发生变化 f. 过半性:
i.过半服务(运行):zookeeper集群中只有超过一半服务器正常工作(状态正常),才能对外提供服务
1)举例:
a)关闭掉bigdata01&bigdata03上的zkServer.sh stop,立马bigdata02上的客户端会提示:
b)bigdata02上的服务器状态变为:
ii.过半操作:zookeeper集群中只有超过一半服务器存活,客户端才能提交请求应用请求;在zookeeper集群在做事务决议的时候,一定要有半数以上的服务器正常写入了此事务(增删改)才能更新事务
iv.过半选举