第一章:Zookeeper介绍

Zookeeper,动物管理员,是用来管理hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。

Apache Hbase和Apache Solr的分布式集群都用到了Zookeeper。

Zookeeper是一个分布式、开源程序协调服务,是Hadoop项目下的一个子项目。它提供的主要功能是配置管理名字服务分布式锁集群管理

1.1:Zookeeper的作用:配置管理(重点)

抛出问题:

在我们的应用中,除了代码,还有一些就是各种配置。比如:数据库连接等。一般我们都是使用配置文件的形式,在代码中引入这些配置文件。

当我们只有一种配置,只有一台服务器,并且不经常做修改的时候,使用配置文件是一个很好的做法。但是,如果我们的配置非常多,而且很多服务器都需要这个配置,这时,使用配置文件求不是一个很好的选择。

这个时候就需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对该配置文件感兴趣的都可以获得变更,Zookeeper就这样的一种服务。

问题解决:

Zookeeper使用Zab这样的一致性协议来提供一致性。现在很多开源项目都使用Zookeeper来维护配置。

比如HBase,客户端就是连接一个Zookeeper,获得必要的HBase集群配置信息,然后才可以进一步进行操作。

开源的消息队列Kafka中,也是使用Zookeeper来维护broker的信息。

在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理

1.2:Zookeeper的作用:名字服务(了解)

问题抛出:

比如,为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址很复杂,这个时候就需要使用功域名来进行访问。但是,计算机是不能为域名的,有一种解决方案,就是我们为你每台机器都备份有一份域名到IP的映射,这个能解决一部分问题,但是如果域名对应的IP发生变化怎么办?于是就有了DNS,我们只需要访问一个大家都熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。

问题解决:

在我们的应用中也会存在这种问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是,如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来就会很方便

1.3:Zookeeper的作用:分布式锁(了解)

问题抛出:

比如:在一个分布式环境中,为了提高可靠性,我们集群的每台服务器都部署着同样的服务,但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就需要进行协调,编程起来就会非常复杂。而如果我们只让一个服务进行操作,那又存在单点问题

问题解决:

使用分布式锁,在某个时刻只让一个服务去干活,的那个这台服务出现问题的时候锁释放,立即fail over到另外的服务。在很多分布式系统中,都是这么做的,也叫Leader Election

比如:HBase的Master就是采用这种机制,但是要注意的是分布式锁和同一个进程的锁还是有区别的,所以使用的时候,要比同一个进程里的锁更谨慎的使用。

1.4:Zookeeper的作用:集群管理(重点)

问题抛出:

在分布式的集群中,经常会由于各种原因,比如硬件故障、软件故障、网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群

这个时候,集群中的其他机器需要感知到这种变化,然后根据这种变化做出相应的对策。

问题解决:

比如,我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们需要根据现在集群的状态来分配存储节点。这时我们就需要动态感知到集群目前的状态

比如,一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供这种服务(也被称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。

第二章:Zookeeper的存储结构

2.1:Znode

在Zookeeper中,znode是一个根Unix文件系统路径相似的节点,可以往这个节点存储或者获取数据

Zookeeper底层是一套数据结构。这个数据结构是一个树形结构,上面的每一个节点,称之为“znode”,Zookeeper中的数据是按照树结构进行存储的,而且znode节点还分为4中不同的类型。

每个znode节点默认存储1MB的数据仅仅用来记录状态)。

可以使用zkCli命令,登录到Zookeeper上,并通过ls、create、delete、get、set等命令来操作这些znode节点。

2.2:Znode节点类型

(1)PERSISTENT(持久化节点):所谓持久化节点,是指在节点创建后,就会一直存在,直到有删除操作来主动清除这个节点,否则不会因为创建该节点的客户端会话失效而消失。

(2)PERSISTENT_SEQUENTIAL(持久顺序节点):这类节点基本特征和持久化节点是一致的。额外的特性是,在ZK中,每个父节点会为它的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的同时,可以设置这个属性,那么在创建节点的过程中,ZK会自动为给定节点加上一个数字后缀,作为新的节点名。这个数字后缀范围是整型的最大范围值。在创建节点的同时,只需要传入节点“/test_”,这样,Zookeeper会自动给后面补充数字。

(3)EPHEMERAL(临时节点):和持久化节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而不是连接断开。另外,在临时节点下面不能再创建子节点。

值得注意的是,当客户端失效的时候,所产生的节点并不是一下子就消失,也要过一段时间,大概10s以内。

(4)EPHEMERAL_SEQUENTIAL(临时自动编号节点):此节点属于临时节点,不过带有顺序,客户端会话结束,节点就消失。

第三章:Zookeeper的安装(单机版)

安装环境:Linux系统、JDK

