文章目录
Hadoop框架Zookeeper简介、搭建及简单使用
Zookeeper简介
Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC服务框架、分布式数据库同步系统,这些都是Zookeeper的应用场景。
Zookeeper集群中节点个数一般为奇数个(>=3),若集群中Master挂掉,剩余节点个数在半数以上时,就可以推举新的主节点,继续对外提供服务。
![](https://img-blog.csdnimg.cn/419eefe1776145458229ef420372db0a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/e639046dd4f64a0ebad3cff639b480a7.png)
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。
不仅仅是分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用Paxos 算法。一致性算法可以通过共享内存(需要锁)或者消息传递实现,Paxos 算法采用的是后者。Paxos 算法适用的几种情况:一台机器中多个进程/线程达成数据一致;分布式文件系统或者分布式数据库中多客户端并发读写数据;分布式存储中多个副本响应读写请求的一致性。
Zookeeper集群搭建
在本文中Zookeeper节点个数(奇数)为3个。Zookeeper默认对外提供服务的端口号2181 。Zookeeper集群内部3个节点之间通信默认使用2888:3888
192.168.100.101
192.168.100.102
192.168.100.103
下载zookeeper对应的tar包
![](https://img-blog.csdnimg.cn/d8f3750fa1ba42a7916b0aad2e8f2409.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
1、上传安装包到master并解压
#切换到moudle目录下用xftp上传
cd/usr/local/moudle
![](https://img-blog.csdnimg.cn/2e8647d619034d74853adf198f1ec02e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
#解压
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/soft/
![](https://img-blog.csdnimg.cn/88d5939591eb4a9c802058198fc6b6b5.png)
2、配置环境变量
#切换到zookeeper-3.4.6目录
cd /usr/local/soft/zookeeper-3.4.6
#为了方便配置环境变量先pwd复制一下路径
pwd
/usr/local/soft/zookeeper-3.4.6
#配置环境变量
vim /etc/profile
ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#刷新环境变量
source /etc/profile
![](https://img-blog.csdnimg.cn/a648f2ec91804ca392907ce810b9c8ad.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
source后输入zk按2下Tab键查看是否补齐,否则环境变量配置失败
![](https://img-blog.csdnimg.cn/011fc270ded546968853a94e6c00269f.png)
3、修改配置文件
#切换到conf目录
cd conf/
#复制并重命名
cp zoo_sample.cfg zoo.cfg
#编辑配置文件
vim zoo.cfg
#修改
dataDir=/usr/local/soft/zookeeper-3.4.6/data
#增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888
![](https://img-blog.csdnimg.cn/793839a932ea4f458f62bfd47098fb79.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/623795e5dc194b80a37f3081201d63e1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
4、新建data目录
#切回zookeeper-3.4.6目录
cd /usr/local/soft/zookeeper-3.4.6
#新建data目录
mkdir data
#切换到data目录
cd data
#创建一个myid文件
touch myid
5、同步到其它节点
#切回到soft目录
cd /usr/local/soft
#同步
[root@master soft]# scp -r zookeeper-3.4.6/ node1:`pwd`
[root@master soft]# scp -r zookeeper-3.4.6/ node2:`pwd`
6、配置node1和node2的环境变量
- 配置node1
#切换目录
[root@node1 ~]# cd /usr/local/soft/zookeeper-3.4.6/
pwd
/usr/local/soft/zookeeper-3.4.6
#配置node1环境变量
vim /etc/profile
ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
![](https://img-blog.csdnimg.cn/f3b41396204e4102a7580e2ae92dc185.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
source后输入zk按2下Tab键查看是否补齐,否则环境变量配置失败
![](https://img-blog.csdnimg.cn/4bb21321d1e84ff3bf6a7099f0583050.png)
- 同理配置node2
#切换目录
[root@node2 ~]# cd /usr/local/soft/zookeeper-3.4.6/
pwd
/usr/local/soft/zookeeper-3.4.6
#配置node1环境变量
vim /etc/profile
ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
source后输入zk按2下Tab键查看是否补齐,否则环境变量配置失败
![](https://img-blog.csdnimg.cn/3626448d40314411b920f11bcc89ecd3.png)
#在所有节点执行
source /etc/profile
7、编辑/usr/local/soft/zookeeper-3.4.6/data/myid
#切换所有节点的data目录
cd /usr/local/soft/zookeeper-3.4.6/data/
master,node1,node2分别加上0,1,2
- master
![](https://img-blog.csdnimg.cn/c143ac233f0d49b7b3aa64e2e95ef370.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
- node1
![](https://img-blog.csdnimg.cn/a747c1a638ee4102ba356f1b6dcf134e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
- node2
![](https://img-blog.csdnimg.cn/fe87e7b847e84fc1a9023da9c017fa2b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
8、启动zk
#三台都需要执行
zkServer.sh start
#查看状态
zkServer.sh status
通过jps可以查看zk的进程:QuorumPeerMain
当有一个leader的时候启动成功
![](https://img-blog.csdnimg.cn/8589ffbff2ce465e9a309a4e92f1f13d.png)
![](https://img-blog.csdnimg.cn/3d386b8ebb7f47c18384f6163efd0eb3.png)
![](https://img-blog.csdnimg.cn/9b1a6cc76a5e4bf382d02727690f5c06.png)
![](https://img-blog.csdnimg.cn/4f02fc83a86b42d0927e1503173b9fea.png)
![](https://img-blog.csdnimg.cn/8faa9b53679945b5965036e6ad2d97c5.png)
![](https://img-blog.csdnimg.cn/4340dfc1160f4bc686684212037f95d7.png)
9、停止zk
#三台都需要执行
zkServer.sh stop
![](https://img-blog.csdnimg.cn/5b92ab3c8adf4bc59613b286a5c05a44.png)
![](https://img-blog.csdnimg.cn/9ee4a476554842b890e5de5462c5c5fc.png)
![](https://img-blog.csdnimg.cn/83362e4d14604ab6803a70c921e82c8c.png)
10、连接zk
zkCli.sh
zk 是一个目录结构 ,每个节点可以存数据,同时可以有子节点
![](https://img-blog.csdnimg.cn/d06c8d4827d24760b35c81275501083a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
默认连接localhost
#退出
quit
![](https://img-blog.csdnimg.cn/2e850ee55531424db25868173f778c49.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
- 连接node1
zkCli.sh -server node1:2181
![](https://img-blog.csdnimg.cn/faa18bf85c0349dca6cec6788bdd396c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
- help查看所有命令
随便敲也行
help
![](https://img-blog.csdnimg.cn/2893fef7975440c1b63198f61d58490a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
zk Shell
ls /
![](https://img-blog.csdnimg.cn/31efe1b5f3684ecb80a6897712cf7ffd.png)
- 创建目录
create /test testData
create /test/a aData
ls /test
![](https://img-blog.csdnimg.cn/7bd7de0cb6954617993c8728f9801c6d.png)
- 获取数据
get /test
ls /test
![](https://img-blog.csdnimg.cn/a7559a4160f24db2bfc230c289f43a7e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/db1f71933ab84d309584006d0a9740d2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_17,color_FFFFFF,t_70,g_se,x_16)
- 删除数据
delete 只能删除没有子节点的节点
rmr /test 删除节点
![](https://img-blog.csdnimg.cn/5ffabb61192349af897c823f33fbc05c.png)
- 修改数据
set /test/a aData
![](https://img-blog.csdnimg.cn/1fbce15280c2415ab0055b2c5e427f42.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_18,color_FFFFFF,t_70,g_se,x_16)
连接node2跟node1的数据是一样的(数据同步)去中心化架构
![](https://img-blog.csdnimg.cn/09b3e82c3c204b2295db0545196da449.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGlhbmd6YWkyMDQ4,size_20,color_FFFFFF,t_70,g_se,x_16)
11、重置zk
1、杀掉所有zk进程
kiil -9 pid
2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.6/data/version-2
2、启动zk
zkServer.sh start
到底啦!觉得靓仔的文章对你学习Hadoop有所帮助的话,一波三连吧!q(≧▽≦q)