ZooKeeper分布式协调服务设计核心概念及安装配置

目录
  • 一、ZooKeeper 简介
    • 1.ZooKeeper 设计目标
    • 2.核心概念
      • 1)Session 会话
      • 2)数据节点
      • 3)Watcher
      • 4)ACL
    • 3.Zab 协议介绍
  • 二、ZooKeeper Cluster 安装
    • 1.安装 ZooKeeper
    • 2.使用 Golang 连接 ZooKeeper 的 API 接口
    • 3.配置 ZooKeeper Cluster

一、ZooKeeper 简介

ZooKeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护。ZooKeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。 它具有以下特性:

顺序一致性: 来自客户端的更新操作将会按照顺序被应用;

原子性: 即要么全部更新成功,要么要不更新失败,没有部分的结果;

统一的系统镜像: 即不管客户端连接的是哪台服务器,都能看到同样的服务视图(也就是无状态的)

可靠性: 一旦写入操作被执行,那么这个状态将会被持久化,直到其它客户端的修改生效。

实时性: 一旦一个事务被成功应用,ZooKeeper 可以保证客户端立即读取到这个事务变更后的最新状态的数据。

1.ZooKeeper 设计目标

  • ZooKeeper 致力于为那些高吞吐的大型分布式系统提供一个高性能、高可用、且具有严格顺序访问控制能力的分布式协调服务。

1)简单的数据模型:

ZooKeeper 通过树形结构来存储数据,它由一系列被称为 ZNode 的数据节点组成,类似于常见的文件系统;

不过和常见的文件系统不同,ZooKeeper 将数据全量存储在内存中,以此来实现高吞吐,减少访问延迟。

2)可配置 Cluster:

为了保证高可用,最好是以集群形态部署 ZooKeeper,这样只要集群中大部分机器是可用的,那么 ZooKeeper 本身仍然可用。

上图中每一个 Server 代表一个安装 ZooKeeper 服务的服务器,组成 ZooKeeper 服务的服务器都会在内存中维护当前的服务器状态,并且每台服务器间都保持着通信。并通过 Zab 协议来保持数据的一致性。

3)顺序访问:

对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增 ID,这个 ID 决定了所有事务操作的先后顺序。

4)高性能高可用

ZooKeeper 将数据全量存储在内存中以保持高性能,并通过服务集群来实现高可用;由于 ZooKeeper 的所有更新和删除都是基于事务的,所以其在读多写少的应用场景中有着很高的性能表现。

2.核心概念

Cluster 角色:

角色 作用
Leader 提供读写服务,并维护集群状态(经过选举产生)
Follower 提供读写服务,并定期向 Leader 汇报自己的节点状态(同时也参加 过半写成功 的策略和 Leader 的选举)
OBServer 提供读写服务,并定期向 Leader 汇报自己的节点状态(因为不参加策略和选举,所以可以在不影响写性能的情况下提升集群的读性能)

1)Session 会话

当 Client 通过 TCP 长连接 连接到 ZooKeeper 服务器时,Session 便开始建立连接,并通过 tickTime(心跳检测)机制来保持有效的会话状态。通过这个连接,Client 可以发送请求并接收响应,同时也可以接收到 Watch 事件的通知。

另外,当由于网络故障或者 Client 主动断开等原因,导致连接断开,此时只要在会话超时时间之内重新建立连接,则之间创建的会话依然有效。(这个取决于 tickTime 配置)

2)数据节点

ZooKeeper 数据模型是由一系列基本数据单元 ZNode(数据节点)组成的节点树,其中根节点为 /(每个节点上都会保存自己的数据和节点信息);ZooKeeper 中的节点可以分为两大类:

持久节点: 节点一旦创建,除非被主动删除,否则一直存在。

临时节点: 一旦创建该节点的客户端会话(Session)失效,则所有该客户端创建的临时节点都会被删除。

3)Watcher

ZooKeeper 中一个常用的功能是 Watcher(事件监听器),它允许用户在指定节点上针对感兴趣的事件注册监听,当事件发生时,监听器会被触发,并将事件推送到客户端。该机制是 ZooKeeper 实现分布式协调服务的重要特性。

4)ACL

命令 作用
create 可以进行创建操作
read 可以进行查看操作
write 可以对创建的内容进行写入操作
delete 可以进行删除操作
admin 可以进行配置权限操作

命令作用create可以进行创建操作read可以进行查看操作write可以对创建的内容进行写入操作delete可以进行删除操作admin可以进行配置权限操作

3.Zab 协议介绍

Zab(ZooKeeper Atomic Broadcast 原子广播)协议是为分布式协调服务 ZooKeeper 专门设计的一种 支持崩溃恢复的原子广播协议;

