ZooKeeper入门

ZooKeeper是什么

Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。

我们可以到apache的zookeeper官网看一下介绍:

apache的zookeeper官网

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. 
All of these kinds of services are used in some form or another by distributed applications. 

自己简单的翻译一下,理解为:

ZooKeeper是维护的配置信息,命名,提供分布同步,提供组服务的一项集中化服务。
会以某种形式或者在其他的分布式应用中使用。

我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。


简单安装

官网下载对应ZooKeeper的tar.gz文件,解压到linux即可

这里版本是用的 3.4.7

文件夹大体结构为:

ZooKeeper文件夹结构

如果只是简单使用,直接启动bin目录下面的

./zkServer.sh start 

即可


具体的配置,我们可以看一下 conf目录下面的

zoo.cfg文件

  • tickTime=2000
    • 心跳间隔周期 毫秒
  • initLimit=10
    • 初始连接超时阈值=10*tickTime。
    • 指的是follower初始连接leader的超时时间。
    • 如果网络环境不好,适当调大
  • syncLimit=5
    • 连接超时阈值=syncLimit*tickTime。
    • 指的是follower和leader做数据交互的超时时间。
    • 如果网络环境不好,适当调大。
  • dataDir=/home/software/zookeeper-3.4.7/tmp
    • 原本在tmp文件夹下,可以修改到自己想存放的文件夹下
    • 对应的数据文件夹
    • clientPort=2181 对应端口

linux客户端单机连接

和mysql等等的类似,我们可以直接使用ZooKeeper自带的命令行客户端连接server (前提是ZooKeeper的server已经启动) 到bin目录,

./zkCli.sh

进入命令行界面

和linux命令类似, 我们

ls / 查看ZooKeeper的根目录(节点) create /dodo dodoInfo 创建一个 dodo的节点,设置的内容为 dodoInfo

创建ZooKeeper的dodo节点

也可以

get /dodo 查询对应节点的信息

查询ZooKeeper的dodo节点

里面包括:

  • 对应的信息(dodoInfo),数据长度,zxid,创建时间,修改时间等等

当然 如果是分布式的,这些信息也会用于判断信息的新旧,主从应该有的操作等等


ZooKeeper简单集群搭建

ZooKeeper无论是搭建和使用都很方便,ZooKeeper由于它的选举机制,最好搭建奇数台,可以减少容忍度,提高效率

选举说明: 虽然不难,但是篇幅有限,不描述了 选举满足pk原则

【pk原则】

  • 比较 事务id(zxid),谁大谁当leader
  • zxid相等的话,比较myid, 谁大谁当leader(过半,一般到中间就结束类)
  • 选举前提, 满足过半同意

【选举状态】

  • LOOKING,竞选状态。
  • FOLLOWING,随从状态,同步leader状态,参与投票。
  • OBSERVING,观察状态,同步leader状态,不参与投票。(这里我们忽略)
  • LEADING,领导者状态。

连接用官网的图片简单说明一下

client连接

我们用客户端连接任何一台的时候,其实都会转向对应的Leader读取数据 图中也很容易看出所有连接到Follower的连接,都会转向Leader

下面自己用3台说明一下 (也就是用3台虚拟机,类似helloworld)

我们创建3台服务器,都装好ZooKeeper

和上面一样,我们配置对应的zoo.cfg文件 (不同的是,添加集群中对应的server)

例如:

server.1=192.168.41.151:2888:3888 server.2=192.168.41.152:2888:3888 server.3=192.168.41.153:2888:3888

整个图是这样的

集群中ZooKeeper的配置

这里也就是指出

  • 有那几台服务
  • 对应的ip(可以自己配置hosts,用hostname)
  • 2888 端口原子广播端口,可以自定义
  • 3888 端口选举端口,可以自定义

最后,我们按照对应的id,设置myid 设置在dataDir下面

这里自己是(/home/software/zookeeper-3.4.7/tmp)

配置myid

内容很简单,就是对应的id值即可,例如myid设置为1,写1 就行,如图

设置myid为1

最后启动3台服务器的ZooKeeper 分别 ./zkServer.sh start 即可

这里,为启动的顺序是 151, 153, 152 我们用 ./zkServer.sh status 可以分别查看对应的状态

状态是leader

状态是follower

最后, 我们可以发现,中间启动的153是leader 由于第二台启动后,投票过半,153就是leader了 理解选举机制, 大家再自己理解即可


ZooKeeper简单集群测试

我们知道,ZooKeeper最大用处就是其 原子性 我们先在集群的一台机器上面创建节点 /dodoNode 试试 我们在151上面创建 /dodoNode

