热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Zookeeper简介(02)解决的问题

我们通过下面的几点,更加深入的介绍一下zookeeper。zookeeper改变了什么使用zookeeper是否意味着需要以全新的方式进行应用程序开发?并不是,zookeeper实

我们通过下面的几点,更加深入的介绍一下zookeeper。

zookeeper改变了什么

使用zookeeper是否意味着需要以全新的方式进行应用程序开发?并不是,zookeeper实际上已经简化了开发流程,提供了更加敏捷健壮的方案。

例如分布式系统中分布式锁的实现,zookeeper之前的其它一些系统中,采用分布式锁管理器或者分布式数据库来实现,实际上,zookeeper从这些系统中借鉴了很多概念。但是,zookeeper的设计更专注于任务协作,并不提供任何锁的接口或者通用存储数据接口。同时zookeeper并没有给开发人员强加任何特殊的同步原语,因此使用起来非常灵活。

虽然我们也可以不适用zookeeper来构建分布式系统,但是使用zookeeper可以让开发人员更专注其应用本身的业务逻辑而不是神秘的分布式系统概念,所以不适用zookeeper开发分布式系统也可以,只是难度会比较大。

zookeeper不适用的场景

整个zookeeper的服务器集群管理着应用协作的关键数据。zookeeper不适合用作海量数据的存储。对于需要存储海量应用数据的情况,有很多其他方案,比如数据库或者分布式文件系统。因为不同的应用有不同的需求,如对一致性和持久性的不同需求,所以,在设计应用时,最佳方式还是应该讲应用数据和协同数据独立开。

zookeeper中实现了一组核心操作,通过这些可以实现很多常见的分布式任务,例如有多少应用服务采用主节点方式或者进程相应跟踪方式,虽然zookeeper并没有为你实现这些任务,也没有为应用实现主节点选举,或者进程存活与否的跟踪功能,但是,zookeeper提供了实现这些任务的工具,对于实现什么样的协同任务,由开发人员自己决定。

通过zookeeper构建分布式系统

对分布式系统的定义有很多,最常见的是有多个物理主机,同时独立运行多个软件服务的系统。而分布式系统的好处不用说,利用多个主机的多个处理器的运算能力,提高速度,或者异地部署提高高可用性等等。

在一个分布式系统中,使用一个独立的协调组件有很多好处,比如对组件本身可以独立的设计实现,组件可以跨多个应用共享,简化架构和运维方面的工作,这些小地方往往有很多的工作量。独立运行协调组件,还可以简化生产环境中解决实际问题的任务。

软件在操作系统中以进程的方式运行,zookeeper也是如此.。分布式系统中的进程通信有两种选择,直接通过网络进行信息交换,或者读写某些共享存储。zookeeper使用共享存储模型来实现应用间的协作和同步原语。对于共享存储本身,又需要在进程和存储之间进行网络通信,网络通信很重要,因为它是分布式系统中并发设计的基础。

在真实的系统中,往往需要特别注意以下问题:

消息延迟

消息传输可能会发生任意延迟,比如因为网络拥堵。这种任意延迟可能会导致不可预期的后果。比如根据基准时钟,进程P先发了一个消息,另一个进程Q后发了一个消息,但是Q的消息可能会先完成传输。

处理器性能

操作系统的调度和超载也可能导致消息处理的任意延迟。当一个进程向另一个进程发送消息时,整个消息的延迟时间约等于发送端消耗的时间,传输时间,接收端处理的时间三个的总和。如果发送或者接受需要CPU调度处理,消息延迟会更高。

时钟偏移

使用时间概念的系统并不少见,比如,确定某一时刻系统中发生了哪些事件。处理器时钟并不可靠,它们之间也会发生任意的偏移,因此依赖处理器时钟也许会导致错误的决策。

关于上面这些问题的一个重要结论是,在实际情况中,我们很难判断一个进程是崩溃了还是某些原因延迟了,或者是其它一些意外发生。这些在异步系统中是无法确定区别的。

数据中心通常使用大量统一的硬件,但是即使实在数据中心,我们也需要发现这些问题对应用服务带来的影响,因为一个应用服务使用了多代的硬件,甚至对于同一批次的硬件也存在微小但是显著的性能差异。所有这些使得分布式系统设计师的生活变得越来越差。

zookeeper的精确化设计简化了这些问题的处理,zookeeper并不是完全消除这些问题,而是将这些问题在应用服务层面上完全透明化,使得问题更加容易处理。zookeeper实现了重要的分布式计算问题的解决方案,直观的为开发人员提供某种程度上实现的封装。

