`
xiushan
  • 浏览: 30593 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

阅读更多

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

       做互联网、做电子商务,我们都盼望着用户数和访问量不断的攀升,这意味着我们将有更多的业务,将有更多的订单,将会有更多的盈利。欣喜之余,我们开始有更多的担忧,我们的应用能不能抗得住啊,当一个个的问题在高访问量的时候一个个的暴露出来时,我们的压力也就接踵而来,我们忙前忙后焦头烂额。这样的景象不知道大家有没有经历过,不好意思我还没有。俗话说,未雨绸缪,早做准备永远都是好事。在设计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、一个建议,尽量不要让一个业务型的项目经理来做架构设计的工作,他们的关注点是截然不同的,他只会关注进度,这对架构设计没有任何好处。

分享到:
评论

相关推荐

    集群与分布式的区别

    集群与分布式的区别 单机结构我想大家最最最熟悉的就是单机结构,一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器...

    用Docker构建分布式Redis集群

    【编者的话】本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子。不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以...

    深入了解MongoDB 分布式集群

    要想很好的使用 mongodb,仅仅知道如何使用它是不够的。只有对其架构原理等有了充分认识,才能在实际运用中使其更好地服务于应用,遇到问题知道怎么处理,而不是抓瞎抹黑。这篇文章就带你进入 mongodb 集群的大门。 ...

    Redis集群下过期key监听的实现代码

    在使用redis集群时,发现过期key始终监听不到。网上也没有现成的解决方案。于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决...

    ElasticSearch集群及应用

    假如我们建了一个web站点或者是一个应用程序,你就可能会需要添加搜索功能(因为这太有必要了),而事实上让搜索跑起来是有难度的,我们不仅想要搜索的速度快,而且还要安装方便(最好是无痛安装),另外模式定义要...

    基于CentOS的Hadoop分布式环境的搭建开发

    当运行wordcount词频统计的时候,实在是感叹hadoop已经把分布式做的如此之好,即使没有分布式相关经验的人,也只需要做一些配置即可运行分布式集群环境。 好了,言归真传。 在搭建Hadoop环境中你要知道的一些事儿: ...

    crawler:分布式图像爬虫

    如果您需要持久性和交付保证,您可能需要查看 ,这是一个分布式邮箱系统,可提供更好的交付保证。 请参阅以了解如何交换队列实现。 Crawler 使用作为存储引擎。 Riak 使用提供强一致性保证,而 Crawler 使用它们来...

    rqlite:基于SQLite的轻量级分布式关系数据库

    最后,如果您想了解分布式系统的实际工作方式,那么rqlite是一个很好的例子。 在其和实现中已经进行了很多思考,各个组件之间的清晰分离,包括存储,分布式共识和API。 怎么样? rqlite使用在SQLite数据库的所有...

    在VMware下快速克隆多个Linux环境的方法教程

    其实也不是了,就是为了折腾嘛,玩个数据库主从啦、缓存集群啦、分布式消息集群啦、分布式各类服务啦,你要模拟几乎接近真实的环境,就必须要有多台机器,你想要有多台机器只有两种方式:买买买和装虚拟机。...

    大数据学习计划.pdf

    2、通过对 Linux ⽂件系统、(⼤数据学习群142974151】内核参数、内存结构、以及 Java 虚 拟机等相关知识的学习,为后续学习分布式 ⽂件系统, Hadoop 集群优化扫清操作系统层 ⾯知识的障碍 2 Hadoop 由许多元素...

    Spark快速数据处理 PDF电子书下载 带书签目录 完整版

    Spark的单机版便于测试,同时本章也会提到通过SSH用Spark的内置部署脚本搭建Spark集群,使用Mesos、Yarn或者Chef来部署Spark。对于Spark在云环境中的部署,本章将介绍在EC2(基本环境和EC2MR)上的部署。如果你的...

    tensorflow_on_slurm

    Slurm上的Tensorflow 该软件包使在Slurm集群上运行分布式TensorFlow作业变得更加容易。 它包含用于解析Slurm环境变量以便为分布式TF创建配置的函数。先决条件您需要安装TensorFlow。 所有示例均已使用TensorFlow ...

    详解VMware12使用三台虚拟机Ubuntu16.04系统搭建hadoop-2.7.1+hbase-1.2.4(完全分布式)

    虚拟机是个不错的选择,可以基本完全模拟真实的情况,前提是你的电脑要配置相对较好不然跑起来都想死,废话不多说。 环境说明 本文使用VMware:registered: Workstation 12 Pro虚拟机创建并安装三台Ubuntu16.04系统...

    对Web开发中前端框架与前端类库的一些思考

    就好像一个日均pv只有几百的小型电商网站,却要大喊“某宝就是这么搞的”,然后搭建应用服务器集群,使用分布式文件系统和分布式数据库系统…等巴拉巴拉的一堆用来处理高并发,海量数据访问的手段。我想说,有意义吗...

    Google_MapReduce中文版-系统架构

    MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。...用MapReduce作为基础重写我们的索引系统产品,包括其它一些使用MapReduce的经验。第七部分讨 论相关的和未来的工作。

    CentOS 6x移动及复制后网络问题决解.docx

    我们安装好了一个虚拟机,我想做分布式集群,想模拟几台服务器,这时就想直接复制已经有的安装好的虚拟机,这样比较省事,不要在重复的安装虚拟机并配置JAVA环境,省掉做同样的事情,这时直接复制,这样之前配置的...

    aztk:由Azure Batch支持的AZTK

    这是使用Spark集群启动和运行的一种廉价且简便的方法,对于想要进行大规模实验和开始测试的Spark用户来说,这是一个很好的工具。 该工具包基于Azure Batch构建,但不需要使用任何Azure Batch知识。 地位 该存储库...

    spark Core RDD持久化详解

    但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。 Spark 是一种与 Hadoop 相似的开源集群计算环境,...

    「大数据干货」基于Hadoop的大数据平台实施——整体架构设计.pdf

    我想⼀定能为其它有类似想法的个⼈或公司提供很好的参考资料!需要⼤数 据的可以加我扣扣群⼤数据零基础到项⽬实战,专注⼤数据分析⽅法,⼤数据编程,⼤数据仓库,⼤数据案例,⼈⼯智能,数据挖掘都是纯⼲ 货分享,...

    iWeb开源三剑客之iWebSNS v0.9.9 繁体中文版.rar

    借助iwebSI平台,站点可以轻松获得支持热插拔及快速增加新节点的集群计算与处理能力(分布式计算与存储/高可用性/负载均衡),以方便管理web2.0类站点持续增长的数据量。SI的web层、db层负载均衡,基于内存的分布式...

Global site tag (gtag.js) - Google Analytics