在 ZooKeeper 中,主要依赖 Zab 协议来实现分布式数据一致性;

基于 Zab 协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本间的数据一致性。

二、ZooKeeper Cluster 安装

准备工作:

主机名 操作系统 IP 地址
ZooKeeper CentOS 7.4 192.168.1.1

安装 JDK:下载地址(需要创建 Oracle 账号)

[root@ZooKeeper ~]# ls
anaconda-ks.cfg  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# tar zxf jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# ls
anaconda-ks.cfg  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# mv jdk1.8.0_181 /usr/local/java
[root@ZooKeeper ~]# cat <<END >> /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
END
[root@ZooKeeper ~]# source /etc/profile
[root@ZooKeeper ~]# java -version

1.安装 ZooKeeper

[root@ZooKeeper ~]# wget http://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
[root@ZooKeeper ~]# ls
anaconda-ks.cfg  apache-zookeeper-3.6.3-bin.tar.gz  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# tar zxf apache-zookeeper-3.6.3-bin.tar.gz
[root@ZooKeeper ~]# mv apache-zookeeper-3.6.3-bin /usr/local/zookeeper
[root@ZooKeeper ~]# mkdir /usr/local/zookeeper/data
[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
END

注解:

tickTime:Client 和服务器间的通信会话限制(相当于健康检查,tickTime 的时间为 ms (1s = 1000ms))

initLimit:Leader 和 Follower 间初始通信限制。

syncLimit:Leader 和 Follower 间同步通信限制(当响应时间超于 syncLimit * tickTime 时,Leader 便会将 Follower 进行移除)

dataDir:此目录用于存放保存在内存数据库中的快照信息(当未配置 dataLogDir 参数时,日志信息也会存放到此目录)

clientPort:ZooKeeper 监听的端口,用于客户端连接使用。

启动 ZooKeeper

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start						# 启动
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh status						# 查看状态

连接到 ZooKeeper

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0]

当连接成功后,系统会输出 ZooKeeper 的相关配置信息和相关环境,并在屏幕上输出 Welcome to ZooKeeper! 等信息。

2.使用 Golang 连接 ZooKeeper 的 API 接口

安装 Golang:

[root@ZooKeeper ~]# git clone https://github.com/samuel/go-zookeeper.git
[root@ZooKeeper ~]# mv go-zookeeper /usr/local/go/src/
package main
import (
    "fmt"
    "time"
    "go-zookeeper/zk"
)
func main() {
    Hosts := []string{"192.168.1.1:2181"}
    conn, _, err := zk.Connect(Hosts,time.Second * 5)
    defer conn.Close()
    if err != nil {
        fmt.Println(err)
        return
    }
}

通过 Golang 实现对 ZooKeeper 的增删改查:

package main
import (
    "fmt"
    "time"
    "go-zookeeper/zk"
)
var (
    path = "/Zzz"
)
//增
func add(conn *zk.Conn) {
    var data = []byte("Hello ZooKeeper")
    // flags 的四种取值方式:
    // 0 (永久.除非手动删除)
    // zk.FlagEphemeral = 1 (短暂. session 断开则该节点也被删除)
    // zk.FlagSequence = 2 (会自动在节点后面添加序号)
    // 3 (Ephemeral 和 Sequence. 即短暂且自动添加序号)
	var flags int32 = 0
	// 获取访问控制权限
	acls := zk.WorldACL(zk.PermAll)
	create, err := conn.Create(path,data,flags,acls)
	if err != nil {
	    fmt.Printf("创建失败: %v\n",err)
		return
    }
	fmt.Printf("创建: %v 成功\n",create)
}
// 查
func get(conn *zk.Conn) {
    data, _, err := conn.Get(path)
	if err != nil {
	    fmt.Printf("查询 %s 失败,err: %v\n",path,err)
	    return
	}
	fmt.Printf("%s 的值为 %s\n",path,string(data))
}
// 删除与增加不同在于其函数中的 Version 参数. 其中 Version 使用 CAS 支持 (可以通过此种方式保证原子性)
// 改
func modify(conn *zk.Conn) {
    new_data := []byte("This is ZooKeeper")
    _, sate, _ := conn.Get(path)
    _, err := conn.Set(path,new_data,sate.Version)
    if err != nil {
	    fmt.Printf("数据修改失败: %v\n",err)
	    return
    }
    fmt.Println("数据修改成功")
}
// 删
func del(conn *zk.Conn) {
    _, sate, _ := conn.Get(path)
    err := conn.Delete(path,sate.Version)
    if err != nil {
        fmt.Printf("数据删除失败: %v\n",err)
	    return
    }
    fmt.Println("数据删除成功")
}
func main() {
    hosts := []string{"192.168.1.1:2181"}
    conn, _, err := zk.Connect(hosts,time.Second * 5)
    defer conn.Close()
    if err != nil {
        fmt.Println(err)
	    return
    }
    /* 增删改查 */
    add(conn)
    get(conn)
    modify(conn)
    get(conn)
    del(conn)
}