分布式协作的难点

当开发分布式应用时,其复杂性会立即凸显出来,例如,当我们的应用启动后,所有不同的进程通过某种方法,需要知道应用的配置信息,一段时间之后,配置信息也许发生了变化,我们可以停止所有进程,重新分发配置信息的文件,然后重新启动,但是重新配置就会延长应用的停机时间。

与配置信息问题相关的是组成员关系的问题,当负载发生变化时,我们希望增加或减少新机器和进程。

当开发者自己实现分布式应用时,这个问题仅仅被描述为功能性问题,开发者可以设计解决方案,部署前测试解决方案,并非常确认已经正确解决了问题。但是当开发分布式应用时,开发者就会遇到真正的困难和问题,就会面对很多故障,如崩溃,通信故障等各种情况。这些问题在任何可能的点都可能突然出现,甚至无法一一列举出来。

例如拜占庭将军问题,就是指可能导致一个组件发生任意行为(常常是意料之外的)的故障。这个故障的组件可能会破坏应用的状态,甚至发生恶意行为。系统是建立在假设会发生这些故障,需要更高程度的复制并使用安全原语的基础上。尽管我们从学术文献中知道,针对拜占庭将军问题技术发展已经取得了巨大进步,但是还是觉得没有必要再zookeeper中采用这些技术,因此,也避免了代码库中引入额外的复杂性。

在独立主机上运行的应用与分布式应用发生的故障存在显著的区别:在分布式应用中,可能会发生局部故障,当独立主机崩溃,这个主机上运行的所有进程都会失败,如果是独立主机上运行多个进程,一个进程执行的失败,其它进程可以通过操作系统获得这个故障,操作系统提供了健壮的多进程消息通信的保障。在分布式环境中这一切发生了改变:如果一个主机或进程发生故障,其它主机继续运行,并会接管发生故障的进程,为了能够处理故障进程,这些仍在运行的进程必须能够检测到这个故障,无论是消息丢失或发生了时间偏移。

理想的情况下,我们基于异步通信的假设来设计系统,即我们使用的主机有可能发生时间偏移或通信故障。作出这样的假设是因为这一切的确有很大可能发生,时间偏移时常会发生,我们偶尔会遇到网络问题,或者更不幸的系统发生了故障,那么我们可以做什么限制呢?

来看一个最简单的情况。假设我们有一个分布式的配置信息发生了改变,这个配置信息简单到仅仅只有一个比特位(bit),一旦所有运行中的进程对配置位的值达成一致,我们应用中的进程就可以启动。

这个例子就是分布式计算领域非常著名的FLP(由其作者命名:Fischer,Lynch,Patterson)定律,这个结论证明了在异步通信的分布式系统中,进程崩溃,所有进程可能无法在这个比特位的位置上达成一致。类似的定律称为CAP,表示一致性(Consistency),可用性(Availability),和分区容错性(Partition-tolerance),该定律指出,当设计一个分布式系统时,我们希望这三种属性全部满足,但是没有系统可以同时满足这三种属性。因此zookeeper的设计尽可能满足一致性和可用性,当然,在发生网络zookeeper也提供了只读能力。

因此我们无法拥有一个理想的能够故障容错的、分布式的、真实环境存在的系统来处理可能发生的所有问题。但是我们还是可以争取一个稍微不那么宏伟的目标。首先我们队系统要求适当放松,例如,我们可以假设时钟在某种范围内是同步的,我们也可以牺牲一些网络分区容错的能力,并认为其一直是一致的,当一个进程运行时,也许多次因无法确定系统中的状态而被认为已经发生故障。虽然这是一种折中方案,但是这些折中方案能够让我们建立一些非常不错的分布式系统。

zookeeper的注意事项

不得不指出,完美的解决方案是不存在的,zookeeper的确无法解决分布式应用中的所有问题,但是它为开发者提供了一个优雅的框架来处理这些问题。多年以来,zookeeper在分布式计算领域进行了大量的工作,Paxos算法和虚拟同步技术给zookeeper设计带来了很大影响,通过这些技术可以无缝的处理所发生的某些变化或情况,并提供给开发者一个框架,来应对无法自动处理的某些情况。

zookeeper可以很容易部署集群,轻松通过这个集群开发应用,但实际上,在使用zookeeper时,有些情况zookeeper自身无法进行决策而是需要开发者自己做出决策,这就需要开发者深入学习去了解这些。

我们的交流基地,“JAVA互联网技术交流:789650498”欢迎小伙伴们一起来交流:

《Zookeeper简介(02)解决的问题》


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
mobiledu2502935431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有