安装步骤:

第一步:上传Zookeeper压缩包

官方资源包可在 zookeeper.apache.com 站点中下载。最新发布版本为:3.4.12。

第二步:解压Zookeeper压缩包

tar -zxf zookeeper-3.4.6.tar.gz

cp zookeeper-3.4.6 /usr/local/zookeeper -r

第三步:配置Zookeeper

Zookeeper在启动的时候,默认去conf目录下查找一个名为zoo.cfg的配置文件。

cp zoo_sample.cfg  zoo.cfg

修改zoo.cfg配置文件:

设置dataDir路径:即数据缓存路径,需要先创建一个data文件夹

第四步:启动Zookeeper

在/bin目录下,启动zkServer,sh文件

(1)默认加载配置文件:./zkServer.sh start,会默认去conf目录下加载zoo.cfg配置文件

(2)指定加载配置文件:./zkServer.sh start [配置文件路径位置]

停止Zookeeper:./zkServer.sh stop

查看Zookeeper状态:./zkServer.sh status

zookeeper文件目录:

第四章:Zookeeper集群原理

4.1:Zookeeper集群中的角色

Zookeeper集群中的角色主要有以下三类:

4.2:设计目的

(1)最终一致性:client不论连接到哪一个server,展示的都是同一个视图,这是zookeeper最重要的性能。

(2)可靠性:如果消息m被一台服务器接收到,那么它将会被所有的服务器接收

(3)实时性:Zookeeper保证客户端将在一个时间间隔范围内,获得服务器的更新信息,或者服务器失效的信息;但由于网络延迟的原因,zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新的数据,应该在读数据之前调用sync()接口

(4)等待无关(wait-free):慢的或者实效的client不得干预快速的client请求,使得每个client都能有效的等待

(5)原子性:更新只有成功或者失败,没有中间状态

(6)顺序性:包括全局有序和偏序两种:全局有序是指如果一台服务器上消息a在消息b之前发布,则在所有的server上消息a都会在消息b之前发布;偏序是指如果一个消息b在消息a后被同一个发布者发布,消息a必将排在消息b之前。

第五章:Zookeeper创建集群

使用三个zookeeper搭建一个伪集群,应用部署在linux系统:192.168.110.128;服务器监听端口为2181、2182、2183;投票选举端口为2881/3881、2882/3882、2883/3883。

三个集群都在:/usr/local/zookeepercluster目录下

子目录分别为:zookeeper01、zookeeper02、zookeeper03

安装方法与单机版一样。配置文件需要指定data目录

特殊地方:

每个集群需要提供应用唯一标识

在zookeeper集群中,每个节点需要一个唯一标识,这个唯一标识要求必须是一个自然数,且唯一标识保存位置是:/data/myid,其中myid为配置文件。

配置方案:

(1)手动用vi命令编辑myid,并添加标识1,2,3

(2)使用简化命令:echo [唯一标识] >> myid

echo命令为回声命令,系统会将命令发送数据返回,“>>”为定位,代表系统回声数据指定发送到什么位置,此命令代表系统回声数据发送到myid文件中,如果没有文件则创建文件。

通常需要给配置文件添加客户自行权限,命令如下:

chmod +x 文件名

修改配置文件zoo.cfg:设置服务、投票、选举端口

vi zoo.cfg(每个集群都需要配置)

clientPort=2181 #服务端口根据应用做对应修改,zk01-2181,zk02-2182,zk03-2183
server.1=192.168.70.143:2881:3881
server.2=192.168.70.143:2882:3882
server.3=192.168.70.143:2883:3883

启动zookeeper应用:

在bin/zkServer.sh.start

注:zookeeper集群搭建完成后,至少需要启动两个应用才能提供服务,因为需要选举出主服务节点。启动所有的zookeeper节点后,可以使用命令:bin/zkServer.sh status来查看节点状态,如下所示:

Model:leader 表示主机

Model:follower 表示备份机

关闭zookeeper应用:

命令:bin/zkServer.sh stop

第六章:Zookeeper常见命令

启动zookeeper客户端:

bin目录下:./zkCli.sh

(1)当输入命令不正确时,会提示信息:

(2)常用命令:ls

使用格式:ls path

表示列表路径下的资源

指的注意的是:在zookeeper中,

根节点路径: ls  /

子节点路径: ls  /zookeeper

下一级子节点:ls  /zookeeper/quota

(3)常用命令:quit

表示:退出客户端

(4)连接指定的ip地址下的服务器

./zkCli.sh -server 192.168.110.128:2182

(5)常用命令:connect 【ip】

表示:连接到指定的服务器

例如:connect 192.168.110.128:2183

(6)常用命令:create 【-e】【-s】 path data

表示:创建节点

