Zookeeper入门及单机及集群环境搭建

♀尐吖头ヾ 提交于 2020-03-17 07:28:27

1.Zookeeper简介

Zookeeper是一个分布式服务框架,以前是Apache Hadoop 的一个子项目,现在是Apache的一个独立顶级项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。有关分布式的相关问题请查阅上篇博客:分布式系统问题及解决方案

2.设计目标

  • ZooKeeper简单。ZooKeeper允许分布式进程通过共享的分层名称空间相互协调,该命名空间的组织方式类似于标准文件系统。名称空间由数据寄存器(在ZooKeeper看来,称为znode)组成,它们类似于文件和目录。与设计用于存储的典型文件系统不同,ZooKeeper数据保留在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数。
    ZooKeeper特性还包括高性能、高可用性、严格有序。ZooKeeper的性能方面意味着它可以在大型的分布式系统中使用。可靠性方面使它不会成为单点故障。严格有序意味着可以在客户端上实现复杂的同步原语。
    在这里插入图片描述
  • ZooKeeper可复制。像它协调的分布式进程一样,ZooKeeper本身也可以在称为集合的一组主机上进行复制。组成ZooKeeper服务的服务器都必须彼此了解。它们维护内存中的状态图像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务将可用。客户端连接到单个ZooKeeper服务器。客户端维护一个TCP连接,通过它发送请求,获取响应,获取监视事件并发送心跳。如果与服务器的TCP连接断开,则客户端将连接到其他服务器。
    在这里插入图片描述
  • ZooKeeper有序。ZooKeeper用一个反映所有ZooKeeper事务顺序的数字标记每个更新。后续操作可以使用该命令来实现更高级别的抽象,例如同步原语。
  • ZooKeeper很快。在“读取为主”的工作负载中,它特别快。ZooKeeper应用程序可在数千台计算机上运行,​​并且在读取比写入更常见的情况下,其性能最佳,比率约为10:1。

更详细的内容请参考官方文档:http://zookeeper.apache.org/doc/r3.6.0/zookeeperOver.html

3. Zookeeper下载安装

3.1 下载

下载地址:http://zookeeper.apache.org/releases.html,点击链接进入界面,可以直接选择最新发布版本下载。
在这里插入图片描述

3.2 解压到自己习惯的路径

在这里插入图片描述

3.3 修改配置

进入到conf目录,复制一份zoo_sample.cfg为zoo.cfg
在这里插入图片描述

# 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每间隔 tickTime 时间就会发送一个心跳,单位毫秒。
tickTime=2000

# 这个配置项是用来配置 Zookeeper Leader接受Follower初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper Leader还没有收到Follower的返回信息,那么表明这个Follower连接失败。总的时间长度就是 10*2000=20 秒
initLimit=10

# 这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒
syncLimit=5

# 顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
dataDir=/FreeofInstallation/apache-zookeeper-3.6.0-bin/data

# 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181

#单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
#maxClientCnxns=60

#这个参数和下面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个,也是3.4以后才有的。
#autopurge.snapRetainCount=3

#3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。
#autopurge.purgeInterval=1

3.4 启动和停止服务

进入zookeeper解压包的bin目录,或者也可以将路径加入环境变量,使用更加方便(windows环境请使用.cmd后缀的脚本)。

启动服务

./zkServer.sh start
#启动成功之后会显示如下信息
#Starting zookeeper ... STARTED

停止服务

./zkServer.sh stop
#停止服务后打印信息
#Stopping zookeeper ... STOPPED

启动客户端

./zkCli.sh 
#连接成功会进入shell终端
#[zk: localhost:2181(CONNECTED) 0] 

4. 单机搭建Zookeeper集群

4. 1 搭建集群

进入conf目录,复制三份配置文件

cp zoo.cfg zoo-1.cfg
cp zoo.cfg zoo-2.cfg
cp zoo.cfg zoo-3.cfg

创建数据目录

mkdir /FreeofInstallation/zookeeper/data-1 -p
mkdir /FreeofInstallation/zookeeper/data-2 -p
mkdir /FreeofInstallation/zookeeper/data-3 -p

创建日志目录

mkdir /FreeofInstallation/zookeeper/log-1 -p
mkdir /FreeofInstallation/zookeeper/log-2 -p
mkdir /FreeofInstallation/zookeeper/log-3 -p

创建myid

echo "1" > /FreeofInstallation/zookeeper/data-1/myid
echo "1" > /FreeofInstallation/zookeeper/data-2/myid
echo "1" > /FreeofInstallation/zookeeper/data-3/myid

修改三个配置文件:zoo-1.cfg、zoo-2.cfg、zoo-3.cfg

