初探分布式环境的指挥官ZooKeeper

1. 从单机到集群,分布式环境中的挑战

1.1 集中式的特点

  • 部署结构简单
  • 协作相对简单,不存在分布式协作问题
  • 单点故障问题

1.2 集中式的痛点

随着业务的发展和演进,将所有业务集中实现在一个应用上的做法往往满足不了公司及业务发展的需要,单一的系统已经不足以承载大量的业务。 (尤其是互联网企业)
所有业务堆在一个单一的系统,其痛点:

  1. 业务模块边界不清,代码耦合严重,不利于维护;
  2. 一个大的应用工程不利于版本迭代开发和发布。

1.3 从单体到SOA的转变

面向服务架构( service-oriented architecture, SOA )
通过系统拆分实现SOA架构的价值,沉淀出一批稳定的后台服务,通过叠加复用又可以快速响应用户的前端需求。
从单体到SOA的转变

而面向服务体系架构能够落地的基础技术之一,就是分布式服务框架

1.4 分布式服务总体框架

  1. 服务拆分后的基本技术问题: 如何实现服务之间的通信?

    • RPC(RMI、HttpClinet等)
  2. 另一方面,如何实现服务治理?

    • 一般而言包括:服务自动发现、自动下线、服务注册中心、负载均衡等功能。

分布式服务总体框架

1.5 分布式应用概述

  • 分布式应用可以再给定时间(同时)在网络的多个系统上运行,通过协调它们以快速有效的完成特定任务。

  • 分布式应用正在运行的一组系统称为集群,集群中运行的每台机器称为节点。

  • 分布式应用有Server和Client两部分。Server是分布式的,有通用的接口,以便Client可以连接到集群中的任何服务器并获得相同的结果。

分布式应用的优点

  • 可靠性 单个或几个系统的故障不会使整个系统出现故障。
  • 可扩展性 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改。
  • 透明性 隐藏系统的复杂性,并将其显示为单个实体/应用程序。

分布式应用的挑战

  • 竞争条件 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
  • 死锁 两个或多个操作等待彼此无限期完成。
  • 数据一致性 数据的部分失败。
  • 网络的不稳定性

2. ZK基本概念及核心原理

2.1 ZK自我介绍

姓 名: Zookeeper “动物”管理员
履 历: 基于Google Chubby开源实现,由雅虎创建; 2010年正式成为Apache的顶级项目; 已被Hadoop、Hbase、 kafka等越来越多项目作为核心基础组件。
宗 旨: 全心全意为分布式应用提供高效且可靠的协调服务。
特 点: 开源、免费。
诞生初衷: 希望作为一个通用的无单点问题的分布式协调框架,以便让程序猿将精力集中在业务逻辑处理上。
核心特性 : 树形结构数据库 + znode watch

2.2 ZK基本概念

2.2.1. 客户端-服务器架构

客户端-服务器架构

2.2.2 数据模型

分布式应用中的各个进程可以通过ZooKeeper的命名空间(Namespace)来进行协调,这个命名空间是共享的、具有层次结构的,更重要的是它的结构足够简单。每个命名空间被称为Znode。每个znode由3部分组成:

  1. Stat: 版本、权限等信息.
  2. data: 关联的数据.
  3. Children: znode下的子节点.

znode的分类

  • 持久节点: 客户端断开后仍存在,默认。
  • 临时节点: 生命周期和客户端会话绑定。
  • 顺序节点: 可以是持久或临时节点。/app1/s0000000001 起到锁、同步的作用。
2.2.3 Session(会话)

会话中的请求按FIFO顺序执行。
客户端连接到服务器,将建立会话并向客户端分配会话ID 。
客户端以特定的时间间隔发送心跳以保持会话有效。
服务器在SESSION_TIMEOUT时间内都没有接收到客户端心跳,会话失效,临时数据与注册的订阅者都会被移除。

2.2.4 zk工作流

2.2.5 watch机制

监视是一种简单的机制,客户端可以在读取特定znode时设置Watches。
服务器会向客户端发送znode变更(Znode的增、删、改)通知。
watch分类:

  • data  watches:getData和exists负责设置data watch
  • child watches:getChildren负责设置孩子child watch

备注:

  1. Watches通知是一次性的,一旦触发后即失效,必须重复注册。
  2. 客户端会话失效,这个会话中创建的Watcher都会被移除。

3. ZK应用举例

3.1 应用举例

分布式应用程序可以基于它实现:

  • 数据发布/订阅
  • 负载均衡
  • 命名服务
  • 分布式协调/通知
  • 集群管理
  • 分布式锁和分布式队列等
    例,
    Hadoop:依靠ZooKeeper进行配置管理和协调。
    Hbase: 通过集中式配置管理分布式互斥机制来帮助主机和区域服务器跟踪分布式数据的状态。

3.2 项目中的应用

项目应用场景

Zookeeper作为注册中心
对内网四大服务(sso、web、push和collect)相互通信的RPC接口进行管理。

  1. 系统启动时RPC接口在ZK中注册(create node)
  2. 客户端从ZK获取对应的RPC接口。进行调用。

githup上有个类似的demo参考:https://github.com/luxiaoxun/NettyRpc
交互流程示意图:

4 小结

重点回顾:ZK数据模型、watch机制。
能帮助我们实现:分布式一致性、服务治理功能等。

参考资料
《从Paxos到Zookeeper分布式一致性原理与实践》
《分布式服务框架原理与实践》
w3cschool zookeeper教程

原文地址:https://www.cnblogs.com/eaglediao/p/8426105.html