Zookeeper的环境搭建

1、Zookeeper简介

1、分布式系统定义及⾯临的问题

ZooKeeper最为主要的使⽤场景,是作为分布式系统的分布式协同服务。
我们将分布式系统定义为:分布式系统是同时跨越多个物理主机,独⽴运⾏的多个软件所组成系统。类⽐⼀下,分布式系统就是⼀群⼈⼀起⼲活。⼈多⼒量⼤,每个服务器的算⼒是有限的,但是通过分布式系统,由n个服务器组成起来的集群,算⼒是可以⽆限扩张的。
分布式系统的协调⼯作就是通过某种⽅式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信⽅式有两种:
● 通过⽹络进⾏信息共享
这就像现实中,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道⾃⼰要⼲什么。当任务分配有变化时,leader会单独告诉组员,或者再次召开会议。信息通过⼈与⼈之间的直接沟通,完成传递。
● 通过共享存储
这就好⽐开发leader按照约定的时间和路径,把任务分配表放到了svn上,组员每天去svn上拉取最新的任务分配表,然后⼲活。其中svn就是共享存储。更好⼀点的做法是,当svn⽂件版本更新时,触发邮件通知,每个组员再去拉取最新的任务分配表。这样做更好,因为每次更新,组员都能第⼀时间得到消息,从⽽让⾃⼰⼿中的任务分配表永远是最新的。此种⽅式依赖于中央存储。整个过程如下图所示:
在这里插入图片描述

2、ZooKeeper如何解决分布式系统⾯临的问题

ZooKeeper对分布式系统的协调,使⽤的是第⼆种⽅式,共享存储。其实共享存储,分布式应⽤也需要和存储进⾏⽹络通信。
实际上,通过ZooKeeper实现分布式协同的原理,和项⽬组通过SVN同步⼯作任务的例⼦是⼀样的。ZooKeeper就像是svn,存储了任务的分配、完成情况等共享信息。每个分布式应⽤的节点就是组员,订阅这些共享信息。当主节点(组leader),对某个从节点的分⼯信息作出改变时,相关订阅的从节点得到zookeeper的通知,取得⾃⼰最新的任务分配。完成⼯作后,把完成情况存储到zookeeper。主节点订阅了该任务的完成情况信息,所以将得到zookeeper的完⼯的通知。参考下图,是不是和前⾯项⽬组通过svn分配⼯作的例⼦⼀模⼀样?仅仅是把svn和邮件系统合⼆为⼀,以ZooKeeper代替
在这里插入图片描述
注:Slave节点要想获取ZooKeeper的更新通知,需事先在关⼼的数据节点上设置观察点。
⼤多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同 步,那么就会在协作过程中产⽣各种问题。ZooKeeper解决协同问题的关键,就是在于保证分布式系统 信息的⼀致性。

3、zookeeper的基本概念

Zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂的且容易出错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并以⼀些简单的接⼝提供给⽤户使⽤。zookeeper是⼀个典型的分布式数据⼀致性的解决⽅案,分布式应⽤程序可以基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能

基本概念

  1. 集群角色
    通常在分布式系统中,构成⼀个集群的每⼀台机器都有⾃⼰的⻆⾊,最典型的集群就是Master/Slave模式(主备模式),此情况下把所有能够处理写操作的机器称为Master机器,把所有通过异步复制⽅式获取最新数据,并提供读服务的机器为Slave机器。
    ⽽在Zookeeper中,这些概念被颠覆了。它没有沿⽤传递的Master/Slave概念,⽽是引⼊了Leader、Follower、Observer三种⻆⾊。Zookeeper集群中的所有机器通过Leader选举来选定⼀台被称为Leader的机器,Leader服务器为客户端提供读和写服务,除Leader外,其他机器包括Follower和Observer,Follower和Observer都能提供读服务,唯⼀的区别在于Observer不参与Leader选举过程,不参与写操作的过半写成功策略,因此Observer可以在不影响写性能的情况下提升集群的性能。
  2. 会话(session)
    Session指客户端会话,⼀个客户端连接是指客户端和服务端之间的⼀个TCP⻓连接,Zookeeper对外的服务端⼝默认为2181,客户端启动的时候,⾸先会与服务器建⽴⼀个TCP连接,从第⼀次连接建⽴开始,客户端会话的⽣命周期也开始了,通过这个连接,客户端能够⼼跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接受来⾃服务器的Watch事件通知。
  3. 数据节点(Znode)
    在谈到分布式的时候,我们通常说的“节点”是指组成集群的每⼀台机器。然⽽,在ZooKeeper中,“节 点”分为两类,第⼀类同样是指构成集群的机器,我们称之为机器节点;第⼆类则是指数据模型中的数据单元,我们称之为数据节点——ZNode。ZooKeeper将所有数据存储在内存中,数据模型是⼀棵树(ZNode Tree),由斜杠(/)进⾏分割的路径,就是⼀个Znode,例如/app/path1。每个ZNode上都会保存⾃⼰的数据内容,同时还会保存⼀系列属性信息。
  4. 版本
    刚刚我们提到,Zookeeper的每个Znode上都会存储数据,对于每个ZNode,Zookeeper都会为其维护⼀个叫作Stat的数据结构,Stat记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode⼦节点的版本)、aversion(当前ZNode的ACL版本)。
  5. Watcher(事件监听器)
    Wathcer(事件监听器),是Zookeeper中⼀个很重要的特性,Zookeeper允许⽤户在指定节点上注册⼀些Watcher,并且在⼀些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性
  6. ACL
    Zookeeper采⽤ACL(Access Control Lists)策略来进⾏权限控制,其定义了如下五种权限:
        · CREATE:创建⼦节点的权限。
        · READ:获取节点数据和⼦节点列表的权限。
        · WRITE:更新节点数据的权限。
        · DELETE:删除⼦节点的权限。
        · ADMIN:设置节点ACL的权限。
    其中需要注意的是,CREATE和DELETE这两种权限都是针对⼦节点的权限控制

