Zookeeper基础及集群搭建

Zookeeper简介

打开Zookeeper的官网,http://zookeeper.apache.org/,可以看到这样一句话


ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务所有这些类型的服务都以分布式应用程序的某种形式使用。每次实施它们都需要做很多工作来修复不可避免的错误和竞争条件。由于难以实现这些类型的服务,应用程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。

注红的一句话基本上概括了Zookeeper可以提供什么功能.

1.命名服务   2.配置管理   3.集群管理   4.分布式锁  5.队列管理

Zookeeper数据结构

1.Zookeeper维护一个类似文件系统的数据结构:

                                                          zookeeper简介

 图中的每个节点称为一个znode. 每个znode由3部分组成:

1.stat:此为状态信息, 描述该znode的版本, 权限等信息.

2.data:与该znode关联的数据.

3.children:该znode下的子节点.


        每个子目录项如 NameService 都被称作为 znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

有四种类型的znode:

1、PERSISTENT-持久化目录节点

客户端与zookeeper断开连接后,该节点依旧存在

2、 PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

3、EPHEMERAL-临时目录节点

客户端与zookeeper断开连接后,该节点被删除

4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

另外,需要注意是,ZooKeeper的临时节点不允许拥有子节点。

2.通知机制(watch)

 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。 

3.znode节点操作

在ZooKeeper中有9个基本操作,如下图所示:

更新ZooKeeper操作是有限制的。delete或setData必须明确要更新的Znode的版本号,我们可以调用exists找到。如果版本号不匹配,更新将会失败。

更新ZooKeeper操作是非阻塞式的。因此客户端如果失去了一个更新(由于另一个进程在同时更新这个Znode),他可以在不阻塞其他进程执行的情况下,选择重新尝试或进行其他操作。

尽管ZooKeeper可以被看做是一个文件系统,但是处于便利,摒弃了一些文件系统地操作原语。因为文件非常的小并且使整体读写的,所以不需要打开、关闭或是寻地的操作。


Zookeeper可以实现的功能

从简介里面已经大致概括了Zookeeper提供的功能.

1.命名服务.

通过四种类型的znode节点了解,我们可以通过约定在同一个/path 目录下创建顺序编号的节点,通过path即能探索发现.

2.统一配置管理

程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难.约定把所有需要配置的信息存放到某一节点下,然后所有相关应用程序对这个目录节点进行监听,通过Zookeeper的通知机制,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。


3.集群管理

所谓集群管理无在乎两点:是否有机器退出和加入、选举master。(同样也是利用Zookeeper的znode的特性判断某个znode是否存在.)

所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知.master的选举约定创建临时顺序编号目录节点,每次选取编号最小的机器作为master。

4.Zookeeper分布式锁

1: 当这两个线程去mysql更新数据之前, 先到zookeeper/locks(永久节点)下面注册一个临时有序节点, 这样每个线程都注册了一个临时节点, 两个临时节点肯定是有序的。
  线程1: /locks/000000002 线程2: /locks/000000001

  2: 当每个线程注册完节点之后, 需要尝试获取锁, 这个时候, 哪个节点最小, 哪个线程就获取到锁, 这个时候, 线程2注册的节点最小, 所以线程就获取到锁, 执行更新数据库的代码, 更新完
  成之后, 删除自己注册的临时节点。同时线程1会判断自己不是最小的, 所以就会监控比自己小1的那个节点, 当发现那个节点消失的话, 也就意味着它的节点就是最小的节点, 获取锁, 执行更新数据库的代码 .  



5.Zookeeper队列管理

两种类型的队列:
1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。 
2、队列按照 FIFO(先进xian) 方式进行入队和出队操作。 

第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。 

Zookeeper的选举机制及工作流程可以参考末尾的文章连接,在此不做赘述.


Zookeeper的安装

windows下安装比较简单,官网下载压缩包解压即可.这里介绍下linux下安装Zookeeper.

下载压缩包
[root@localhost home]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 
解压:

[root@localhost home]# tar -zxvf zookeeper-3.4.12.tar.gz 
解压之后进入conf目录修改配置文件
[root@localhost home]# cd zookeeper-3.4.12/conf
[root@localhost home]# cp zoo_sample.cfg zoo.cfg 
修改内容:
# The number of milliseconds of each tick  
tickTime=2000  
# The number of ticks that the initial  
# synchronization phase can take  
initLimit=10  
# The number of ticks that can pass between  
# sending a request and getting an acknowledgement  
syncLimit=5  
# the directory where the snapshot is stored.  
dataDir=/usr/zookeeper  
dataLogDir=/usr/zookeeper/log  
# the port at which the clients will connect  
clientPort=2181  

其中主要修改的是端口号和serverid.

然后就是启动客户端:

[root@localhost home]# cd /home/zookeeper-3.4.12/bin
[root@localhost home]# ./zkServer.sh start

Zookeeper集群安装

Zookeeper在linux和windows上安装大同小异,这里示例在win环境下安装Zookeeper集群.

在解压Zookeeper的安装包后,进入conf目录复制三份(只有客户端数量为2n+1个数时才能进行leader选举)配置文件


其中每个配置文件需修改的地方如下


除了3相同外其他需不一样,同时也要创建相应的目录.



最后需要在data的每个子目录中创建一个没有扩展名且名为myid的文件,文件内容与目录名保持一直


其他几个文件夹类似.

最后在bin中同样复制三个服务端启动程序


命名区分开就行.然后就以记事本打开修改编辑

在 set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain 这一行下面添加

set ZOOCFG=..\conf\zoo.cfg 

@echo off
REM Licensed to the Apache Software Foundation (ASF) under one or more
REM contributor license agreements.  See the NOTICE file distributed with
REM this work for additional information regarding copyright ownership.
REM The ASF licenses this file to You under the Apache License, Version 2.0
REM (the "License"); you may not use this file except in compliance with
REM the License.  You may obtain a copy of the License at
REM
REM     http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOOCFG=..\conf\zoo.cfg
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

设置的配置文件即为前面复制的三个配置文件名称zoo.cfg,zoo1.cfg,zoo2.cfg.

最后就是双击运行.应该Zookeeper的leader选举机制,在Zookeeper服务器少于三个时会报异常,可以不用管.

运行完所有的服务段脚本后.双击zkCli.cmd客户端,可以输入命令查看


--------------------------------------------------------------------------------------------------

以上即为Zookeeper的一些基础知识和伪集群的搭建,如有错误,欢迎之处,共同学习.

更多知识请参考文末链接.

参考文献:

更详细的介绍及应用建议参考:

https://blog.csdn.net/tswisdom/article/details/41522069

https://www.cnblogs.com/zlslch/p/7242381.html?utm_source=itdadao&utm_medium=referral

--------结尾语

             有志者、事竟成,破釜沉舟,百二秦关终属楚;
          苦心人、天不负,卧薪尝胆,三千越甲可吞吴。
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值