151上面创建dodoNode节点

我们再分别查看一下152, 153的ZooKeeper

152,153一样

我们发现,152,153都会出现创建的节点

同理,我们删除任意节点, 集群中其他ZooKeeper也会删除对应的节点,也就是原子性的简单理解


省略的java代码

对应的命令调用,都可以用java去调用 增删改查的实现也很简单,有1个月代码量的程序员都可以单独完成 百度一下就行 这里就略了


ZooKeeper特性

  • 数据一致性(单一视图)
    • client不论连接到哪个Zookeeper,展示给它都是同一个视图,即查询的数据都是一样的。这 是zookeeper最重要的性能。
  • 原子性
    • 对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。要么都更新成功,要么 都不更新。即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会 出现集群中部分机器应用了改事务,另外一部分没有应用的情况。
  • 可靠性
    • 一旦服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态 变更将会一直保留下来,除非有另一个事务又对其进行了改变。
  • 实时性
    • Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效 的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)

ZooKeeper的应用场景

ZooKeeper的实现,也就是分布式锁。 我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。 除了直接在hadoop,kafka,dubbo中使用外。 我们可以应用其特性简单在其他方面使用

  • 集群管理
    • 每台机器定时将状态写入到本机的ZooKeeper中
    • 其他每台机器都可以获取到集群中其他机器的配置和状态
    • 这个时候,负责获取数据的服务器就可以直接将情况发送给对应的监控页面,省时省力
  • 负载等的实现
    • nginx负载默认有3种方式
      • 轮询(默认)
      • 指定权重
      • IP绑定 ip_hash
    • 其实就算,fair(第三方)也不是很好的解决方案
      • 因为每台机器配置可能不一样
      • 每次请求操作的消耗可能不一样
      • 每台机器还可能配置其他的服务,具体场景也不一样
    • 如果定期获取服务器状态,再动态修改负载的配置,这样会更好实现负载

ZooKeeper不适合做的

千万不要因为方便,而上面都存储在ZooKeeper里面 不能用zk存储大量数据。 znode树是维系在内存里的,如果数据大,会吃掉大量内存


简单结束语

  • 什么东西最好的理解就是多使用,尽量在不同的场景上使用上,理解就会深刻
  • 用起来简单,如果自己能实现就更好了,自己尝试用分布式锁实现一个类似ZooKeeper的应用,以后代码能力会更加强大
  • 理解ZooKeeper在hadoop, kafka,dubbo的使用位置,和衔接情况, 对应以后无论是解耦能力,还是聚合能力,都有很大帮助
  • 这里只是最简单的理解和使用,凡事入门都容易,深入需要大量的时间和精力

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

轻松理解 X-XSS-Protection

首先我们来理解一下什么是“X-XSS-Protection”,从字面意思上看,就是浏览器内置的一种 XSS 防范措施。

15200
来自专栏糊一笑

使用github+jekyll搭建个人博客

给自己一个小空间 聊聊起初 每次看到大牛们的博客,都会激起一颗一定要搭建自己博客的心,毕竟有着一颗向大牛们看齐的心。但是一直不知道如何下手,从最初的csdn写写...

35460
来自专栏腾讯云数据库(TencentDB)

CynosDB技术详解——存储集群管理

CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统...

19.8K60
来自专栏TechBox

[!]The 'pods-xxx' target has libraries with conflicting name: libcrypto.a and libssl.a

35730
来自专栏数据和云

运维经验:回滚段异常的特殊救急方法

? 冷菠 冷菠,资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队管理以及培训经验。擅长数据库备份恢复、数据库性能诊断优化以及数据...

46090
来自专栏IT笔记

分享一款JVM线程堆栈在线分析工具

JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。 ? 如题所述,今天与大家分享的是如何分析...

3.4K60
来自专栏JetpropelledSnake

Python Web学习笔记之Python多线程和多进程、协程入门

进程和线程究竟是什么?如何使用进程和线程?什么场景下需要使用进程和线程?协程又是什么?协程和线程的关系和区别有哪些? 程序切换-CPU时间的分配 首先,我们的任...

40450
来自专栏C/C++基础

google C++编程风格指南之头文件的包含顺序

(1)为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.c...

12610
来自专栏后端技术探索

Nginx如何做流量控制

英文原文:https://www.nginx.com/blog/rate-limiting-nginx/

67240
来自专栏不想当开发的产品不是好测试

jenkins 邮件添加附件

背景 当CI执行失败的时候,想获取到失败的用例,然后在本地调试,testNG是自带一个testng-failed.xml来记录的; 想法:尝试使用git 来p...

26550

扫码关注云+社区

领取腾讯云代金券