集群、分布式你想好怎么用了吗?

做互联网、做电子商务,我们都盼望着用户数和访问量不断的攀升,这意味着我们将有更多的业务,将有更多的订单,将会有更多的盈利。欣喜之余,我们开始有更多的担忧,我们的应用能不能抗得住啊,当一个个的问题在高访问量的时候一个个的暴露出来时,我们的压力也就接踵而来,我们忙前忙后焦头烂额。这样的景象不知道大家有没有经历过,不好意思我还没有。俗话说,未雨绸缪,早做准备永远都是好事。在设计OECP社区的时候,我早早的设计了OECP社区未来的运行环境,负载均衡,分布式集群,反向代理,缓存,文件系统,并在程序的架构上分离了平台层和应用层,正当我暗自得意的时候,一盆冷水让我从骄傲中苏醒过来。我平时一再吹嘘的通过可无限扩展的服务器集群方式解决系统压力的方案一下子出了问题。我一再提倡要将传统的将压力嫁祸于数据库的做法前置到应用服务器,通过应用服务器可扩展集群的能力来解决系统性能问题,这种思路我始终认为是对的,那又是什么问题让我坐立不安呢?
       独立应用可以透明的迁移到集群结构中,这种认识是错误的。尽管一些供应商宣称他们的J2EE产品有这样的灵活性。不要相信他们!事实你要在开始系统设计时就要准备集群,而这将影响开发和测试的所有阶段。
        1、Http Session
       在集群环境中,使用HTTP Session有很多限制,这取决于你的应用程序服务器采用了哪种会话失效转移的机制。如果负载集群采用的一个会话始终是连接的一个应用服务器,那么带来的影响还是可以容忍的。只是当这个应用服务器断开的时候,用户的此次请求也将断掉无法访问,而不能切换到其他服务器。如果你采取了会话失效转移,或者直接根据压力轮询路由应用服务器,虽然可以保持用户的请求不会断掉,但是其他的问题来了。你必须做的处理的就是session的复制或者同步,虽然很多应用服务器有这方面的能力,但是一个重要的限制就是所有保存的HTTP Session中的对象必须是可序列化的,这将限制设计和应用程序结构。我们可以问一下自己,我们session中放置的都是可序列化的吗?如果不是,你完了。即使我们都是放置的可序列话的对象,对象的序列的反序列化对性能的影响很大,如果你的集群节点很多,session的对象又放了很多,session的同步将会出现形成服务器间的IO阻塞。所以不要什么东西都往session中放。
        2、缓存
        我们采用缓存来提升系统的性能,降低数据库的压力,这种思路绝对是正确的,对于单应用服务器来说也是绝对没有问题的。但是在集群环境下,问题又来了。在集群环境,每个JVM实例都要维护一份缓存的拷贝,这些拷贝必须同步以维持所有服务器实例状态的一致性。有时这种类型的同步会比没有缓存带来更糟的性能。而更可怕的是我们根本就没考虑到同步缓存,造成数据的不一致。集群环境下,我们需要考虑使用的缓存产品支不支持分布式,我们自己写的缓存实现在集群下有没有同步的功能。
        3、单例和静态变量
        当我们设计J2EE应用程序时,在架构上经常会使用一些设计模式。这些如“Singleton”的设计模式会用到静态变量来在多对象之间共享状态。这种方式在单服务中工作得很好,但在集群环境将失效。一个使用静态变量的例子就是用它来保持在线用户数。用静态变量来保存在线用户数是一个很简单的办法,当用户进入或离开时就增加和减少它。这种方式在单服务器中绝对是好的,但在集群环境将失效。在集群中更好的方式是将所有状态保存到数据库,或者全局的缓存中。
       4、文件操作和外部资源
       一些应用会使用文件系统来保存用户上传的文件,或是创建一个动态配置的XML文件。在集群环境是没有办法来在其他实例之间来复制这些文件的。为了在集群中工作,办法是用数据库作为外部文件的存放点,另外也可以使用SAN(存储区域网,Storage Area Network)作为存放点。对于文件上传下载,我们最常用的做法就是采用文件服务器统一存取。
       5、一些特殊服务
       一些特殊的服务只在独立的环境中才有意义,定时服务就一个很好例子,这种服务可以在一个固定的间隔时间有规律的触发。定时服务常用于执行一些自动化管理任务。如日志文件滚动,系统数据备份,数据库一致性检查和冗余数据清理等。对于这些服务,他们大部分不是由请求触发的,负载均衡是没有任何用处的,如果迁移到集群中,有些服务也是固定在某台应用服务器上的,而不是每个服务器上都要开启这些服务。

        看了上面总结的这些问题,你还敢拍着胸脯说,我的系统可以迁移到集群中,我们的系统在压力大了之后可以做负载均衡啊?有些问题是可以在系统的演变升级中逐渐完善的,但是有些问题就需要我们在设计和开发阶段就要去思考,并做出相应的解决方案的。WHY总是先于HOW的,先去分析然后再做,多动脑子总比光动手要好得多。从上面的一些问题引申出的一些思考:
       1、一个好的架构师是多么的重要,不要以为他们没有像牛一样的工作就遭到鄙夷,他们在用脑子工作,他们的能力就是分析问题,防患于未然。我们每个人都应该向着能防范问题的方向去思考和发展。
       2、是自我吹嘘也罢,我依然认为我做了一个正确的决定,将系统抽象出了平台层和应用层。以上出现的大部分问题,我们都可以在平台层上去做正确的实现方案,然后将API暴露给应用层。比如我们统一封装支持分布式的缓存,对于静态变量的处理,我们在平台层上可以采用全局分布式缓存或者KEY-VALUE数据库这样的方案来进行替代,并公布API。平台层的建立,有效的降低了应用层的开发难度,让他们更关注业务,而不是太多的技术细节。平台层可以制定相应的技术标准和规范,可以持续不断的积累完善,可以被更多系统复用,对于一个团队发展都是有好处的。
        3、一个建议,尽量不要让一个业务型的项目经理来做架构设计的工作,他们的关注点是截然不同的,他只会关注进度,这对架构设计没有任何好处。

 

