锁定老帖子 主题:真正高伸缩性和高可用性的秘密?
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-07-11
1 舍弃EJB 2 舍弃集群 3 不同行业数据库划分到相对基本独立的不同服务器群(而不是依赖服务器之间密切关联的集群) 4 不同页面采用不用服务器群 5 无状态 6 对Resin的内部页面展示机制进行专门化的定制(只能为我这个程序所用) 7 在数据的不同获取和生成阶段大量采用缓存技术 这或许出乎某些理论研究者或者某些认为EJB(以及相关的分布式事务、集群)技术才是高伸缩性和高可用性“正道“人的意外。 项目目前已经基本完成第一期,不过我正好看到一片Blog: http://www.manageability.org/blog/stuff/about-ebays-architecture 看到这片blog的好处可以坚定我的信心。还为我解决了一个迷惑,由于我使用纵向和横向的方式来划分数据库,因此这个项目没有采用O/Rmapping,但Ebay似乎证明了经过适当的定制,O/Rmapping在灵活性、高生产率和高伸缩性、高可用性两方面获得双赢。这或许是我们第二期的工作,因为项目正好进入一个业务逻辑日趋复杂的阶段。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-07-11
HA 方面都是非常讲数据的,没有可靠的测试数据,谁也无法说服谁。好的测试工具在这里是非常关键的。如果按照 TDD 测试优先的思想,要说明问题,首先要建立一个真正可靠的测试环境。
http 方面比较权威的测试工具是 SPECweb99(http://www.specbench.org/osg/web99/),不过是要收钱的。免费的(更不要说开源的)好的压力测试工具非常少。以前做 web mail 的时候,测试 http 性能用过 Apache 的 ab。虽然仅仅测试了 http 的性能,但是已经可以说明一些问题了。ab 太简单,可以测试的内容非常少。JMeter 应该可以做更全面的测试,我还没有研究过。 我对 HA 没有多少经验,随便说说。这方面大家多讨论讨论。 上面有些描述的不是很清楚,例如: potian 写道 4 不同页面采用不用服务器群
如何划分,是每个页面来自不同的服务器吗?“服务器群”又让我想到了集群,而上面已经把集群否定掉了。potian 能不能再进一步说明一下。 |
|
返回顶楼 | |
发表时间:2004-07-11
我觉得你这里的关键是两个有利条件。
1是可以按不同行业纵切,这个是决定性因素。 2是建模成无状态,所以能够用服务器群来替代集群。但是我觉得这里会有不少问题。 还有一点就是缓存,不过在前面第一点的保障下,相对能好一些。 300万次/天,峰值肯定会超过1000次/秒。但是这类点击中关键点击(写的那种)占的比例就非常重要了。 |
|
返回顶楼 | |
发表时间:2004-07-11
真是 尽信书则不如无书 阿!
我觉得就是有人想到这个方法,也不一定敢用,会有一段的人拿着 J2EE 这根棒子砸你!呵呵; 关注中... |
|
返回顶楼 | |
发表时间:2004-07-11
charon 写道 我觉得你这里的关键是两个有利条件。
1是可以按不同行业纵切,这个是决定性因素。 2是建模成无状态,所以能够用服务器群来替代集群。但是我觉得这里会有不少问题。 。 很难得这样一个系统居然是能够建模成无状态,真是好运气。印象中是“高考查分”、“社保查询”这类系统就是这样,输入一个号码,得到一次结果,干干净净,舒舒服服。只需要在服务器群前面加上一个循环DNS就可以了。 关注中 |
|
返回顶楼 | |
发表时间:2004-07-11
能否介绍一下是什么类型的项目呢?点击最多的地方是不怎么变化的?还是怎么样?
|
|
返回顶楼 | |
发表时间:2004-07-11
没有项目context的了解,妄谈方案没有什么意义
|
|
返回顶楼 | |
发表时间:2004-07-11
刚刚跑去看了potian提到的blog,这篇文章简要描述了ebay的做法,其中的重点是:
[list]Judicious use of server-side state No server affinity Functional server pools Horizontal and vertical database partitioning [/list:u] 引用 This basically means that right now we are not really using server-side state. We may use it; right now we have not found a good reason to use it. [snip] if there is something that needs to be stateful, then we put in the database; we go back and get it, if we need to. We just take the hit. We do not have to do clustering; we do not have to do any of that stuff.
也就是说不是完全的“无状态”(这样的应用比较少),而是把服务端的状态保存在数据库中。我们以前用php开发应用时,就是这样做的,因为当时的php不提供服务端状态保留的支持。现在的web应用开发语言都提供了服务端状态保留的直接支持,比如在j2ee web应用中,我们用javax.servlet.http.HttpSession。 服务端状态的存放地点,可以是内存、磁盘文件、数据库或者是客户端cookie,应用服务器一般都提供配置选择,这里可以查看weblogic server的配置说明。 对于服务端状态实现上的需求,我想主要有: 1、性能。session是一个频繁读写的对象,想想我们在一次用户操作中需要调用多少次getAttribute()/setAttribute(),这方面显然内存最快,数据库最慢。 2、服务器之间迁移。这是针对高可用性而言的,当server a宕机后,用户被路由到server b,依然能够获得正确的状态信息。这方面则数据库方案天生支持,其他则需额外的实现,不过号称支持cluster的应用服务器一般都会提供服务器之间内存session同步的支持。 至于我们开发者而言,如果预算允许我认为还是选择一个可以满足需求的应用服务器最好,无须自己实现服务端状态的存放,而且容易找到可用的开发人员。 引用 1 舍弃EJB
2 舍弃集群 5 无状态 potian能否说一下为什么要作出这样的考虑,不用EJB当然可以,难道连javax.servlet.http.HttpSession都不用么? |
|
返回顶楼 | |
发表时间:2004-07-11
flyisland 写道 potian能否说一下为什么要作出这样的考虑,不用EJB当然可以,难道连javax.servlet.http.HttpSession都不用么?
不用 javax.servlet.http.HttpSession 是完全可以的,Servlet session 不过就是一个 Hashtable,不用 Servlet 提供的 session 而用自己实现的 session 来代替可以获得更好的控制,我们就是这样做的。不知道 potian 说的“无状态”是不是就是完全没有类似于 session 的一类东西。 |
|
返回顶楼 | |
发表时间:2004-07-11
我发这个帖子的目的是为了让大家去看那个帖子。了解很多书上写的理论和服务器供应商吹嘘的东西在真正高要求的系统中用处不是很大。
至于我这个项目里面,还是存在着服务端状态的(我说错,应该是尽量少用状态),Session也是有的,但仅在少数页面的时候需要。尽量采用cookie.在使用Session时尽量不在内部存放其它状态信息。其中一个重要的解决方法是开辟一块共享内存区域,每一个用户会占据一个条目,可以为应用程序的所有部分直接存取,并且一直常驻在这个共享内存区域内,这个区域对我们定制Web应用服务器动态展现页面有很多好处。 使用应用服务器集群要求Session的复制,实际上开销(譬如通过可靠的组通讯)还是很大的,所以Session不能过大,属性的改变必须重新设置整个Session,Session必须可串行化等等问题,并且我们采用的方法是通过不同的行业划分,譬如某一个服务器群负责一个大行业,其中不同的服务器负责分行业,当查询(譬如全文查询)的时候,总的服务器知道这个具体的路由算法,象不同的服务器要求数据,最后合并返回(这里有某些ActiveObject的做法),在这样的情况,我们基本上就不需要集群,而且随着规模和访问量的扩大我们可以比较好地进行伸缩。另外就是通过DNS和相关的网络设备来解决单点失败的问题。 |
|
返回顶楼 | |