tickTime=2000
initLimit=10
syncLimit=5
#数据路径
dataDir=/FreeofInstallation/zookeeper/data-1
#日志路径
dataLogDir=/FreeofInstallation/zookeeper/log-1
clientPort=2181

#server.x中的x要和刚设置的myid文件内容一致;
#前面的端口用于同步数据通信,后面的端口用于选举投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
tickTime=2000
initLimit=10
syncLimit=5
#数据路径
dataDir=/FreeofInstallation/zookeeper/data-2
#日志路径
dataLogDir=/FreeofInstallation/zookeeper/log-2
clientPort=2182

#server.x中的x要和刚设置的myid文件内容一致;
#前面的端口用于同步数据通信,后面的端口用于选举投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
tickTime=2000
initLimit=10
syncLimit=5
#数据路径
dataDir=/FreeofInstallation/zookeeper/data-3
#日志路径
dataLogDir=/FreeofInstallation/zookeeper/log-3
clientPort=2183

#server.x中的x要和刚设置的myid文件内容一致;
#前面的端口用于同步数据通信,后面的端口用于选举投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

启动集群

./zkServer.sh start ../conf/zoo-1.cfg
./zkServer.sh start ../conf/zoo-2.cfg
./zkServer.sh start ../conf/zoo-3.cfg

验证查看节点状态(2是Leader,1、3是Follower)

./zkServer.sh status../conf/zoo-1.cfg
./zkServer.sh status../conf/zoo-2.cfg
./zkServer.sh status../conf/zoo-3.cfg

在这里插入图片描述

增加Observer节点
其他步骤都一样,只是配置文件(zoo-ob.cfg)有些不同

tickTime=2000
initLimit=10
syncLimit=5
#数据路径
dataDir=/FreeofInstallation/zookeeper/data-4
#日志路径
dataLogDir=/FreeofInstallation/zookeeper/log-4
clientPort=2184
#指定是observer节点
peerType=observer
#server.x中的x要和刚设置的myid文件内容一致;
#前面的端口用于同步数据通信,后面的端口用于选举投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2886:3886:observer

同样的方式直接启动该节点,并查看节点状态
在这里插入图片描述

4. 2 集群中的角色

  • leader 是zookeeper集群的核心,负责投票的发起和决策、处理客户端请求及最终决议。
  • follower 处理客户端非事务请求,以及转发事务请求给leader服务器同时参与leader选举的投票。
  • observer 观察zookeeper集群中最新状态的变化并将这些状态同步到observer服务器上,不参与投票过程。observer 的工作原理与 follower 角色基本一致,而它和 follower 角色唯一的不同 在于 observer 不参与任何形式的投票,包括事物请求 Proposal的投票和leader选举的投票。简单来说,observer 服务器只提供非事物请求服务,通常在于不影响集群事物 处理能力的前提下提升集群非事物处理的能力。
  • learner 和leader进行状态同步的server统称为learner及上面的follower和observer都是learner。

5. Zookeeper能做什么

  • 命名服务(Name Service)
    主要是作为分布式命名服务,通过调用zk的create node api,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。这些paht具有层级结构,非常便于理解和管理。
  • 配置管理(Configuration Management)
    配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台Server 运行,但该应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行该系统的Server上的配置,这样非常麻烦而且容易出错。
    像这样的配置信息完全可以交给 Zookeeper 来管理,将配置信息保存在 Zookeeper 的某个节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。
  • 集群管理(Group Membership)
    ZooKeeper的集群管理主要在两点:监控集群是否有机器退出和加入、选举master。
    对于第一点,过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题:1)集群中机器有变动的时候,牵连修改的东西比较多。2)有一定的延时。
    利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:所有机器约定在父目录(比如/GroupMembers)下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个目录被删除,即有一台机器挂掉了。新机器加入也是类似。
    对于第二点,在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑(例如一些耗时的计算,网络I/O处理),往往只需要让整个集群中的某一台机器进行执行, 其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 ·/currentMaster 节点,最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很轻易的在分布式环境中进行集群选取了。
  • 分布式锁
    分布式锁:分布式锁指的是在分布式环境下,保护跨进程,跨主机,跨网络的共享资源,实现互斥访问,保证一致性。分布式锁主要得益于ZooKeeper为我们保证了数据的一致性,即用户只要完全相信每时每刻,zk集群中任意节点(一台zk server)上的相同Znode的数据是一定都是相同的。

更加详细的使用场景和思路请参考:ZooKeeper(二)ZooKeeper能做什么?
下篇操作相关博文:Zookeeper节点及客户端基本操作

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!