本文作者:HelloGitHub-老荀

Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费有趣、入门级的 ZooKeeper 开源教程,面向有编程基础的新手。

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 曾经是 Hadoop 的一个子项目,但现在是一个顶级独立的开源项目。

ZK 在实际开发工作中经常会用见到,算的上是吃饭的家伙了,那可得玩透、用的趁手,要不怎么进阶和升职加薪呢?来和 HelloGitHub 一起学起来吧~

本系列教程是从零开始讲解 ZooKeeper,内容从最基础的安装使用到背后原理和源码的讲解,整个系列希望通过有趣文字、诙谐的气氛中让 ZK 的知识“钻”进你聪明的大脑。本教程是开放式:开源、协作,所以不管你是新手还是老司机,我们都希望你可以加入到本教程的贡献中,一起让这个教程变得更好

  • 新手:参与修改文中的错字、病句、拼写、排版等问题
  • 使用者:参与到内容的讨论和问题解答、帮助其他人的事情
  • 老司机:参与到文章的编写中,让你的名字出现在作者一栏

项目地址:https://github.com/HelloGitHub-Team/HelloZooKeeper

接下来是和 ZooKeeper 的初次见面~你好,ZooKeeper

一、介绍

在开始介绍 ZooKeeper(以下简称 ZK)之前,我先来给大家讲一个小故事(故事中的人物,纯属虚构,请勿对号入座,如有雷同,纯属巧合)。

1.1 动物村小故事

在很久很久以前,有一个动物星球,上面有一个动物村,村里面住着好多小动物,好不热闹。

大家都各司其职,做着自己喜欢的事情

一开始邻里之间都是互帮互助,互敬互爱,一切都很和谐,谁家发生了啥事,大家都能知道。

随着村庄里的小动物越来越多,整个村庄的邻里关系也变成了一张巨大的网,而且由于不同动物之间的生活习性和饮食习惯的差异,导致了原本友爱的村庄,邻里之间也渐渐产生了矛盾。

动物们也渐渐意识到了,整个村庄需要从一个大集体向小集体去发展了,不同的动物都自发聚集在了一起生活,建立了自己的小社区。

但是大家分开后就有一个问题,原来大家都住一起,鸡家长马家短大家都是能知道的。现在鸡太美刚刚完成练习两年半的舞蹈视频,想分享给大家,但是现在大家的小区都分开了,而且还不能串门,可急死人了啊。

于是村委会紧急召开会议,听取了各个村民业主代表的意见,发现大家都有类似的诉求,所以决定在动物星球成立一个公共办事处,并且找了村里资历最老 69 岁的马果果担任办事处的负责人。

现在开始只要村民有诉求都可以去办事处登记,马果果负责记录,并且根据不同的事宜通知其他想了解此事情的村民。

现在鸡太美就可以去办事处登记了,马果果拿了纸和笔记了下来:

鸡太美上传了舞蹈视频

而隔壁的小狗坤坤一直暗恋鸡太美,三天两头就往办事处跑,问马果果怎么鸡太美还不更新?不跳舞打篮球也行啊!被一直这么问马果果觉得好烦,就跟坤坤说:“你把你感兴趣的,告诉我,我也记下来,以后不用你一直来问了,有新情况的时候我会通知你的!”,坤坤听后也可高兴了,毕竟出趟门还是很麻烦的。

于是马果果又拿纸和笔记了下来:

鸡太美更新了视频得通知坤坤

之后当鸡太美有了任何视频更新的登记,马果果都会直接打电话给坤坤通知他。

陆陆续续有更多的村民跑来登记,马果果每次都会记下来。

鸡太美上传了舞蹈视频
鸡太美上传了篮球视频
马小云最近有点飘
马小腾发表了充值才能变得更强的论文
...

村民还能去登记自己感兴趣的事情

马小云投资了小狗东东的杂货铺得通知马小腾
马小腾最新迷恋上什么游戏得通知马小云
鸡太美更新了视频得通知坤坤
...

有了办事处,动物村又恢复了以往的热闹,马果果觉得退休了还能发挥余热,实在是太好啦!

之后马果果又和村委会的人提了:“这个办事处还没有名字呢?”。村委会一致决定,既然我们是动物村,那办事处就叫 ZooKeeper 吧!


小故事讲(chui niu)完了,但是动物村的故事还远远没有结束,尽情期待噢~

1.2 正题开始

之后的 ZK 的知识点重点讲解服务端,偶尔会涉及到客户端,客户端也是以 Apache 官方的 Java 客户端为例子,如果你是别的编程语言的开发者,也不用担心,我会尽量以不讲代码的方式来讲解 ZK 背后的原理。

