Apache ZooKeeper 简介
概念:ZooKeeper是一个分布式服务框架,用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
特性:
- zookeeper 等于 文件系统 和 监听通知机制的结合
- 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端
Apache ZooKeeper 历史及由来
问题驱动一:如果我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
问题驱动二:在电商架构中,早期是单体架构,可以很快的解决交互问题和产品初期的迭代。但是随着架构的发展,后端无法支撑大流量。一开始的解决办法是增加服务器等垂直解决方法,但是这样的效率太低并且成本太高。因此开发者开始考虑水平伸缩来提高整体的性能。首先是对产品的拆分:按照类型拆分成不同的模块,那么模块之间的交互就需要实现远程调用,比如webservice。这样其实就简单的形成了一个分布式架构。服务越来越多,我们就拆分的越来越细,随着流量不断提升,后端规模越来越大。举个例子:用户调用订单服务,它是通过http协议来调用,那么首先订单服务那必须给用户一个地址。如果说订单系统是一个大的集群,那么可能我们就需要维护多个这样的地址。那么应该如何解决大规模地址管理?集群里的地址如何去转发?如果其中一个节点down机了怎么办,怎么去管理服务动态上下线感知?
解决思路:我们可以考虑设置一个中间件,它的存在可以让我们的服务发布的时候注册上去,充当一个电话本,记住你所有的地址,并且及时了解你是不是断开。用户服务只需要拿到中间件的地址,就可以获得对应的相关的调用的目标服务的信息,拿到这个信息,根据负载均衡算法,就可以做一个转发。
Zookeeper是一个什么东西呢?它是一个文件存储类似的树型结构,entry是key-value。每个子节点由父节点管理,子节点是父节点详细的分类。比如说,对于订单服务系统,它的子节点存放着各种地址。Zookeeper适不适合作为一个注册中心?很多人说不是很合适,但是目前大部分企业仍然用它来做注册中心的功能。Zookeeper的学术名称为分布式协调服务,它的本意是解决分布式锁的,比如说几个服务访问共享资源,就会出现资源竞争的问题,这时候就会需要一个协调者来解决这个问题,Zookeeper就是用来解决这个问题的,可以看作一个交警。这样一来共享资源就变成了一个单点访问资源,你先来我中间件里来,我再判断让不让你去访问。当然为了保持单点的特点,Zookeeper一般是以集群出现,在满足单点的功能,提高其可用性。集群的出现带来的问题众所周知,那就是数据同步。Zookeeper内部角色分为Leader、Follower、observer,数据提交方式基于二阶提交,写数据写在follower上,其他的follower去同步数据。请求命令放在leader上,然后让其他的节点知道,这里满足一个CAP原则。
Apache ZooKeeper 最新版
Apache ZooKeeper 3.6.1 已发布,这是 3.6 分支的第二个版本,也是一个 bugfix 版本,修复了针对 ZooKeeper 3.5 构建的应用程序有关的一些兼容性问题。从 3.5.7 升级到 3.6.1 像往常一样执行即可,无需特别的附加升级程序。只要不使用 3.5 中不存在的新 API,ZooKeeper 3.6.1 客户端与 3.5 服务器兼容。
新特性
- ZOOKEEPER-3689 - zkCli/ZooKeeperMain 依赖系统属性来进行 TLS 配置
- ZOOKEEPER-3712 - 为 NIOServerCnxn 添加 setKeepAlive 支持
改进
- ZOOKEEPER-3685 - 将 JDK Arrays Equals 用于 Jute 编译器
- ZOOKEEPER-3686 - 将 JDK Arrays hashCode 用于 Jute 编译器
- ZOOKEEPER-3708 - 在 Learner 中,将日志代码移动至 Logging Guard
- ZOOKEEPER-3741 - 修复在 Fedora8 上构建 ZooKeeper 3.5 C 客户端出现的问题
- ZOOKEEPER-3755 - 使用 maven 来创建 fatjar
- ZOOKEEPER-3756 - 修复成员不能成功 rejoin quorum 的问题
- ZOOKEEPER-3785 - 支持使用 JDK14 进行构建源码
详情查看 https://zookeeper.apache.org/doc/r3.6.1/releasenotes.html
下载地址 https://zookeeper.apache.org/releases.html#download