构造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的步骤。
使用内存备份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服务,基于事件的服务
分享到:
相关推荐
【标题】:“[转载] Clustering经典范文学习” 这篇博文主要围绕着Clustering(集群)这一主题展开,作者分享了一篇经典的学习资料——"J2EEClustering.pdf"。Clustering在IT领域,特别是Java EE(现在称为Jakarta ...
《聚类分析报告学习总结》 聚类分析是数据分析领域中的一个重要工具,尤其在面对大量数据,需要找出其中隐藏的模式或群体结构时,聚类分析能帮助我们无监督地发现数据的内在规律。它是多元统计分析中的一种方法,...
5.1 分类学习算法 5.1.1线性分类算法 5.1.2非线性分类算法 5.1.3核方法与支持向量机 5.2 聚类学习方法 5.2.1 K均值聚类算法 5.2.2 其他聚类算法
基于元学习和聚类的联邦学习方法Python源码+文档说明+配置说明+模型+数据(高分项目) MetaClusterFL |-- client #不同算法使用到的基本算子client | |-- __init__.py | |-- fedavg.py | |-- perfedavg.py |-- data #...
聚类分析是数据分析中的一个重要工具,它主要用于对数据集中的对象进行分类,寻找内在的结构和模式,使得相同类别的对象具有较高的相似性,而不同类别的对象则相对不相似。这种技术尤其适用于数据的预处理阶段,以及...
### 机器学习中的聚类方法概述 #### 一、引言 聚类是机器学习领域中一项重要的无监督学习技术,旨在对未标记的数据进行分类,以发现数据内部的结构和模式。本文将详细介绍几种主要的聚类算法,包括K-means聚类、...
聚类分析是多元统计分析中的一个关键方法,主要用于在数据分类不明的情况下,探索性地将对象按照相似性分组。这种分析方式不依赖于预先设定的类别或分类数量,而是根据数据自身的特点来划分群体。聚类分析与判别分析...
第二篇探讨了聚类、奇异值分解、主成分分析、潜在语义分析等无监督学习方法。作为统计机器学习领域的经典教材,它为学习者提供了丰富的理论基础和实践经验,对于理解机器学习算法、提高实际应用能力以及进行相关课程...
聚类分析是一种重要的数据分析技术,尤其在多元统计分析中,用于发现数据中的自然群体或类别。这种方法在数据的类别未知,甚至无法预估类别数量的情况下尤为有用。与判别分析不同,判别分析需要预先知道各类别的信息...
它通过考虑样本群组的临近关系,如SwAV框架所示,来减少实例级别的计算开销,同时通过深度聚类的方法优化模型训练,如Unsupervised Deep Embedding for Clustering Analysis论文中所提出的。 在实际应用中,对比...
聚类分析是一种重要的数据分析技术,尤其在多元统计分析中,用于发现数据中的自然群体或类别的结构。在聚类分析中,我们并不需要预先知道数据应该分成多少类,或者每类的具体特征,而是通过计算数据点之间的相似性来...
【Java聚类算法技术文档】从聚类算法开始: 人工智能无疑是近年来最火热的技术话题之一,以机器学习为代表的人工智能技术,...在此我们先抛开机器学习中那些繁杂的概念,从机器学习中最有代表性的聚类算法开始实践。
3. SOM (Self-Organizing Map): SOM 是一种基于神经网络的聚类和降维方法,通过竞争学习机制将数据映射到二维平面,形成聚类。 六、聚类算法的选择 选择聚类算法时,需要考虑数据的特性(如数据规模、属性类型、...
聚类分析是一种重要的数据分析技术,尤其在多元统计分析中,用于发现数据中的自然群体或类别的结构。在聚类分析中,我们并不需要预先知道数据应如何分类,而是通过算法来寻找数据点之间的相似性,将相似的数据点归为...
聚类算法是数据挖掘中用于无监督学习的一种重要技术,其目标是根据数据的内在相似性或差异性将数据集分割成多个组或簇。这里,我们将详细探讨各种类型的聚类算法及其特点。 1. 基于划分的聚类算法: - **K-Means**...
2. **层次聚类**包括凝聚型和分裂型,例如Agglomerative Clustering和Divisive Clustering,通过构建聚类树来表示数据关系。 3. **DBSCAN**是一种基于密度的聚类算法,它能发现任意形状的簇,不受簇大小或形状限制...
在数据分析和机器学习领域,聚类是一种无监督学习方法,用于发现数据集中的自然分组或模式。Python作为流行的编程语言,提供了丰富的库支持各种聚类算法的实现。以下是基于Python实现的一些主要聚类算法的详细说明:...
聚类算法是数据分析中的重要方法,主要用于无监督学习,即将数据集中的对象按照相似性原则划分成不同的组别,这些组别称为簇。聚类的目标是使同一簇内的对象尽可能相似,而不同簇之间的对象则尽可能不同。在实际应用...