3.配置 ZooKeeper Cluster

在原来的基础上,在增加两台服务器:

主机名 操作系统 IP 地址
ZooKeeper-2 CentOS 7.4 192.168.1.2
ZooKeeper-3 CentOS 7.4 192.168.1.3

1)将 Java 和 ZooKeeper 传给新的服务器:

[root@ZooKeeper ~]# scp -r /usr/local/java root@192.168.1.2:/usr/local/
[root@ZooKeeper ~]# scp -r /usr/local/zookeeper root@192.168.1.2:/usr/local/

2)在新的服务器上启动 ZooKeeper:

[root@ZooKeeper ~]# cat <<END >> /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
END
[root@ZooKeeper ~]# source /etc/profile
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start

3)配置 Cluster 集群(三台服务器上操作一样)

[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfg
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2889:3889
server.3=192.168.1.3:2890:3890
END

4)创建 myid 文件

[root@ZooKeeper ~]# echo "1" > /usr/local/zookeeper/data/myid
[root@ZooKeeper-2 ~]# echo "2" > /usr/local/zookeeper/data/myid
[root@ZooKeeper-2 ~]# echo "3" > /usr/local/zookeeper/data/myid

需要确保每台服务器的 myid 文件中数字不同,并且和自己所在机器的 zoo.cfgserver.id=host:port:portid 值一样。

另外,id 的范围是 1 ~ 255

5)重启 ZooKeeper 服务

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh restart			# 三台服务器都要重启

查看 ZooKeeper 状态:

验证:

