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

1.1 集中式的特点

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

1.2 集中式的痛点

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

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

1.3 从单体到SOA的转变

面向服务架构( service-oriented architecture, 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教程

初探分布式环境的指挥官ZooKeeper的更多相关文章

  1. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...

  2. ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作

    前言:马上要过年了,祝大家新年快乐!在过年回家前分享一篇关于Zookeeper的文章,我们都知道现在微服务盛行,大数据.分布式系统中经常会使用到Zookeeper,它是微服务.分布式系统中必不可少的分 ...

  3. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  4. ZooKeeper系列(5):管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...

  5. ZooKeeper管理分布式环境中的数据

    Reference: http://www.cnblogs.com/wuxl360/p/5817549.html 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  6. 分布式服务框架 Zookeeper — 管理分布式环境中的数据

    本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解. ...

  7. Zookeeper和分布式环境中的假死脑裂问题(转)

    Zookeeper和分布式环境中的假死脑裂问题 最近和同事聊天无意间发现他们的系统也存在脑裂的问题.想想当初在我们的系统中为了解决脑裂花了非常大的功夫,现在和大家一起讨论下脑裂,假死等等这些问题和解决 ...

  8. 搞懂分布式技术3:初探分布式协调服务zookeeper

    搞懂分布式技术3:初探分布式协调服务zookeeper 1.Zookeepr是什么 Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅,负载均衡, ...

  9. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

随机推荐

  1. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  2. python 参数定义库argparse

    python 参数定义库argparse 这一块的官方文档在这里 注意到这个库是因为argparse在IDE中和在ipython notebook中使用是有差异的,习惯了再IDE里面用,转到ipyth ...

  3. 2019杭电多校第三场hdu6609 Find the answer(线段树)

    Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...

  4. 1029 Median (25 分)

    1029 Median (25 分)   Given an increasing sequence S of N integers, the median is the number at the m ...

  5. 实用的CSS3-渐变背景色

    线性渐变背景色:     第一个参数为渐变方式,后两个参数为起始点位置和终止点位置,后两个参数为起始颜色和终止颜色,后面那个参数为背景区域padding表示包含padding的区域,content表示 ...

  6. Centos 7 技巧

    查看系统版本详细信息 lsb_release -a 更改邮件MTA alternatives --config mta

  7. webpack2诸类事宜

    写在最前:webpack的总结也是自己坑过,实践过但是也是针对性的使用,在加上webpack的背景,对于其‘原理’方面有很大的不正确的理解,有错误的地方,请尽情指出(乖巧~) 由于版本遇到的问题: 在 ...

  8. 如何发现 Redis 热点 Key ,解决方案有哪些?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:http://t.cn/EAEu4to 一.热点问题产生原因 热点问题产生的原因大致有以下两种: 1.1 用户消费的数 ...

  9. 为什么Netty这么火?与Mina相比有什么优势?

    Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服 ...

  10. 【HDUOJ】4280 Island Transport

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:有n个岛屿,m条无向路,每个路给出最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到 ...