ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

数据结构

ZooKeeper 提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称 key 由斜线 / 分割的一系列路径元素,ZooKeeper 名称空间中的每个节点都是由一个路径标识。

理论基础

CAP 理论

CAP 指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
  • 可用性:每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。
  • 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

    BASE 理论

    BASE 是 Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。
  • 基本可用:在分布式系统出现故障,允许损失部分可用性(服务降级、页面降级)。
  • 软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。这里的中间状态是指不同的 data replication(数据备份节点)之间的数据更新可以出现延时的最终一致性。
  • 最终一致性:data replications 经过一段时间达到一致性。

BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
image.png
需要先安装好JDK

解压安装

1
2
3
4
5
cd /app/software
#解压并编译安装
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /app/service
mv /app/service/apache-zookeeper-3.6.3-bin /app/service/zookeeper
mkdir -pv /app/data/zookeeper

配置文件

1
2
3
#复制配置文件
cp /app/service/zookeeper/conf/zoo_sample.cfg /app/service/zookeeper/conf/zoo.cfg
vi /app/service/zookeeper/conf/zoo.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dataDir=/app/data/zookeeper
#审核日志默关闭
#INFO [main:ZKAuditProvider@42] - ZooKeeper audit is disabled.
audit.enable=true
#AdminServer 默认使用 8080 端口,如果已经占用会报错
#ERROR [main:ServiceUtils@42] - Exiting JVM with code 4
#禁用 AdminServer
admin.enableServer=false
#更换 AdminServer 端口
admin.sererProt=18080

#集群需要
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

集群部署

通过 scp 命令复制 /app/service/zookeeper 到其他需要部署 ZooKeeper 的服务器上

1
scp -r /app/service/zookeeper root@xxx.xxx.xxx.xxx:/app/service

1
2
3
echo 1 > /app/data/zookeeper/myid
echo 2 > /app/data/zookeeper/myid
echo 3 > /app/data/zookeeper/myid

然后分别启动

相关命令

1
2
3
4
5
6
7
8
#启动 ZooKeeper
/app/service/zookeeper/bin/zkServer.sh start
#关闭 ZooKeeper
/app/service/zookeeper/bin/zkServer.sh stop
#查看 ZooKeeper 状态
/app/service/zookeeper/bin/zkServer.sh status
#进入命令模式
/app/service/zookeeper/bin/zkCli.sh

No snapshot found, but there are log entries. Something is broken!