以上就是ZooKeeper分布式协调服务设计核心概念及安装配置的详细内容,更多关于ZooKeeper分布式协调服务核心安装配置的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java ZooKeeper分布式锁实现图解

    什么是分布式锁 1.在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 2.但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境(多台机器),跨JVM之间已经无法通过多线程的锁解决同步问题.那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题--这就是分布式锁.(多节点从分布式组件中获取锁) 例如以下实例: 各种抢票软件客户端通过zoo

  • 史上最便捷搭建Zookeeper服务器的方法(推荐)

    什么是 ZooKeeper ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 ZooKeeper 便捷的使用方式.卓越的性能和良好的稳定性,被广泛地应用于诸如 Hadoop.HBase.Kafka 和 Dubbo 等大型分布式系统中. Zookeeper 有三种运行模式:单机模式.伪集群模式和集群模式. 单机模式:这种模式一般适用于开发测试环境,一方面

  • 深入浅析ZooKeeper的工作原理

    本文讲述了ZooKeeper的原理,小编觉得挺不错,分享给大家供大家参考,具体如下: 前言 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知.集群管理.Master 选举.分布式锁和分布式队列等功能. 1.简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于

  • 基于Zookeeper实现分布式锁详解

    目录 1.什么是Zookeeper? 2.Zookeeper节点类型 3.Zookeeper环境搭建 4.Zookeeper基本使用 5.Zookeeper应用场景 6.Zookeeper分布式锁 7.公平式Zookeeper分布式锁 8.zookeeper和Redis锁对比? 1.什么是Zookeeper? Zookeeper是一个分布式的,开源的分布式应用程序协调服务,是Hadoop和hbase的重要组件. 引用官网的图例: 特征: zookeeper的数据机构是一种节点树的数据结构,zNo

  • ZooKeeper分布式协调服务设计核心概念及安装配置

    目录 一.ZooKeeper 简介 1.ZooKeeper 设计目标 2.核心概念 1)Session 会话 2)数据节点 3)Watcher 4)ACL 3.Zab 协议介绍 二.ZooKeeper Cluster 安装 1.安装 ZooKeeper 2.使用 Golang 连接 ZooKeeper 的 API 接口 3.配置 ZooKeeper Cluster 一.ZooKeeper 简介 ZooKeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护.ZooKeeper 可

  • Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    目录 一.环境说明 2.1 安装JDK 2.2 添加Hosts映射关系 2.3 集群之间SSH无密码登陆 三.Hadoop集群安装配置 3.1 修改hadoop配置 3.2 启动hadoop集群 四.ZooKeeper集群安装配置 4.1 修改配置文件zoo.cfg 4.2 新建并编辑myid文件 4.3 启动ZooKeeper集群 五.HBase集群安装配置 5.1 hbase-env.sh 5.2 hbase-site.xml 5.3 更改 regionservers 5.4 分发并同步安装

  • ZooKeeper入门教程一简介与核心概念

    目录 1.ZooKeeper介绍与核心概念 1.1 简介 1.2分布式系统面临的问题 1.通过网络进行信息共享 2.通过共享存储 1.3 ZooKeeper如何解决分布式系统面临的问题 1.4 zookeeper概念介绍 1.4.1 znode 1.4.2 观察与通知 1.4.3 版本 1.4.4 法定人数 1.4.5 会话 1.4.6 会话状态和生命周期 回顾总结 本章是后续学习的基石,只有充分理解了分布式系统的概念和面临的问题,以及ZooKeeper内部的概念,才能懂得ZooKeeper是如

  • Linux下ZooKeeper分布式集群安装教程

    ZooKeeper 就是动物园管理员的意思,它是用来管理 Hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员,Apache Hbase.Apache Solr.Dubbo 都用到了 ZooKeeper,其实就是一个集群管理工具,是集群的入口.ZooKeeper 是一个分布式的.开源的程序协调服务,是 Hadoop 项目下的一个子项目.ZooKeeper 主要应用场景包括集群管理(主从管理.负载均衡.高可用的管理).配置文件的集中管理.分布式锁.注册中心等.实际项目中,为了保证高可用,

  • shell脚本中一键部署zookeeper集群服务的方法

    目录 一键部署zookeeper集群服务 1. 编写脚本情况分析 2. 脚本代码部分 3. 实验测试部分 一键部署zookeeper集群服务 1. 编写脚本情况分析 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目. Zookeeper适合安装奇数台服务器. 脚本完成后将会产生:一个领导者(Leader) ,多个跟随者(Follower) 组成的集群. 此脚本默认的安装包为:apache-zookeeper-3.5.7-bin.tar.gz,如果使用其他版本,自

  • Ceph集群CephFS文件存储核心概念及部署使用详解

    目录 1.CephFS文件存储核心概念 1.1.CephFS文件存储简介 1.2.CephFS文件存储架构 1.3.CephFS文件系统的应用场景与特性 2.在Ceph集群中部署MDS组件 3.在Ceph集群中创建一个CephFS文件存储系统 3.1.为CephFS文件存储系统创建Pool资源池 3.2.创建CephFS文件系统 3.3.再次观察Ceph集群的状态 4.内核级别挂载CephFS文件系统 4.1.无需认证的方式挂载CephFS文件系统 4.2.使用认证方式挂载CephFS文件系统

  • 如何在.NET Core中为gRPC服务设计消息文件(Proto)

    如何在.NET Core中为gRPC服务设计消息 使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然后管理服务的演变时,需要注意几件事. 创建gRPC服务的核心是.proto文件,该文件以与语言无关的格式描述了该服务.使用.proto文件,Visual Studio可以为您的服务生成基类(您只需编写特定于业务的代码),或者可以生成用于可靠访问服务的客户端类. .proto文件必须符合Google的协议缓冲区规范(通常称为ProtoBuf).原始文件的内容使您可以指定

  • 分析ZooKeeper分布式锁的实现

    目录 一.分布式锁方案比较 二.ZooKeeper实现分布式锁 2.1.方案一 2.2.方案二 一.分布式锁方案比较 方案 实现思路 优点 缺点 利用 MySQL 的实现方案 利用数据库自身提供的锁机制实现,要求数据库支持行级锁 实现简单 性能差,无法适应高并发场景:容易出现死锁的情况:无法优雅的实现阻塞式锁 利用 Redis 的实现方案 使用 Setnx 和 lua 脚本机制实现,保证对缓存操作序列的原子性 性能好 实现相对复杂,有可能出现死锁:无法优雅的实现阻塞式锁 利用 ZooKeeper

  • webpack-dev-server核心概念案例详解

    webpack-dev-server 核心概念 Webpack 的 ContentBase vs publicPath vs output.path webpack-dev-server 会使用当前的路径作为请求的资源路径(所谓 当前的路径 就是运行 webpack-dev-server 这个命令的路径,如果对 webpack-dev-server 进行了包装,比如 wcf,那么当前路径指的就是运行 wcf命令的路径,一般是项目的根路径),但是读者可以通过指定 content-base 来修改这

  • Spring框架核心概念小结

    目录 1.Spring是什么? 2.Spring框架的优点是什么 3.什么是Spring Bean? Spring bean的不同作用域: 4.Spring IoC 容器 有两种不同类型的容器: ApplicationContext 容器: 5.@Autowired 1)基于构造器和setter的区别 2)context:annotation-config 和 context:component-scan 的区别 3)@Component.@Controller.@Repository & @S

随机推荐