Zookeeper概述:
1.ZooKeeper是一种分布式协调服务,用于管理大型主机。ZooKeeper通过其简单的架构和API解决了这个分布式环境中协调和管理服务的复杂性问题。
2.分布式应用有两部分, Server(服务器) 和 Client(客户端) 应用程序。
3.分布式应用的优点
l 可靠性 - 单个或几个系统的故障不会使整个系统出现故障。
l 可扩展性 - 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改,而不会有停机时间。
l 透明性 - 隐藏系统的复杂性,并将其显示为单个实体/应用程序。
4.分布式应用的挑战
l 竞争条件 - 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
l 死锁 - 两个或多个操作等待彼此无限期完成。
l 不一致 - 数据的部分失败。
5.Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据。ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务。
6.ZooKeeper的优点:
l 简单的分布式协调过程
l 同步 - 服务器进程之间的相互排斥和协作。此过程有助于Apache HBase进行配置管理。
l 有序的消息
l 序列化 - 根据特定规则对数据进行编码。确保应用程序运行一致。这种方法可以在MapReduce中用来协调队列以执行运行的线程。
l 可靠性
l 原子性 - 数据转移完全成功或完全失败,但没有事务是部分的。
Zookeeper基础:
ZooKeeper的架构
部分 | 描述 |
Client(客户端) | 客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。 类似地,当客户端连接时,服务器发送确认码。如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。 |
Server(服务器) | 服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。 |
Ensemble | ZooKeeper服务器组。形成ensemble所需的最小节点数为3。 |
Leader | 服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。 |
Follower | 跟随leader指令的服务器节点。 |
层次命名空间
在根目录下,你有两个逻辑命名空间config和workers。config 命名空间用于集中式配置管理,workers 命名空间用于命名。
Zookeeper的工作流
Zookeeper的连接:
1. 如果客户端想要读取特定的znode,它将会向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回所请求的znode。为此,在ZooKeeper集合中读取速度很快。
2. 如果客户端想要将数据存储在ZooKeeper集合中,则会将znode路径和数据发送到服务器。连接的服务器将该请求转发给leader,然后leader将向所有的follower重新发出写入请求。如果只有大部分节点成功响应,而写入请求成功,则成功返回代码将被发送到客户端。 否则,写入请求失败。绝大多数节点被称为Quorum 。
Zookeeper集合中的节点数
1. 如果我们有单个节点,则当该节点故障时,ZooKeeper集合将故障。它有助于“单点故障",不建议在生产环境中使用。
2. 如果我们有两个节点而一个节点故障,我们没有占多数,因为两个中的一个不是多数。
3. 如果我们有三个节点而一个节点故障,那么我们有大多数,因此,这是最低要求。ZooKeeper集合在实际生产环境中必须至少有三个节点。
4. 如果我们有四个节点而两个节点故障,它将再次故障。类似于有三个节点,额外节点不用于任何目的,因此,最好添加奇数的节点,例如3,5,7。
组件 | 描述 |
写入(write) | 写入过程由leader节点处理。leader将写入请求转发到所有znode,并等待znode的回复。如果一半的znode回复,则写入过程完成。 |
读取(read) | 读取由特定连接的znode在内部执行,因此不需要与集群进行交互。 |
复制数据库(replicated database) | 它用于在zookeeper中存储数据。每个znode都有自己的数据库,每个znode在一致性的帮助下每次都有相同的数据。 |
Leader | Leader是负责处理写入请求的Znode。 |
Follower | follower从客户端接收写入请求,并将它们转发到leader znode。 |
请求处理器(request processor) | 只存在于leader节点。它管理来自follower节点的写入请求。 |
原子广播(atomic broadcasts) | 负责广播从leader节点到follower节点的变化。 |
Zookeeper leader的选举
1.所有节点创建具有相同路径 /app/leader_election/guid_ 的顺序、临时节点。
2.ZooKeeper集合将附加10位序列号到路径,创建的znode将是 /app/leader_election/guid_0000000001,/app/leader_election/guid_0000000002等。
3.对于给定的实例,在znode中创建最小数字的节点成为leader,而所有其他节点是follower。
4.每个follower节点监视下一个具有最小数字的znode。例如,创建znode/app/leader_election/guid_0000000008的节点将监视znode/app/leader_election/guid_0000000007,创建znode/app/leader_election/guid_0000000007的节点将监视znode/app/leader_election/guid_0000000006。
5.如果leader关闭,则其相应的znode/app/leader_electionN会被删除。
6.下一个在线follower节点将通过监视器获得关于leader移除的通知。
7.下一个在线follower节点将检查是否存在其他具有最小数字的znode。如果没有,那么它将承担leader的角色。否则,它找到的创建具有最小数字的znode的节点将作为leader。
8.类似地,所有其他follower节点选举创建具有最小数字的znode的节点作为leader。
安装-配置zookeeper
1.在zookeeper服务器是用java编写创建,运行在JVM之上,所以必须使用安装jdk
a.检查jdk版本,要求jdk在1.6及以上的版本java -version
b.检查已有的配置以及检查jdk是否卸载干净rpm -qa | grep java
c.删除卸载jdk
例如:rpm -e --nodeps java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64
d.配置jdk
下载linux版本jdk(最新版为jdk—10)
tar -xzvf jdk-10_linux-x64_bin.tar.gz
mv jdk-10 /opt/
vi /etc/profile
添加配置信息如下
export JAVA_HOME=/opt/jdk-10
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/
tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存,使配置生效执行命令:source /etc/profile
验证安装是否完成
java -version 查看
jps 指令是否为有效指令
2.安装配置zookeeper
a.下载zookeeper,官方默认建议下载的镜像站点
We suggest the following mirror site for your download:
HTTP://MIRRORS.SHU.EDU.CN/APACHE/ZOOKEEPER/
Other mirror sites are suggested below.
It is essential that you verify the integrity of the downloaded file using the
PGP signature (.asc file) or a hash (.md5 or .sha* file).
Please only use the backup mirrors to download KEYS, PGP and MD5 sigs/hashes or
if no other mirrors are working.
b.解压安装包
tar -xzvf zookeeper-3.4.11.tar.gz
mv zookeeper-3.4.11 /opt
c.单机模式修改配置文件
cd /opt/zookeeper-3.4.11/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改数据存放路径,后面作集群模式的zookeeper时要在此文件目录下增加对应myid文件
dataDir=/opt/zookeeper-3.4.11/data
d.运行zookeeper单机模式
cd /opt/zookeeper-3.4.11/bin
./zkServer.sh start
无报错表示运行成功,可执行./zkServer.sh status
显示:“Mode: standalone" 表示单机模式已启动
还可以查看执行jps查看进程id
29426 QuorumPeerMain
QuorumPeerMain是zookeeper集群的启动入口类,用来加载配置启动QuorumPeer线程的。
e.添加到path全局变量
vi /etc/profile
添加以下节点信息
ZOOKEEPER_HOME=/opt/zookeeper-3.4.11/data
PATH=$PATH:$ZOOKEEPER_HOME/bin
执行source /etc/profile
f.集群模式配置
vi /etc/profile
添加以下节点信息
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2888:3888
执行source /etc/profile
注意设置个节点的myid(path=/opt/zookeeper-3.4.11/data/myid)
注意事项:
1.防火墙影响启动zookeeper之处理方法
Ubuntu:
查看防火墙状态:ufw status
关闭防火墙:ufw disable
centos6.0:
查看防火墙状态:service iptables status
关闭防火墙:chkconfig iptables off #开机不启动防火墙服务
centos7.0:
查看防火墙状态:firewall-cmd --state
关闭防火墙:systemctl stop firewalld.service
2.配置集群模式时,注意修改myid数据
myid中的数据对应/opt/zookeeper-3.4.11/conf/zoo.cfg中
server.1=master:2888:3888
server.2=ndh-slave01:2888:3888
server.3=slave02:2888:3888
server.X的X
启动zookeeper客户端连接测试
先执行./zkServer.sh start(start-foreground启动具体信息/status启动状态)
再执行./zkCli.sh 或 ./zkCli.sh -server 127.0.0.1:2181
ls 查看根结点
create /mykey1 myvalue1 创建新节点
get /mykey1 获取节点信息
set /mykey1 myvalue12 设置节点值
set /mykey1 删除节点
Zookeeper Cli
启动zookeeper:bin/zkServer.sh start
进入Cli操作:bin/zkCli.sh
Cli操作:
创建节点:[zk: localhost:2181(CONNECTED) 0] create /FirstZnode "Myfirstzookeeper-ap""
Created /FirstZnode
创建顺序节点:[zk: localhost:2181(CONNECTED) 2] creat -s /FirstZnode "Msecond-data "
Created /FirstZnode0000000040
创建临时节点:[zk: localhost:2181(CONNECTED) 3] create -e /SecondZnode "Ephemeral-data"
Created /SecondZnode
获取数据:[zk: localhost:2181(CONNECTED) 4] get /FirstZnode
Myfirstzookeeper-app
cZxid = 0x19c
ctime = Mon Apr 16 10:46:04 CST 2018
mZxid = 0x19c
mtime = Mon Apr 16 10:46:04 CST 2018
pZxid = 0x19c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
监视:[zk: localhost:2181(CONNECTED) 0] get /FirstZnode 1
Myfirstzookeeper-app
cZxid = 0x19c
ctime = Mon Apr 16 10:46:04 CST 2018
mZxid = 0x19c
mtime = Mon Apr 16 10:46:04 CST 2018
pZxid = 0x19c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
设置数据:[zk: localhost:2181(CONNECTED) 4] set /SecondZnode Data-updated
cZxid = 0x1a2
ctime = Mon Apr 16 11:04:43 CST 2018
mZxid = 0x1a3
mtime = Mon Apr 16 11:04:48 CST 2018
pZxid = 0x1a2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x1000002e4620050
dataLength = 12
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] get /SecondZnode Data-updated
Data-updated
cZxid = 0x1a2
ctime = Mon Apr 16 11:04:43 CST 2018
mZxid = 0x1a3
mtime = Mon Apr 16 11:04:48 CST 2018
pZxid = 0x1a2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x1000002e4620050
dataLength = 12
numChildren = 0
[zk: localhost:2181(CONNECTED) 6] get /FirstZnode "Mysecondzookeeper-app"
Myfirstzookeeper-app
cZxid = 0x19c
ctime = Mon Apr 16 10:46:04 CST 2018
mZxid = 0x19c
mtime = Mon Apr 16 10:46:04 CST 2018
pZxid = 0x19c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
创建子项子节点:[zk: localhost:2181(CONNECTED) 7] create /FirstZnode/Child1 firstchildren
Created /FirstZnode/Child1
列出子项:语法:ls /path 如:ls /FitstZnode/Child1
查看状态:stat /path 如:stat /FirstZnode
移除Znode:rmr /path 如:rmr /FirstZnode
Zookeeper API
见代码部分
ZooKeeper应用程序
Apache Hadoop
1. Hadoop依靠ZooKeeper进行配置管理和协调
2. ZooKeeper提供跨节点同步的功能,并确保跨越Hadoop项目的任务被序列化和同步化。
Apache Hbase
1. Apache HBase是一个开源的,分布式的NoSQL数据库,用于大型数据集的实时读/写访问,并在HDFS上运行。HBase遵循主从架构,HBase主控制所有从机。从机称为区域服务器
2. HBase分布式应用程序安装取决于运行的ZooKeeper集群。Apache HBase使用ZooKeeper通过集中式配置管理和分布式互斥机制来帮助主机和区域服务器跟踪分布式数据的状态。
Apache Solr
1. Apache Solr是一个用Java编写的快速,开源的搜索平台。它是一个快速,容错的分布式搜索引擎。建立在Lucene 之上,是一个高性能,全功能的文本搜索引擎
2. Solr广泛使用ZooKeeper的每个功能,如配置管理,leader选举,节点管理,数据锁定和同步化。
3. Solr有两个不同的部分,索引和搜索。索引是以适当格式存储数据以便后续可以搜索的过程。Solr使用ZooKeeper对多个节点中的数据进行索引和搜索。