- 浏览: 3502894 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
构造Cluster是架构师们实现Scalability 与High Availability 的最直接用药。所以大家很多都会无意中使用Cluster的思想去设计自己的服务器。其实Java EE里的Clustering已经做得很熟很烂,大家如果烂熟各家vendor对Web,EJB,JNDI,JMS,WebService....的 Cluster实现,再思考自己的烂摊子时,思路便快捷清晰,少很多与同僚们的无谓争论。
JavaEE Cluster的经典范文是Sun的王昱写于2005年的Uncover the hood of J2EE Clustering Preface,更可贵的是dev2dev上的JadeYuan兄弟将它高质的翻成了中文。
一、所谓集群
目的就是以负载均衡(Load Balance)与失败转移(Failover) 实现可扩展性(Scalability)和高可靠性(High Availability) ,主要实现的功能:
- Load Balance 算法主要有轮循、权重(根据服务器硬件配置的不同)和随机三种,但更酷的做法是基于负载(直接查探或者服务器主动报告它们的负载)。
- Health Check 心跳系统与发现协议。Server一般会主动定期多播报告自己状态,也会Ping对方来问候平安。比如Weblogic每10秒会向全世界发送一次心跳,如果有30秒没有收到某个服务器的心跳了(考虑到多播可能会丢失数据包)就可视对方为阵亡。
- Session Replication 因为服务器会记录与特定用户的会话信息,Balancer应该把同一用户的请求定位到同一台服务器上。如果该服务器失效,就把该用户和会话信息转移到新服务器上。
除了Scalability 与High Availability,一个集群还应该对已有代码影响最小,对性能影响最小,配置与部署简单,以及运行时可监控。
二、Web层群集
Balancer无非Apache/IIS插件,balance Servlet,硬件四层交换机三类,而讨论的重点在Session 信息的Replication 实现上,简单的分有全部服务器冗余备份,三三两两互为冗余备份,中央备份服务器三种模式。
1.多服务器全冗余备份
Tomcat的最为粗糙,最没有扩展性的做法,不提。Sun的怪怪的replacate的内存数据库法HADB可能也属于这种范畴。
2.三三两两互为冗余备份
Weblogic, Jboss and WebSphere 的做法,好主流。A会有B的数据,B会有C的数据,C会有B的数据,如果A出错,就会由C接替A的工作。这种做法的弊端是:
1.要控制failover到备份服务器,Balancer的实现复杂度高。
2.如果A出错,C就要瞬时承载A、C的操作,很可能将它压垮,针对这点,Weblogic的做法是针对每个session
而不是每个Server选择备份服务器,把主备服务器A、B的名字写在用户Cookie里,如果A失效后,Balancer会根据cookie将用户转到
服务器B。
3.相对没有cluster的方案,需要花额外的时间和内存。
文中没讲的Geronimo使用的WADI,应该也属于这种类型,不过更为灵活,详见Geronimo 叛逆者: 加入集群功能第1部分 和 第2部分。
3. 中央备份服务器
N+1模式,一个中央Server存放所有的Session,如果一台Server死了,接管的Server就从中央服务器restore相关数据。可以
用数据库(很多应用服务器都支持的最简单,但最慢的模式),也可以采用内存。这种方式好处是cluster服务器上不需要冗余内存,可以failover
到任意服务器,cluster服务器全死了中央服务器都不死。坏处就是如果中央服务器死了...如果中央服务器的内存不够了.....另外,多了个
restore的步骤。
4.Stick Session
一种简便但不保证可靠性的方式
使用内存备份session时,Tomcat/JBoss使用的JavaGroups 是一个很好的工具,它的" Group membership protocols" and "message multicast"特性都非常有用。
另外,无论使用内存还是数据库,都需要串行化Java对象,性能损耗厉害,所以JRun 就采用了Jini架构 ,而Tangosol Coherenc ,Terracotta这些Data Grid方案都提出了自己的session备份做法,整天显示着比传统方案快多少多少。Data Grid分布式缓存本身就是很Enterprise的功能,下篇blog再详述。
三、EJB集群
从stub 调用实际EJB对象时,有三种方法实现负载均衡和fail over:
- Smart Stub.在stub内维护有效列表,实现负载均衡逻辑,进行实效检测,BEA Weblogic and JBoss 采用。
- IIOP Runtime Library ,Sun的JES 算法,把算法从客户端的stub移到客户端的IIOP Runtime
- Interceptor Proxy,IBM做法,把算法移到了服务端,Location Service Daemon (LSD)。
在JNDI查找EJBHome,EJBHome Stub查找生成EJB实例,调用EJB方法三种时候都可以实现负载均衡,对statefull,stateless,entity bean,又有不同的做法。
EJB需要具有幂等性(在部署描述符中声明)才能failover。
四、其他集群
JMS集群,可以有多个broker组成集群(JBoss,如果要持久化Message,就要把原来嵌入式的数据库改为共享模 式),activeMQ还支持多个消费者组成集群,但每个消费者负责同一类的任务,比如订单队列的处理,Server A只处理图书类的订单,或只处理《Programming Ruby 2nd》的订单。
数据库集群有Oracle的RAC,但JDBC本身的failover能力很低,一旦connection 中断,resultset等对象都会失效,Weblogic的连接池会尝试重连。
五、走的更远
Weblogic9/10的广域网群集和服务器迁移(有些服务在群集中只能有一个实例在运行,如果该实例失效,迁移到下一个实例)功能。
如果只要单纯的load balance,不要fail over的话,使用纯硬件如F5已经足够,不需要在软件上做任何事情。
群集有两种模式,一种是只在入口的Web层进行负载均衡,一种是Web层和对象层(EJB)分别进行负载均衡。
六、Cluster的神话
1.Failover可彻底避免错误
JBoss的文档用了整整一章来警告你,真的需要http session复制吗?没有http
session可以使效率提高很多,而有了的话,并不能避免所有错误。失败转移只能在两次调用间产生作用,在调用时产生的错误是无法恢复的,除非这是个幂
等操作(如单纯的get(),而不是put(),无论如何重复操作结果都是一样的),否则,如果A上承载100用户,失败时有20个用户正在进行处理,则
只有80个用户能逃出生天平安转移到B。
2.小心编写可集群的程序
1.http session要放能serilaze的对象,对象不要太大,变更时要显式的setAttribute().
2. 注意Cache的使用。如果每个JVM独立使用Cache,会否不一致,如果进行同步,注意开销。
3.不能使用静态变量,如在线用户数,要搞成分布式的 Cache。
4.外部资源如文件系统(一台机器上没有另外一台机器的文件),存成DB或者使用SAN
5.特别服务:如timer服务,基于事件的服务
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74151在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3759原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23494Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2134FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5524我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2347WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1565Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2121终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14841大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1711charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22625Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4884来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2375本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8699一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2906近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3702目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2542Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2100由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 3005安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1854本文介绍物理地址扩展 ...
相关推荐
**J2EE集群技术详解** 在企业级应用开发中,J2EE(Java 2 Platform, Enterprise Edition)作为一套标准的框架,为构建分布式、多层的、可扩展的系统提供了强大的支持。集群是J2EE平台中的一个重要概念,它通过复制...
《J2EE集群技术揭秘》一文由Sun中国工程研究院的王昱撰写,深入探讨了J2EE集群技术的关键概念、实现原理以及常见误区。文章不仅涵盖了基础理论,还涉及了具体的实现策略和技术细节,为读者提供了全面而深入的理解。 ...
QT聚类,全称为Quality Threshold Clustering,是一种无监督学习的聚类算法,主要用于数据集的划分,将相似的数据点归为一类。该方法在处理高维数据或大规模数据集时,表现出一定的优势,因为它不需要预先设定聚类的...
12. **Clustering和负载均衡**:J2EE支持集群部署,可以提高应用的可用性和可伸缩性。 13. **Performance Tuning**:手册可能会涵盖如何优化J2EE应用的性能,包括内存管理、线程调度和数据库查询优化。 14. **...
层次聚类(Hierarchical Clustering)是数据挖掘和统计分析中的一个重要方法,它通过构建一个树状结构(也称为 dendrogram)来展示数据点之间的相似性或距离关系。在这个树形结构中,每个叶节点代表一个原始数据点,...
MYDBSCAN:基于密度的聚类DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法的底层实现 MYAP:基于划分的聚类AP(Affinity Propagation Clustering Algorithm )算法的底层实现--近邻传播...
DB-Scan(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它能够发现任意形状的聚类,并且对噪声数据不敏感。在轨迹聚类中,DB-Scan可以通过考虑轨迹之间的距离和...
3. **聚类算法**:常见的聚类算法包括K-means、层次聚类(Hierarchical Clustering)、DBSCAN(基于密度的聚类)和谱聚类(Spectral Clustering)。选择哪种算法取决于数据的特性和需求。K-means是最常用的,因为它...
Rodriguez A, Laio A. Clustering by fast search and find of density peaks[J]....基于这篇文章实现的最基本的密度聚类的算法,具体请看我博客中的相关文章http://blog.csdn.net/kryolith/article/details/39832573
在“spectural_clustering_聚类_谱聚类_谱聚类算法_”这个主题中,我们将深入探讨谱聚类的基本原理、优化策略以及如何在Python中实现。 谱聚类的核心在于将数据集转化为图,每个数据点是图中的一个节点,节点间的边...
**密度聚类(Density-Based Clustering)**是一种在数据挖掘领域广泛应用的无监督学习方法,它主要通过对数据点的密度分布进行分析来识别不同类别的群体。与基于划分或层次的聚类方法不同,密度聚类特别适合处理含有...
系统聚类法、动态聚类法和模糊聚类法是聚类分析中常见的三种方法。 1. **系统聚类法**: 系统聚类法是一种递归的合并策略,它根据样本间距离的大小逐步合并类别。首先,每个样本被视为一个独立的类别,然后每次...
在复杂网络的研究中,聚类系数(Clustering Coefficient)和度度关联系数(Degree-Degree Correlation)是两个非常重要的概念,它们可以帮助我们理解网络的局部结构和整体特性。本压缩包“Clustering_Coefficient....
层次聚类算法描述
### 谱聚类(Spectral Clustering)深入解析 #### 一、谱聚类概述 **谱聚类**是一种基于图论的机器学习方法,主要用于处理无监督学习任务中的聚类问题。与传统的聚类算法(如K-means、层次聚类等)相比,谱聚类...
在Python中,我们可以使用`scipy`库的`spectral_clustering`函数来实现谱聚类。 首先,让我们详细了解一下谱聚类的基本步骤: 1. **构建相似度矩阵**:根据数据集中的样本,计算它们之间的相似度。常用的相似度...
常见的聚类算法包括K-means、层次聚类(Agglomerative Clustering)、DBSCAN(Density-Based Spatial Clustering of Applications with Noise)、谱聚类(Spectral Clustering)等。在使用这些算法时,需要考虑的...
在本压缩包“Matlab-使用Matlab实现的聚类算法-Clustering.zip”中,包含的是关于如何在MATLAB环境中实现聚类算法的详细资料。MATLAB是一种强大的编程环境,尤其适合数值计算和数据分析,而聚类算法是数据挖掘中的...
层次聚类算法是一种数据挖掘中的无监督学习方法,主要用于对数据进行分类或分组,而无需预先知道数据的标签或类别。在C++中实现层次聚类,通常涉及到多个步骤和核心概念,如距离计算、聚类合并和树状结构...
在数据挖掘和机器学习领域,聚类分析(Cluster Analysis)是一种重要的无监督学习方法,主要用于发现数据集中的自然群体或类别,而无需预先定义的分类。聚类的基本思想是根据数据对象的特征相似性将相似的数据对象...