下面开始用猿话来翻译下,动物村原来的大集体就和以前单应用是一样的,所有的业务都写在一个应用(进程)里,不管什么业务更新,整个应用都要发布,所以慢慢就有了分布式的架构(小集体),把不同的业务逻辑部署在不同的应用里,这样每一个业务更新,都不会影响到其他的业务,但是分布式的架构会导致原本在一个进程里共享内存的两个对象,现在要通过网络才能实现通信,所以急需要引入一个脱离于应用的第三方组件来承担起这个跨进程共享数据或者通信的任务,在本系列文章里,这个组件就是 ZK。如果你从来没用过 ZK 或者说根本没听说过的话,那你就可以把 ZK 类比成为数据库,也是一个独立存放数据的地方,也能对数据进行增删改查,只不过用的不是 SQL,而且 ZK 还支持回调通知。什么?你说你数据库也没用过?(Orz,这真的就很难解释了...你可以直接留言给我们,我慢慢跟你解释)

下面给出 ZK 的百度百科定义:

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

是不是完全看不懂?看不懂就对了。上面这段话有几个重点的关键字:开源、分布式、协调、一致性。

  • 开源意味着源码可以免费下载学习。
  • 分布式有两重含义,第一个是给分布式的架构应用去使用,第二是 ZK 自身也是支持分布式部署实现高可用的。
  • 协调的意思是,ZK 说到底只是一个协调的框架或者服务,他提供了一些在分布式环境下的通知或者存储的手段,但是具体怎么用到业务中,还是需要使用者自己去选择和评估的。
  • 一致性在 ZK 中是最终一致性,ZK 无法保证实时的强一致性,有一个时间窗口,但是最终 ZK 集群中的数据都会是一样的。

二、安装

2.1 二进制包安装

既然 ZK 是一个服务,自然是需要部署安装的,ZK 官网提供了二进制包的下载 下载页面 https://zookeeper.apache.org/releases.html 选择一个合适的版本下载就行。

下载下来后是一个压缩包,解压后得到目录如下:

lib/
docs/
conf/
bin/
README_packaging.md
README.md
NOTICE.txt
LICENSE.txt

使用者需要关注的就是 bin 目录和 conf 目录。我们先来看看 bin

.
├── README.txt
├── zkCleanup.sh
├── zkCli.cmd
├── zkCli.sh
├── zkEnv.cmd
├── zkEnv.sh
├── zkServer-initialize.sh
├── zkServer.cmd
├── zkServer.sh
├── zkSnapShotToolkit.cmd
├── zkSnapShotToolkit.sh
├── zkTxnLogToolkit.cmd
└── zkTxnLogToolkit.sh

Windows 平台就选择 cmd 结尾的文件启动,Mac/Linux 平台选择 sh 结尾的文件启动。

这里我以 Mac 平台作为讲解,尝试将 ZK 启动,但是在启动之前,需要先将 conf 目录下的 zoo_sample.cfg 重命名为 zoo.cfg ,因为 ZK 启动程序默认找的就是 zoo.cfg,重命名完了就可以通过 ./zkServer.sh start-foreground 在前台启动,或者 ./zkServer.sh start 在后台启动,没有报错的话就是启动成功了。

之后再通过官方给出的 zkCli.sh 使用客户端去连接刚刚启动的服务端。

看到这个交互式的命令行界面就是连接成功了:

[zk: localhost:2181(CONNECTED) 0]

通过简单的 ls / 命令测试下,服务端正常返回了:

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

2.2 Docker 安装

现在全面容器化的时代,自然少不了 Docker。先下载最新的镜像:

$ docker pull zookeeper

在 Docker 中启动一个 ZK 的容器非常简单,只需要一行命令,其中的 new-zookeeper 可以修改成任意的名字。

$ docker run -d -p 2181:2181 --name new-zookeeper zookeeper

然后通过 docker exec 命令进入容器

$ docker exec -it new-zookeeper bash

进入容器以后就是一个 Linux 环境了,之后连接服务端的方式和之前二进制的方式是一样的。

其实我们这里指定了 -p 2181:2181 所以不用进入容器也可以直接用客户端连宿主机的 2181 端口进入交互式的客户端,也和刚刚的方式一样,就不赘述了。

Docker 由于不是本系列文章的重点,所以这里就点到为止,有兴趣的自己再去研究下吧。

三、客户端介绍

由于刚刚客户端都是通过命令行去操作的,现实中,除了偶尔运维查看数据,几乎是用不到的,在生产环境中肯定是需要通过代码去操作 ZK 的,所以各个编程语言都有相对流行的 ZK 客户端的库,下面罗列出一些:

