标签:ZooKeeper 单点 部署 zookeeper Zookeeper 服务器 leader 客户端
zookeeper 部署
1.1 zookeeper 简介
1.1.1 zookeeper是什么
ZooKeeper 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统;它提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下
1.1.2 ZooKeeper设计目标
ZooKeeper允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似。 名称空间由ZooKeeper中的数据寄存器组成 - 称为znode,这些类似于文件和目录。 与为存储设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟。
Zookeeper层次结构命名空间示意图如下:
通过这种树图结构的数据模型,很容易的查找到具体的某一个服务
1.1.3 ZooKeeper主要特点
- 最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能。
- 可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受。
- 实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
- 等待无关(wait-free):慢的或者失效的 client 不干预快速的client的请求。
- 原子性:更新只能成功或者失败,没有中间其它状态。
- 顺序性:对于所有Server,同一消息发布顺序一致。123456123456
2.1 ZooKeeper基本原理
2.1.1 zookeeper系统架构
-
ZooKeeper分为服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端连接)。
-
客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 ZooKeeper服务器。客户端第一次连接到 ZooKeeper服务时,接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。
-
上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集群(或者是由伪集群组成);
-
组成ZooKeeper服务的服务器必须彼此了解。 它们维护一个内存中的状态图像,以及持久存储中的事务日志和快照, 只要大多数服务器可用,ZooKeeper服务就可用;
-
ZooKeeper 启动时,将从实例中选举一个 leader,Leader 负责处理数据更新等操作,一个更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。每个Server 在内存中存储了一份数据。
-
Zookeeper是可以集群复制的,集群间通过Zab协议(Zookeeper Atomic Broadcast)来保持数据的一致性;
-
Zab协议包含两个阶段:leader election阶段和Atomic Brodcast阶段。
-
- 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。
-
- 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
-
3.当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast的过程。
-
4.Atomic Brodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。
2.1.2 Zookeeper 角色
启动 Zookeeper 服务器集群环境后,多个 Zookeeper 服务器在工作前会选举出一个 Leader。选举出 leader 前,所有 server 不区分角色,都需要平等参与投票( obServer 除外,不参与投票);
选主过程完成后,存在以下几种角色:
2.1.3 zookeeper读写数据流
ZooKeeper 的写数据流程主要分为以下几步:
- 比如 Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
- 如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2, 各个Server写成功后就会通知Leader。
- 当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。
- Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。
2.1.4 ZooKeeper 组件
ZooKeeper组件显示了ZooKeeper服务的高级组件。 除了请求处理器,组成ZooKeeper服务的每个服务器复制其自己的每个组件的副本。
Replicated Database是包含整个数据树的内存数据库。 更新操作会记录到磁盘里以进行可恢复性,并且写操作将在放到内存数据库之前序列化到磁盘。
每个ZooKeeper服务器服务客户端。 客户端连接到一个服务器以提交irequest。 读取请求从每个服务器数据库的本地副本服务。 更改服务状态(写入请求)的请求由协议进行处理。
作为协议协议的一部分,来自客户端的所有写请求被转发到单个服务器,称为leader。 其余的ZooKeeper服务器(称为followers)从领导者接收消息提议并同意消息传递。 消息层负责在失败时替换领导者,并与leader同步followers。
3.1 安装zookeeper
3.1.1 模式选择
zookeeper 的安装模式有三种:
- 单机模式( stand-alone):单机单 server;
- 集群模式:多机多 server,形成集群;
- 伪集群模式:单机多个 server,形成伪集群;
这里只有单点模式,集群模式会再起一个文档详细说明
3.1.2 安装包下载
下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz --no-check-certificate
3.1.3 安装部署
3.1.3.1 解压
tar zxvf apache-zookeeper-3.5.9-bin.tar.gz
mv apache-zookeeper-3.5.9-bin /opt/zookeeper
cd /opt/zookeeper/conf;cp zoo_sample.cfg zoo.cfg
3.1.3.2 修改配置文件
vim /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data/zookeeper
clientPort=2181
3.1.3.3 启动zookeeper
- 启动server
cd /opt/zookeeper/bin/
sh zkServer.sh start
sh zkServer.sh status #查看状态
- 打开客户端
sh zkCli.sh
- 查看根节点下的子节点(Znode维系在内存和磁盘中)
ls /
- 根节点下创建子节点(必须存储配置信息或节点描述)
create /log 'log servers'
- 子节点下创建子节点(必须存储配置信息或节点描述)
create /log/log01 ''
- 删除节点(要求没有子节点)
delete /music
- 查看节点详情
get /log
- 修改数据
set /log 'info'
标签:ZooKeeper,单点,部署,zookeeper,Zookeeper,服务器,leader,客户端 来源: https://www.cnblogs.com/liwenchao1995/p/16113353.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。