博客
关于我
Zookeeper简介和安装使用
阅读量:402 次
发布时间:2019-03-06

本文共 5551 字,大约阅读时间需要 18 分钟。

为什么用Zookeeper

官方地址:

redis不能保证实时一致性和强一致性(最终一致性)

ZooKeeper实施对高性能,高可用性,严格排序的访问给予了高度重视

  • ZooKeeper的性能方面意味着它可以在大型的分布式系统中使用
  • 可靠性方面使它不会成为单点故障
  • 严格的排序意味着可以在客户端上实现复杂的同步原语

 

 

组成ZooKeeper服务的服务器都必须彼此了解

  • 它们维护内存中的状态图像,以及持久存储中的事务日志和快照
  • 只要大多数服务器可用,ZooKeeper服务将可用

客户端连接到单个ZooKeeper服务器

  • 客户端维护一个TCP连接,通过该连接发送请求,获取响应,获取监视事件并发送心跳
  • 如果与服务器的TCP连接断开,则客户端将连接到其他服务器

ZooKeeper已订购

  • ZooKeeper用一个反映所有ZooKeeper事务顺序的数字标记每个更新
  • 后续操作可以使用该命令来实现更高级别的抽象,例如同步原语

ZooKeeper速度很快

  • 在“读取为主”的工作负载中,它特别快
  • ZooKeeper应用程序可在数千台计算机上运行,​
  • 并且在读取比写入更常见的情况下以10:1的比率运行时效果最佳

节点和短暂节点

  • 与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以具有与其关联的数据以及子节点
  • 就像拥有一个文件系统一样,该文件系统也允许文件成为目录
  • ZooKeeper旨在存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内

我们使用术语znode来明确表示在谈论ZooKeeper数据节点

Znodes维护一个统计信息结构,其中包括用于数据更改,ACL更改和时间戳的版本号,以允许进行缓存验证和协调更新

  • znode的数据每次更改时,版本号都会增加
  • 例如,每当客户端检索数据时,它也接收数据的版本
  • 原子地读取和写入存储在名称空间中每个znode上的数据
  • 读取将获取与znode关联的所有数据字节,而写入将替换所有数据
  • 每个节点都有一个访问控制列表(ACL),用于限制谁可以执行操作

ZooKeeper短暂节点

  • 只要创建znode的会话处于活动状态,这些znode就存在
  • 会话结束时,将删除znode

有条件的更新和监视

  • ZooKeeper支持watches的概念
  • 客户端可以在znode上设置watches
  • znode更改时,将触发并删除监视
  • 触发监视后,客户端会收到一个数据包,说明znode已更改
  • 如果客户端和其中一个ZooKeeper服务器之间的连接断开,则客户端将收到本地通知

ZooKeeper非常快速且非常简单

同时提供了一组保证

  • 顺序一致性,来自客户端的更新将按照发送的顺序应用
  • 原子性,更新成功或失败,没有部分结果
  • 单个系统映像,无论客户端连接到哪个服务器,客户端都将看到相同的服务视图
  • 即使客户端故障转移到具有相同会话的其他服务器,客户端也永远不会看到系统的较旧视图
  • 可靠性,应用更新后,此更新将一直持续到客户端覆盖更新为止
  • 及时性,保证系统的客户视图在特定时间内是最新的

简单的API

  • create : creates a node at a location in the tree
  • delete : deletes a node
  • exists : tests if a node exists at a location
  • get data : reads the data from a node
  • set data : writes data to a node
  • get children : retrieves a list of children of a node
  • sync : waits for data to be propagated

Zookeeper执行过程

复制的数据库是包含整个数据树的内存数据库

  • 将更新记录到磁盘以确保可恢复性,并且将写入操作序列化到磁盘之后再将其应用于内存数据库

每个ZooKeeper服务器都为客户端提供服务

  • 客户端仅连接到一台服务器即可提交请求
  • 读取请求从每个服务器数据库的本地副本提供服务
  • 更改服务状态的请求(写请求)由协议协议处理
  • 作为协议协议的一部分,来自客户端的所有写请求都转发到称为领导者的单个服务器
  • 其余的ZooKeeper服务器(称为跟随者)从领导者接收消息建议并同意消息传递
  • 消息传递层负责替换出现故障的领导者,并将跟随者与领导者同步

ZooKeeper使用自定义的原子消息传递协议

  • 由于消息传递层是原子层,因此ZooKeeper可以保证本地副本永远不会发散
  • 当领导者收到写请求时,它将计算要应用写操作时系统的状态,并将其转换为捕获该新状态的事务

下载稳定版

官方地址:

选择合适的版本,我的选择

wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz

配置zookeeper

官方地址:

配置文件,conf/zoo.cfg

# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/root/apache-zookeeper-3.6.2-bin/data# the port at which the clients will connectclientPort=2181# the maximum number of client connections.# increase this if you need to handle more clients#maxClientCnxns=60## Be sure to read the maintenance section of the # administrator guide before turning on autopurge.## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance## The number of snapshots to retain in dataDir#autopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge feature#autopurge.purgeInterval=1## Metrics Providers## https://prometheus.io Metrics Exporter#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider#metricsProvider.httpPort=7000#metricsProvider.exportJvmInfo=true

tickTime

  • CS通信心跳时间
  • 心跳间隔,单位是毫秒,系统默认是2000毫秒,也就是间隔两秒心跳一次

tickTime的意义

  • 客户端与服务器或者服务器与服务器之间维持心跳
  • 通过心跳不仅能够用来监听机器的工作状态
  • 还可以通过心跳来控制Flower跟Leader的通信时间
  • 默认情况下FL的会话时常是心跳间隔的两倍。

initLimit

  • 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)

syncLimit

  • 集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数  

dataDir

  • 该属性对应的目录是用来存放myid信息跟一些版本,日志,跟服务器唯一的ID信息等
  • the directory where the snapshot is stored. do not use /tmp for storage, /tmp here is just example sakes.

不要使用/tmp来做存储快照的目录,/tmp这只是一个案例

  • 在集群zookeeper服务在启动的时候回去读取zoo.cfg这个文件
  • 从这个文件中找到这个属性然后获取它的值也就是 dataDir 的路径
  • 它会从这个路径下面读取 myid 这个文件
  • 从这个文件中获取要启动的当前服务器的地址,当它找不到这个地址的时候就会抛出异常,我们可以去查看状态

配置结束后启动

cd bin./zkServer.sh start

集群信息的配置

格式:service.N = YYY:A:B

  • N:代表服务器编号(也就是myid里面的值)
  • YYY:服务器地址
  • A:表示 Flower 跟 Leader的通信端口,Leader接受write请求(默认2888)
  • B:表示 选举端口,Leader挂掉以后,使用该端口执行选举操作(默认是3888)
server.1=node01:2888:3888server.2=node02:2888:3888server.3=node03:2888:3888

server的myid配置

在每个结点server指定的dataDir目录下创建myid文件并写入对应的服务器编号

第一个结点,填入1,第二个结点,填入2,依此类推

clientPort

  • 客户端连接的接口,客户端连接zookeeper服务器的端口
  • zookeeper会监听这个端口,接收客户端的请求访问
  • 这个端口默认是2181

导入环境变量

打开文件/etc/profile,填入自己的zooke安装目录

export ZOOKEEPER_HOME=/root/apache-zookeeper-3.6.2-binexport PATH=$PATH:$ZOOKEEPER_HOME/bin

使能

source /etc/profile

使用客户端管理节点

创建节点并添加数据

 

获取节点数据

 

create -e 创建临时节点

create -s 持久序列

通过help查看指令帮助

[zk: localhost:2181(CONNECTED) 3] helpZooKeeper -server host:port -client-configuration properties-file cmd args    addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE    addauth scheme auth    close     config [-c] [-w] [-s]    connect host:port    create [-s] [-e] [-c] [-t ttl] path [data] [acl]    delete [-v version] path    deleteall path [-b batch size]    delquota [-n|-b] path    get [-s] [-w] path    getAcl [-s] path    getAllChildrenNumber path    getEphemerals path    history     listquota path    ls [-s] [-w] [-R] path    printwatches on|off    quit     reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]    redo cmdno    removewatches path [-c|-d|-a] [-l]    set [-s] [-v version] path data    setAcl [-s] [-v version] [-R] path acl    setquota -n|-b val path    stat [-w] path    sync path    version

分布式ID,防止重命名

通过添加版本号,维护同名节点,防止重命名

转载地址:http://jojkz.baihongyu.com/

你可能感兴趣的文章
开始CN的生活
查看>>
惊闻NBC在奥运后放弃使用Silverlight
查看>>
IE下尚未实现错误的原因
查看>>
创建自己的Docker基础镜像
查看>>
HTTP 协议图解
查看>>
Python 简明教程 --- 20,Python 类中的属性与方法
查看>>
Python 简明教程 --- 21,Python 继承与多态
查看>>
KNN 算法-理论篇-如何给电影进行分类
查看>>
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
查看>>
CODING 敏捷实战系列课第三讲:可视化业务分析
查看>>
使用 CODING DevOps 全自动部署 Hexo 到 K8S 集群
查看>>
工作动态尽在掌握 - 使用 CODING 度量团队效能
查看>>
CODING DevOps 深度解析系列第二课报名倒计时!
查看>>
CODING DevOps 线下沙龙回顾二:SDK 测试最佳实践
查看>>
数据结构第八节(图(下))
查看>>
基础篇:异步编程不会?我教你啊!CompletableFuture
查看>>
基于Mustache实现sql拼接
查看>>
POJ 2260 Error Correction 模拟 贪心 简单题
查看>>
CSUOJ Water Drinking
查看>>
Spring MVC+javamail实现邮件发送
查看>>