2、Zookeeper环境搭建

1、zookeeper搭建方式

Zookeeper安装⽅式有三种,单机模式和集群模式以及伪集群模式。
■ 单机模式:Zookeeper只运⾏在⼀台服务器上,适合测试环境;
■ 集群模式:Zookeeper运⾏于⼀个集群上,适合⽣产环境,这个计算机集群被称为⼀个“集合体”
■ 伪集群模式:就是在⼀台服务器上运⾏多个Zookeeper 实例;

2、单机模式搭建
  1. 下载

⾸先我们下载稳定版本的zookeeper http://zookeeper.apache.org/releases.html

  1. 上传

下载完成后,将zookeeper压缩包zookeeper-3.4.14.tar.gz上传到linux系统

  1. 解压压缩包

tar -zxvf zookeeper-3.4.14.tar.gz

  1. 进⼊ zookeeper-3.4.14 ⽬录,创建 data ⽂件夹

cd zookeeper-3.4.14
mkdir data

  1. 修改配置⽂件名称

cd conf
mv zoo_sample.cfg zoo.cfg

  1. 修改zoo.cfg中的data属性

dataDir=/root/zookeeper-3.4.14/data
dataLogDir = /root/zookeeper-3.4.14/data/logs

  1. zookeeper服务启动

进⼊bin⽬录,启动服务输⼊命令
./zkServer.sh start
./zkServer.sh status
./zkServer.sh stop

3、伪集群模式

Zookeeper不但可以在单机上运⾏单机模式Zookeeper,⽽且可以在单机模拟集群模式 Zookeeper的运⾏,也就是将不同实例运⾏在同⼀台机器,⽤端⼝进⾏区分,伪集群模式为我们体验Zookeeper和做⼀些尝试性的实验提供了很⼤的便利。⽐如,我们在测试的时候,可以先使⽤少量数据在伪集群模式下进⾏测试。当测试可⾏的时候,再将数据移植到集群模式进⾏真实的数据实验。这样不但保证了它的可⾏性,同时⼤⼤提⾼了实验的效率。这种搭建⽅式,⽐较简便,成本⽐较低,适合测试和学习
注意事项:
⼀台机器上部署了3个server,也就是说单台机器及上运⾏多个Zookeeper实例。这种情况下,必须保证每个配置⽂档的各个端⼝号不能冲突,除clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的⽬录中创建myid⽂件来指定对应的Zookeeper服务器实例
■ clientPort端⼝:
如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,⽐如 server1是2181,server2 是2182,server3是2183
■ dataDir和dataLogDir:
dataDir和dataLogDir也需要区分下,将数据⽂件和⽇志⽂件分开存放,同时每个server的这两变量所对应的路径都是不同的
■ server.X和myid:
server.X 这个数字就是对应,data/myid中的数字。在3个server的myid⽂件中分别写⼊了1,2,3,那么每个server中的zoo.cfg都配 server.1 server.2,server.3就⾏了。因为在同⼀台机器上,后⾯连着的2个端⼝,3个server都不要⼀样,否则端⼝冲突

  1. 创建⽬录zkcluster

mkdir zkcluster

  1. 解压 zookeeper-3.4.14.tar.gz到zkcluster⽬录下

tar -zxvf zookeeper-3.4.14.tar.gz -C /zkcluster

  1. 改变名称
    mv zookeeper-3.4.14 zookeeper01
  2. 复制并改名

cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03

  1. 分别在zookeeper01、zookeeper02、zookeeper03⽬录下创建data及logs⽬录

mkdir data
cd data
mkdir logs

  1. 修改配置⽂件名称
    cd conf
    mv zoo_sample.cfg zoo.cfg
  2. 配置每⼀个Zookeeper 的dataDir(zoo.cfg) clientPort 分别为2181 2182 2183

clientPort=2181
dataDir=/zkcluster/zookeeper01/data
dataLogDir=/zkcluster/zookeeper01/data/logs
clientPort=2182
dataDir=/zkcluster/zookeeper02/data
dataLogDir=/zkcluster/zookeeper02/data/logs
clientPort=2183
dataDir=/zkcluster/zookeeper03/data
dataLogDir=/zkcluster/zookeeper03/data/logs

  1. 配置集群

(1)在每个zookeeper的 data ⽬录下创建⼀个 myid ⽂件,内容分别是1、2、3 。这个⽂件就是记录每个服务器的ID
touch myid

(2)在每⼀个zookeeper 的 zoo.cfg配置客户端访问端⼝(clientPort)和集群服务器IP列表。
server.1=47.102.196.240:2881:3881
server.2=47.102.196.240:2882:3882
server.3=47.102.196.240:2883:3883
server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝

  1. 启动集群
    依次启动三个zk实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值