-e:表示创建临时节点,可以不指定

-s:表示创建一个顺序节点,可以不指定

path:表示在哪个节点下创建新的节点,其中,根节点表示为/

data:表示节点数据

例如:create /test 123

表示:在根节点下,创建一个test节点,数据为123,节点类型没有给定,默认为持久型节点。

例如:创建顺序节点:create /test2 2

zookeeper自动为节点添加后缀信息;

(7)常用命令:get path

表示:查看指定节点的数据

例如:get /test

123
cZxid = 0x400000004
ctime = Fri Jul 05 18:00:23 CST 2019
mZxid = 0x400000004
mtime = Fri Jul 05 18:00:23 CST 2019
pZxid = 0x400000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

(8)常用命令:set path data 【version】

表示:设置对应位置节点的数据

例如:

(9)delete path 【version】

表示:删除指定节点,此命令不能删除有子节点的节点

(10)常用命令:rmr path

表示:删除指定节点,包括子节点

(11)常用命令:quit

表示:退出控制台

了解一下zookeeper,搭建单机版和集群版的环境玩玩,需要手稿的,留下邮箱的更多相关文章

  1. (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版

    http://blog.csdn.net/yerenyuan_pku/article/details/72863323 我们知道Jedis在处理Redis的单机版和集群版时是完全不同的,有可能在开发的 ...

  2. Redis单机版以及集群版的安装搭建以及使用

    1,redis单机版 1.1   安装redis n  版本说明 本教程使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install g ...

  3. redis单机版和集群版搭建笔记-简略版

    搭建单机版: 解压 tar -zxf redis-3.0.0.tar.gz 编译 cd redis-3.0.0 安装 make install prefix=/usr/local/redis-inst ...

  4. Redis单机版和集群版的安装和部署

    1.单机版的安装 本次使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install gcc-c++ 1.1 安装redis 1.下载re ...

  5. redis在项目中的使用(单机版、集群版)

    1.下载jar包:jedis-2.6.2.jar 2.代码: JedisDao.java: package com.test.www.dao; public interface JedisDao { ...

  6. 使用jedis客户端连接redis,单机版和集群版

    单机版 1.入门实例 @Test public void testJedis(){ //创建一个jedis对象,需要指定服务的ip和端口号 Jedis jedis=new Jedis("19 ...

  7. 在 Ubuntu 上搭建 Hadoop 分布式集群 Eclipse 开发环境

    一直在忙Android FrameWork,终于闲了一点,利用空余时间研究了一下Hadoop,并且在自己和同事的电脑上搭建了分布式集群,现在更新一下blog,分享自己的成果. 一 .环境 1.操作系统 ...

  8. JedisClient操作redis 单机版和集群版

    一.在pom文件中添加依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency&g ...

  9. shiro的单机版 和 集群版

    在我们的开发当中  我们一般权限都是个 比较繁琐 但又必不可少的 一部分 [不管我们的 数据库设计  还是我们采用何种技术 我们的权限库表 大多都是大同小异  业务逻辑也是如此] 在我们不使用任何框架 ...

随机推荐

  1. 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

    为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器 ...

  2. Unity推荐设置(HoloLens开发系列)

    本文翻译自:Recommended settings for Unity Unity提供了一系列默认选项,这些选项能够适用于所有平台的一般情况.但是,Unity同样为HoloLens提供了一些特殊行为 ...

  3. js打印指定元素内容

    var v = document.createElement("div"); //向v中追加打印数据,可以将界面的元素追加进来 var h = window.open(" ...

  4. VC++的Unicode编程

    本文来自:http://tech.ddvip.com/2007-03/117395585321221.html 一.什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范 ...

  5. Qt元类型(MetaType)注册入门(附一些官方文档的关键摘录)

    昨天调试项目时,突然发现如下消息: QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_L ...

  6. 使用Arcgis Pro 发布矢量切片

    ArcGIS Pro 中的任何地图或底图都可以创建矢量切片,但是有一些局限性和特殊注意事项.为创建矢量切片制作地图的重点是构建一个有效的地图,以快速绘制生成的切片. 软件环境 操作系统:Windows ...

  7. ZooKeeper学习第六期---ZooKeeper机制架构(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4133784.html 一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control L ...

  8. 【搜索引擎】Solr全文检索近实时查询优化

    设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...

  9. 第一章 corejava的入门

    第一章 corejava的入门一:什么是语言语言=os+数据结构+算法+思想os:操作系统数据结构:队,栈,二叉树,链表算法:做游戏开发时非常重要面试题:int a>0,b>0只使用一条输 ...

  10. request - cookie操作(二)

    from urllib import request,parsefrom http.cookiejar import CookieJarheaders = { "User-Agent&quo ...