Spark实战—— (1) zookeeper简介与环境搭建

1. Zookeeper是做什么的?

1.1 简介

Zookeeper是Hadoop项目中的一个子项目,是一个分布式应用程序协调服务,是Google的Chubby的一个开源实现。

这里的分布式应用程序协调服务——

  1. 从对象上看,Zookeeper是专门针对分布式集群的
  2. 从功能上看,Zookeeper提供了**(类似文件系统的)数据存储通知机制**,维护和监控存储数据的状态变化,若发生变化,则通知相应的监听的客户端,从而达到基于数据的集群管理

Zookeeper的数据存储结构如下,与文件系统非常类似(下文称为类文件系统)——

  1. 每个子目录项成为znode,被路径唯一标识,如Member1被标识为/GroupMembers/Member1
  2. 可以增加、删除znode,也可以在znode下增加、删除znode,且znode可以存储数据
  3. znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的

Zookeeper的架构如下[3],有若干个数据一致的Server,存放着上述类文件系统,Client连接到任何一个Server,都可以得到相同的视图,具有高度容错性

1.2 应用场景

Zookeeper的应用场景有:命名服务、配置管理、集群管理、分布式锁、队列管理。

  1. 命名服务:分布式应用中,通常需要有一套完整的命名规则,能够产生唯一的名称。只需在Zookeeper的类文件系统中创建一个znode即可
  2. 配置管理:在分布式应用中不同机器都需要一些配置信息,对每台机器单独修改很麻烦,可使用Zookeeper将配置信息存储在znode中并进行监控,一旦配置信息变化,所有机器都会收到通知,再进行修改即可
  3. 集群管理知道是否有节点加入或退出选举master。对第一点,所有机器约定在GroupMembers目录下创建临时znode,并监控该目录;对第二点,所有机器创建顺序编号znode,约定编号最小的为master
  4. 分布式锁:需要锁的节点创建顺序编号znode,每个节点获取最小的编号,若与自己的编号相同,则获得锁(释放锁只需删除自己的znode即可);否则监控目录,直到自己获得锁为止
  5. 队列管理:队列成员聚齐后才可使用的同步队列和先进先出的FIFO队列。第一种,每个成员创建znode并监控znode的数量即可;第二种,每个成员创建znode,出队时选择最小编号的节点即可

2. 核心:Paxos算法

从上述Zookeeper的介绍和应用可以看到,其核心在于类文件系统,而为了提供各个Server间类文件系统的一致性,需要一个分布式的数据一致性算法,在Zookeeper中,使用的是经典的Paxos算法。

Paxos算法的角色有:

  • Proposer,使用K值跟Acceptor联系,推荐自己选择的leader给Acceptor,并统计Acceptor的投票
  • Acceptor,根据收到的K值决定跟哪个Proposer联系,投票给该Proposer推荐的leader
  • Learner,其他节点,不参与上述过程,只在最后的时候被通知leader是谁

Paxos算法的流程如下[1],分为两个阶段,重复以下两个阶段直到超过半数的Acceptor结果一致。

参考文献2中给了一个很生活化的例子,看完流程再去看例子应该会更好理解,此处不再展开。

3. Zookeeper分布式集群搭建

3.1 环境
  1. VMware创建三台虚拟机,均为Ubuntu16.04,内存为4G,硬盘100G
  2. zookeeper3.4.8
  3. 三台虚拟机的ip已在host里绑定为master、slave1、slave2
  4. 三台虚拟机已实现ssh免密登陆
  5. 三台虚拟机已安装jdk1.8
3.2 安装
  1. 从apache的网站下载zookeeper3.4.8.tar.gz
  2. 解压并移动到/opt文件夹下
tar -xf zookeeper3.4.8.tar.gz
mv Zookeeper3.4.8 /opt
ln -snf zookeeper-3.4.8/ zookeeper #建立软连接
3.3 配置
  1. 配置环境变量,即修改/etc/profile文件
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
  1. 拷贝zoo_sample.cfg文件,重命名为zoo.cfg
  2. 修改内容如下,dataDir中的文件夹要自己创建
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
  1. 每台机器都在dataDir中创建myid文件,master在myid文件中写入1,slave1写入2,slave2写入3
Node@master /o/z/data> echo 1 > myid
Node@master /o/z/data> cat myid 
1
3.4 启动集群

服务器的命令有以下几种——

zkServer.sh start  (启动)
zkServer.sh restart  (重启)
zkServer.sh status  (查看状态)
zkServer.sh stop  (关闭)
zkServer.sh start-foreground  (以打印日志方式启动)

在每台机器上启动服务器,若使用打印日志方式启动,就会看到类似下面的错误,提示拒绝连接

2019-05-27 20:12:03,419 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer$QuorumServer@149] - Resolved hostname: slave1 to address: slave1/192.168.182.130
2019-05-27 20:12:03,420 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@400] - Cannot open channel to 3 at election address slave2/192.168.182.131:3888
java.net.ConnectException: 拒绝连接 (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)

原因在于,此时另外两台机器上仍未启动服务器,所以无法连接。所以正确的启动方式可以是:

  1. 先在每台机器上启动服务器
Node@master ~> zkServer.sh start
  1. 所有机器都启动后,每台机器都重新启动服务器
Node@master ~> zkServer.sh restart

4. 集群简单使用

  1. 查看集群状态,下面提示的错误在网上看了很多方法,都不行,但是zookeeper可以正常使用,所以先不管
Node@master ~> zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
  1. 客户端连接其中一个服务器,如slave1作为客户端连接master服务器,连接后效果如下:
Node@slave1 ~> zkCli.sh -server master:2181
  1. 使用help可以看到zookeeper支持的指令,如下:
  1. 创建节点,如下:
  1. 使用slave2节点作为客户端连接slave1服务器,再次查看目录,可以看到不同服务器的目录是同步的
Node@slave2 ~> zkCli.sh -server slave1:2181
  1. 获取znode的值如下:

以上就是关于zookeeper的简介及分布式集群的搭建过程。

Reference

  1. 图解分布式一致性协议Paxos
    1. 分布式理论之一:Paxos算法的通俗理解
  2. Zookeeper的功能以及工作原理
  3. 分布式服务框架 Zookeeper — 管理分布式环境中的数据
  4. linux下安装zookeeper(Standalone与Distributed模式)
  5. Linux环境快速部署Zookeeper集群
  6. 无论怎样都无法解决Cannot open channel to x at election address的原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值