1. what
- 大数据生态系统里的很多组件的命名都是某种动物或者昆虫,比如hadoop就是 🐘,hive就是🐝。zookeeper即动物园管理者,顾名思义就是管理大数据生态系统各组件的管理员
2. where
- zookeeper 是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。
- 应用场景有:维护配置信息、分布式锁服务、集群管理、生成分布式唯一ID
2.1 维护配置信息
- 以往通过配置文件保存配置信息,目前因为是分布式系统,为了保证各台服务器上配置数据的一致性,需要一种服务,能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每一台服务器上的数据一致性。
- zookeeper提供这一种服务,其使用Zab这种一致性协议来保证一致性。
- 现在有很多开源项目使用zookeeper来维护配置,比如在hbase中,客户端就是连接 一个zookeeper,获得必要的hbase集群的配置信息,然后才可以进一步操作。还有在开 源的消息队列kafka中,也使用zookeeper来维护broker的信息。在alibaba开源的soa框 架dubbo中也广泛的使用zookeeper管理一些配置来实现服务治理。
2.2 分布式锁服务
- 一个集群是一个分布式系统,多台服务器完成相同的服务,有时候需要协调彼此的进度,当某台机器在操作的时候,其他机器都不能操作。在单机的多线程中有锁,分布式的系统中也需要锁。
2.3 集群管理
- 集群中可能会出现因为软硬件故障、网络故障需要移除某些机器、添加某些机器的情况,zookeeper会将这些服务器加入/移除的情况通知给其他正常工作的服务器。以及及时对存储、计算等任务的分配做出调整。
- zookeeper还会对故障的服务器做出诊断并尝试修复。
2.4 生成分布式唯一ID
- 分库分表之后,没办法直接通过auto_increment实现每条记录产生唯一的ID。可以通过zookeeper在分布式环境下产生全局唯一ID。
- 做法是,每次要生成一个新的id,就创建一个持久顺序节点,创建操作返回的节点序号,即为新id。
3. zookeeper 设计目标
- zooKeeper致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访 问控制能力的分布式协调服务
3.1 高性能
- zooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,尤 其适用于以读为主的应用场景
3.2 高可用
- zooKeeper一般以集群的方式对外提供服务,一般3 ~ 5台机器就可以组成一个可用 的Zookeeper集群了,每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相 互保持着通信。只要集群中超过一半的机器都能够正常工作,那么整个集群就能够正常对外服 务
3.3 严格顺序访问
- 对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号, 这个编号反映了所有事务操作的先后顺序
4. 数据模型
- zookeeper 的数据结构可以被视为是树状结构,树中的各节点被称为znode,一个znode可以有多个子节点。
- zookeeper 结构上表现为树状,通过路径path来定位某个znode。比如/ns- 1/itcast/mysql/schema1/table1,此处ns-1、itcast、mysql、schema1、table1分别是 根节点、2级节点、3级节点以及4级节点;其中ns-1是itcast的父节点,itcast是ns-1的子 节点,itcast是mysql的父节点,mysql是itcast的子节点,以此类推。
4.1 znode
- 节点类型:分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
- 临时节点:该节点的生命周期依赖于创建它的会话。会话结束可以自动删除,也可以通过手动删除。虽然每个临时的Znode都会绑定到 一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节 点不允许拥有子节点。
- 持久化节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作 的时候,他们才能被删除
- znode包含多个部分
- znode的数据:即znode data
- 节点的子节点:children
- 节点的状态stat:用来描述当前节点的创建、修改记录等
- cZxid:数据节点创建时的事务 ID
- ctime:数据节点创建时的时间
- mZxid:数据节点最后一次更新时的事务 ID
- mtime:数据节点最后一次更新时的时间
- pZxid:数据节点的子节点最后一次被修改时的事务 ID
- cversion:子节点的更改次数
- dataVersion:节点数据的更改次数
- aclVersion:节点的 ACL 的更改次数(权限)
- ephemeralOwner:如果节点是临时节点,则表示创建该节点的会话的 SessionID;如果节点是持久节点,则该属性值为 0
- dataLength:数据内容的长度
- numChildren:数据节点当前的子节点个数
5. how
5.1 单机安装
- 首先,需要有jdk1.8环境,教程
- 下载zookeeper的包,3.4.10 所有版本下载链接
- 解压
// 解压 zookeeper tar -xzvf zookeeper-3.4.10.tar.gz - 修改配置文件。将配置文件的数据保存路径,改成自己创建的data目录的实际绝对路径。
cd zookeeper-3.4.10 # 进入目录 mkdir data # 创建一个保存数据的目录 cp conf/zoo_sample.cfg conf/zoo.cfg # 将配置文件的例子复制一份新的 vim conf/zoo.cfg # 修改配置文件// 配置文件内容 // 此路径用于存储zookeeper中数据的内存快照、及事物日志文件 dataDir=/home/zookeeper/zookeeper-3.4.10/data - 启动zookeeper 服务器。所有执行的脚本,都在bin目录里面。
cd bin // 启动zookeeper ./zkServer.sh start - 停止及查看状态
//停止: zkServer.sh stop //查看状态: zkServer.sh status - 启动zookeeper客户端。也是在bin目录里面。
./zkCli.sh ./zkCli.sh -server 192.168.233.133 # 启动相应ip地址的zookeeper的客户端