zookeeper 介绍与环境搭建
1、什么是 zookeeper?
zookeeper 是一个开放源码的分布式应用程序协调服务,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
zookeeper 不适合存储大量数据,通常存储一些配置信息,动态的监听服务器的变更并且反馈给服务器。
zookeeper 集群最少需要 3 个节点。官方推荐奇数个,偶数会影响选举的结果。
2、zookeeper 的特点
- 最终一致性:无论 client 端连接到哪一个 server,展示给他的都是同一个视图。
- 可靠性:具有简单、健壮、良好的性能。如果消息 m 被一台服务器接收,那么该消息将被所有服务器接收。
- 实时性:zookeeper 保证客户端在一个时间间隔范围内获取服务器的信息。网络延迟的原因,zookeeper 不能保证两个客户端同时获得服务端刚更新的数据。
- 原子性:更新只能成功或失败,没有中间状态。也就是所有事务请求的结果在整个集群中所有机器上的应用情况是一致的。即要么整个集群都应用了一个事务,要么都没有应用,不会出现一部分应用,一部分没有应用的情况。
- 顺序一致性:从一个客户端发起的应用请求,最终将会严格的按照其发起的顺序应用到 zookeeper 中。
3、zookeeper 的设计目标
- 简单的数据结构:zookeeper 就是按照属性结构来进行互相协调。
- 可以构建集群。
- 顺序访问:对于每个客户端的每一个请求,都会分配一个全局唯一的递增编号。这个编号决定了访问顺序。
- 高性能:zookeeper 的数据全量存储在内存中,并且直接服务于所有的非事务请求,尤其是在读操作为主的场景下非常突出。
4、zookeeper 的工作原理
在 zookeeper 的集群中,各个节点共有 3 种角色、4 种状态
角色:Leader、Follower、Observer。Follower 和 Observer 又统称为 Learner
Leader:负责服务器 writer 类型请求。
Follower:负责客户端的 reader 类型请求。参与 leader 选举。
Observer:特殊的 Follower。可以接受客户端的 reader 请求,但不参与选举。
zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 ZAB 协议(Zookeeper Atomic Broadcast p'rotocol)。
ZAB 协议有两种模式:恢复模式和广播模式。当服务启动或 leader 崩溃后就进入恢复模式。当 leader 被选举出来,且大多数 server 完成了和 leader 的状态同步后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。
每个 server 在工作过程中有 4 种工作状态:
LOOKING:未选出 leader,正在搜寻
LEADING:当前 server 为选出的 Leader
FOLLOWING:leader 已被选出,当前 server 与之同步
OBSERVING:与 Follwer 基本一致,但不参加选举和投票,仅接受选举和投票的结果。
5、zookeeper 的集群节点
- zookeeper 节点部署越多,可靠性就越高。建议部署奇数个节点,zookeeper 是整个集群宕机半数以上才会集群宕机的。
- 需要给每个 zookeeper 1G 以上的内存。如果可能的话最好有独立的磁盘,这样可以确保 zookeeper 的高性能。如果集群负载很重,不要把 zookeeper 和 regionserver 运行在同一台机器上。
6、zookeeper 的集群安装与配置
1)需要先安装好 jdk,这里就不写了。
2)下载 zookeeper http://zookeeper.apache.org/
3)解压并复制
tar -xvf zookeeper-3.4.10.tar -C /usr/local/bin/zk #解压到 /usr/local/bin/zk 目录下 cd /usr/local/bin/zk mv zookeeper-3.4.10 zk1 #重命名 cp -p zk1/ zk2 #复制 cp -p zk1/ zk3 #复制
4)修改配置文件
cd zk1/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg
# 修改 dataDir 为 zk1 下 data 的目录
dataDir=/usr/local/bin/zk/zk1/data
# 修改 clientPort 为 2181
clientPort=2181
# 并写入如下内容:
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2899:3899
server.3=127.0.0.1:2877:3877
按照以上步骤,修改 zk2、zk3 的配置文件。
配置参数说明:
tickTime:zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔。单位是毫秒。 initLimit: zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数。(这里的客户端是指 leader 的 follower 服务器) 如果 initLimit 设置为 10,当超过 10 个心跳的时间长度后,如果 zookeeper 服务器没收到客户端返回的信息,那么连接失败。 syncLimit:标识 leader 与 follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度。syncLimit 为 5,那么最长是 5*tickTime dataDir:保存数据的目录,默认情况下日志文件也保存在这个目录里。 clientPort:zookeeper 服务端口号 server.A = B:C:D : A 是一个数字,表示第几个 zookeeper 服务;B 是服务 IP 地址,C 是端口号,用来做数据同步,进行集群间的信息交换; D 也是一个端口号,用来做选举,主要是在 leader 挂掉后专门用来做选举 leader 的端口。
5)创建 myid 文件
需要在zk1、zk2、zk3 的 dataDir 目录下创建 myid 文件,并在文件中写入 server.A = B:C:D 中的 A
echo 1 > /usr/local/bin/zk/zk1/data/myid echo 2 > /usr/local/bin/zk/zk2/data/myid echo 3 > /usr/local/bin/zk/zk3/data/myid
配置完成。
6)启动各个节点
cd /usr/local/bin/zk zk1/bin/zkServer.sh start zk2/bin/zkServer.sh start zk3/bin/zkServer.sh start
7)查看各个节点的状态
cd /usr/local/bin/zk zk1/bin/zkServer.sh status zk2/bin/zkServer.sh status zk3/bin/zkServer.sh status
8) 集群连接