你可以看到上面的客户端都是在开源社区 GitHub 上!这就是开源的力量!这就是社区的力量!

四、总结

本文作为系列的第一篇简单的介绍了 ZK 大致是什么,也简单的介绍了如何安装和运行服务端,并使用自带的命令行客户端去连接。下一篇,我会以 Java 官方的客户端作为讲解,演示下如何使用程序去进行一些基本的操作和进阶的操作。


关注 HelloGitHub 公众号 收到第一时间的更新。

还有更多开源项目的介绍和宝藏项目等待你的发掘。

欢迎来到 ZooKeeper 动物世界的更多相关文章

  1. Swift中文教程(一)--欢迎来到Swift的世界

    原文:Swift中文教程(一)--欢迎来到Swift的世界 Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始 ...

  2. 精通libGDX游戏开发-RPG实战-欢迎来到RPG的世界

    欢迎来到RPG的世界 本章我会快速的使用tiled这样的瓷砖地图工具,来带领大家创造所设想的世界. 创建并编辑瓷砖地图 瓷砖地图(tile-based map)是广泛应用于各种游戏类型的地图格式,li ...

  3. 《动物世界》的剪刀石头布 HDU --- 6418

    题目连接: https://vjudge.net/problem/1812686/origin emmm 这一题的资料来自<动物世界>这一个李易峰演的电影.. 主要的思路就是概率,但是会牵 ...

  4. 欢迎来到 Flask 的世界

    欢迎来到 Flask 的世界 欢迎阅读 Flask 的文档.本文档分成几个部分,我推荐您先读 < 安装 >,然后读< 快速上手 >.< 教程 > 比快速上手文档更详 ...

  5. 欢迎来到Curl的世界

    一.Curl 简介 curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是 综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括H ...

  6. Nacos系列:欢迎来到Nacos的世界!

    什么是Nacos? Nacos 是构建以"服务"为中心的现代应用架构 (例如微服务范式.云原生范式) 的服务基础设施. Nacos可以做什么? 1.动态配置服务:支持以中心化.外部 ...

  7. 欢迎来到Flask的世界

    不多说,直接上文档链接:Flask的文档 教程 API 快速上手

  8. ZooKeeper翻译(一)

    欢迎来到Apache ZooKeeper的世界 Apache Zookeeper是一个为了开发和维护一个开源的服务的一个尝试,这个服务使高可用的分布式协作成为可能. ZooKeeper是什么? Zoo ...

  9. 一文带你读懂zookeeper在大数据生态的应用

    一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...

随机推荐

  1. json JSON_UNESCAPED_UNICODE 防止中文乱码

    json_encode(['content'=>$content],JSON_UNESCAPED_UNICODE)

  2. C#中的深度学习(一):使用OpenCV识别硬币

    在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别.具体来说,我们将训练一个DNN识别图像中的硬币. 在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币.硬币检测是硬币完整 ...

  3. day019python之面向对象基础1

    面向对象基础 目录 面向对象基础 1 面向对象基础 1.1 面向对象的由来 1.2 面向对象编程介绍 1.2.1 回顾面向过程设计 1.2.2 面向对象设计 2 类与对象 2.1 基本使用 2.2 示 ...

  4. CCNP第二天之复习CCNA

    1.静态路由的扩展配置: (1).环回接口: 在设备上用于测试TCP/IP协议栈能否正常使用.默认没有.需要手工创建   R1(config)#interface loopback 1         ...

  5. Windows 系统下Vue的安装及环境搭建

    Hope to help those in need and those who use Vue for the first time. 1.获得并安装node.js.nodejs官网:https:/ ...

  6. 对路径binroslyn..的访问被拒绝

    一开始的解决办法就是把bin下的文件都删除了,但是roslyn文件夹下的部分文件一直被占用,必须进程中把vbcscompiler进程干掉,才能删除,再重新编译,就没问题了.

  7. springboot+mybatis+bootstrap开发员工oa后台管理系统项目源码

    java项目源码详情描述:S020<springboot+mybatis+bootstrap开发员工oa后台管理系统项目源码>jboa项目有请假以及报销单的申请和审核session共享加登 ...

  8. 手写一个简单的starter组件

    spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...

  9. JDBC(五)—— 批量插入数据

    批量插入数据 @Test public void testInsert() throws Exception { Connection conn = null; PreparedStatement p ...

  10. VIM和正则表达式

    1.VIM 1.1vim简介 vim是一款强大的文本编辑器,它和 vi 使用方法一致,但功能更为强大.官网:www.vim.org.中文手册:http://vimcdoc.sourceforge.ne ...