原文:http://www.po-soft.com/blog/yongtree/1375.html
 

参考:http://blog.youkuaiyun.com/ESoftWind/category/247686.aspx

<think>嗯,用户想了解Hadoop集群分布式知识,我需要先回想一下Hadoop的基本架构和关键组件。首先,Hadoop的核心是HDFS和MapReduce,对吧?然后还有YARN作为资源管理器。用户可能对这些部分感兴趣,但可能需要更详细的解释。 我应该先介绍Hadoop集群的总体概念,然后分解各个组件。HDFS负责存储,MapReduce处理计算,YARN管理资源。可能需要解释一下主节点和从节点的区别,比如NameNode和DataNode,ResourceManager和NodeManager。 用户可能对分布式存储和计算的基本原理不太清楚,所以需要举例说明,比如文件如何分块存储,任务如何并行处理。还要提到容错机制,比如副本机制和任务重试,这对集群的可靠性很重要。 另外,Hadoop的生态系统也很重要,比如Hive、HBase这些工具,可能用户后续会接触到,可以简要提及。可能还需要说明Hadoop的应用场景,比如大数据分析、日志处理等,让用户了解实际用途。 要注意避免使用太专业的术语,或者如果用了要解释清楚。比如,解释什么是分块存储,副本机制如何防止数据丢失。同时,要确保结构清晰,分点讲解,这样用户更容易理解。 最后,检查是否有遗漏的重要概念,比如扩展性、高容错性这些特点,以及Hadoop和其他分布式系统的区别。可能用户也需要知道Hadoop的优缺点,但用户的问题主要是介绍,所以可以集中在基本结构和原理上。</think>好的!Hadoop 是一个开源的分布式计算框架,主要用于处理海量数据的存储和计算。其核心设计思想是**分布式存储**和**分布式计算**,通过集群的方式将任务分布到多台机器上并行处理,从而实现高扩展性、高容错性和高效性。 以下是 Hadoop 集群分布式知识的核心内容: --- ### 1. **Hadoop 核心组件** Hadoop 主要由两大核心模块组成: - **HDFS(Hadoop Distributed File System)** 分布式文件系统,负责将大文件分割成固定大小的数据块(Block,默认128MB或256MB),并分散存储到集群的多个节点上,提供高容错性和高吞吐量。 - **NameNode**:主节点,管理文件系统的元数据(如文件目录结构、数据块位置)。 - **DataNode**:从节点,负责实际存储数据块,并定期向 NameNode 汇报状态。 - **MapReduce** 分布式计算框架,将计算任务拆分为多个子任务(Map 和 Reduce 阶段),分配到集群节点并行处理。 - **JobTracker**(旧版)或 **ResourceManager**(YARN 架构):负责资源分配和任务调度。 - **TaskTracker**(旧版)或 **NodeManager**(YARN 架构):在从节点上执行具体的计算任务。 - **YARN(Yet Another Resource Negotiator)** Hadoop 2.0 引入的资源管理框架,负责集群资源的统一调度和管理,支持多种计算框架(如 MapReduce、Spark、Flink)。 --- ### 2. **Hadoop 集群架构** - **主节点(Master Nodes)** - **NameNode**:管理 HDFS 元数据。 - **ResourceManager**:管理资源和任务调度(YARN)。 - **Secondary NameNode**(可选):辅助 NameNode 合并元数据快照(非热备)。 - **从节点(Slave Nodes)** - **DataNode**:存储数据块。 - **NodeManager**:执行计算任务并管理本地资源。 --- ### 3. **分布式存储(HDFS)** - **数据分块存储** 文件被切分为固定大小的块(Block),默认冗余复制3份,存储在不同节点,防止数据丢失。 - **写入过程** 客户端将数据块写入第一个 DataNode,再由该节点复制到其他节点,形成流水线复制。 - **读取过程** 客户端从 NameNode 获取数据块位置,直接与最近的 DataNode 通信读取数据。 --- ### 4. **分布式计算(MapReduce/YARN)** - **Map 阶段** 将输入数据拆分为多个分片(Split),分配到不同节点执行 Map 任务,生成键值对(Key-Value)形式的中间结果。 - **Shuffle & Sort** 将相同 Key 的中间结果聚合到同一节点。 - **Reduce 阶段** 对聚合后的结果执行最终计算,输出到 HDFS。 - **YARN 的工作流程** 1. 客户端提交任务到 ResourceManager。 2. ResourceManager 分配一个 ApplicationMaster(AM)管理任务。 3. AM 向 ResourceManager 申请资源,并在 NodeManager 上启动任务容器(Container)。 --- ### 5. **Hadoop 的容错机制** - **数据容错** HDFS 通过多副本机制保障数据安全。若某个 DataNode 失效,系统会自动从其他副本恢复数据。 - **计算容错** 若任务执行失败,YARN 会将任务重新分配到其他节点执行。 --- ### 6. **Hadoop 生态工具** Hadoop 生态系统包含多种扩展工具: - **Hive**:基于 Hadoop 的数据仓库,支持 SQL 查询。 - **HBase**:分布式 NoSQL 数据库,适用于实时读写。 - **Spark**:基于内存的分布式计算框架,比 MapReduce 更快。 - **ZooKeeper**:分布式协调服务,用于集群状态管理。 --- ### 7. **Hadoop 的应用场景** - 海量数据存储(如日志、视频、图片)。 - 批处理计算(如离线数据分析、ETL)。 - 大规模机器学习(需结合 Spark 等框架)。 --- ### 8. **Hadoop 的优势与挑战** - **优势** - 横向扩展:通过增加节点提升性能。 - 低成本:使用廉价硬件构建集群。 - 高容错:自动处理节点故障。 - **挑战** - 实时性差:适合离线批处理,难以支持低延迟查询。 - 复杂性高:集群配置和维护需要一定技术门槛。 --- 通过 Hadoop 的分布式架构,企业可以高效处理 PB 级数据,但其学习曲线和应用场景需结合具体需求选择。如果需要更深入某个知识点,可以告诉我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值