运维开发网

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

运维开发网 https://www.qedev.com 2022-05-28 16:08 出处:网络
这篇文章主要为大家介绍了ZooKeeper分布式协调服务核心概念及安装配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

这篇文章主要为大家介绍了ZooKeeper分布式协调服务核心概念及安装配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


一、ZooKeeper 简介

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

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

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

统一的系统映像:即无论客户端连接到哪个服务器,都可以看到相同的服务视图(即无状态)

可靠性:一旦执行了写操作,这种状态将持续到其他客户机的修改生效。

实时性:一旦事务成功应用,ZooKeeper可以保证客户端在事务发生变化后,可以立即读取最新状态的数据。


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

1)简单数据模型:

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

然而,与常见的文件系统不同,ZooKeeper将全部数据存储在内存中,以实现高吞吐量并减少访问延迟。

2)可配置集群:

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


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

3)顺序存取:

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

4)高性能和高可用性

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


2.核心概念

群集角色:

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


1)Session 会话

当客户端通过TCP长连接连接到ZooKeeper服务器时,会话开始建立连接,并通过tickTime(心跳检测)机制保持有效的会话状态。通过这个连接,客户端可以发送请求和接收响应,还可以接收观察器事件的通知。

此外,当由于网络故障或客户端主动断开连接导致连接断开时,只要在会话超时内重新建立连接,它们之间创建的会话仍然有效。(这取决于tickTime配置)


2)数据节点

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

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

临时节点:一旦创建该节点的客户端的会话失败,该客户端创建的所有临时节点都将被删除。


3)Watcher

ZooKeeper中一个常用的功能是Watcher(事件监听器),允许用户注册监听指定节点上的有趣事件。当事件发生时,监听器将被触发,并将事件推送到客户端。这种机制是ZooKeeper分布式协调服务的一个重要特征。


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

命令创建可以创建,读取可以查看,写入可以写入,删除可以删除,管理员可以配置权限。


3.Zab 协议介绍

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

ZooKeeper主要依靠Zab协议实现分布式数据一致性;

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


二、ZooKeeper Cluster 安装

准备工作:

主机名操作系统IP 地址ZooKeeperCentOS 7.4192.168.1.1

安装JDK:下载地址(需要创建Oracle帐户)

[root@ZooKeeper ~]# lsanaconda-ks.cfg jdk-8u181-Linux-x64.tar.gz[root@ZooKeeper ~]# tar zxf jdk-8u181-Linux-x64.tar.gz [root@ZooKeeper ~]# lsanaconda-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 lt;lt;END gt;gt; /etc/profileexport JAVA_HOME=/usr/local/javaexport PATH=$PATH:$JAVA_HOME/binEND[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 ~]# lsanaconda-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 lt;lt;END gt;gt; /usr/local/zookeeper/conf/zoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/usr/local/zookeeper/dataclientPort=2181END

评论:

TickTime:客户端和服务器之间的通信会话限制(相当于健康检查,tickTime:客户端ms (1s = 1000ms))

InitLimit:领导者和追随者之间的初始通信限制。

同步限制:领导者和追随者之间同步通信的限制(当响应时间超过syncLimit * tickTime时,领导者将移除追随者)

DataDir:该目录用于存储内存数据库中存储的快照信息(如果没有配置dataLogDir参数,日志信息也将存储在该目录中)

client:Zookeeper监听的端口,用于客户端连接。

启动动物园管理员

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


连接到动物园管理员

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

连接成功后,系统会输出ZooKeeper的相关配置信息和相关环境,并在屏幕上输出欢迎使用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 mainimport ( "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 mainimport ( "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-2CentOS 7.4192.168.1.2ZooKeeper-3CentOS 7.4192.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 lt;lt;END gt;gt; /etc/profileexport JAVA_HOME=/usr/local/javaexport PATH=$PATH:$JAVA_HOME/binEND[root@ZooKeeper ~]# source /etc/profile[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start

3)配置集群集群(三台服务器上的操作相同)

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

4)创建myid文件

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

确保每台服务器的myid文件中的编号不同,并且与自己机器的zoo.cfg中的server.id=host:port:port的id值相同。

另外,id的范围是1到255。

5)重新启动动物园管理员服务

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

检查动物园管理员状态:


验证:


以上是ZooKeeper分布式协同服务设计的核心概念和安装配置的详细内容。更多ZooKeeper分布式协同服务的核心安装配置请关注搜源网其他相关文章!


0

精彩评论

暂无评论...
验证码 换一张
取 消