构造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),主要实现的功能:
1. Load Balance
算法主要有轮循、权重(根据服务器硬件配置的不同)和随机三种,但更酷的做法是基于负载(直接查探或者服务器主动报告它们的负载)。
2: 2. Health Check
心跳系统与发现协议。Server一般会主动定期多播报告自己状态,也会Ping对方来问候平安。比如Weblogic每10秒会发送一次心跳,如果有30秒没有收到对方服务器的心跳了(考虑到多播可能会丢失数据包)就视对方为阵亡。
3. Session Replication
因为会服务器记录与特定用户的会话信息,Balancer应该把同一用户的请求定位到同一台服务器上。如果该服务器失效,把该用户和会话信息转移到新服务器上时。
如果只要单纯的load balance,不要fail over的话,使用纯硬件如F5已经足够,不需要在软件上做任何事情。
除了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将用户转到服务器C,C会根据用户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:
1. Smart Stub.在stub内维护有效列表,实现负载均衡逻辑,进行实效检测,BEA Weblogic and JBoss 采用。
2. IIOP Runtime Library ,Sun的JES 算法,把算法从客户端的stub移到客户端的IIOP Runtime
3. Interceptor Proxy,IBM做法,把算法移到了服务端,Location Service Daemon (LSD)。
在JNDI查找,EJBHome Stub查找生成EJB实例,调用EJB方法三种时候都可以实现负载均衡,对statefull,stateless,entity bean,又有不同的做法。
四、其他集群
JMS 集群,可以有多个broker组成集群(JBoss,如果要持久化Message,就要把原来嵌入式的数据库改为共享模式),activeMQ还支持多个消费者组成集群,但每个消费者负责同一类的任务,比如订单队列的处理,Server A只处理图书类的订单,或只处理《Programming Ruby 2nd》的订单。
数据库集群有Oracle的RAC,但JDBC本身的failover能力很低,一旦connection 中断,resultset等对象都会失效,Weblogic的连接池会尝试重连。
五、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服务,基于事件的服务,
分享到:
相关推荐
redis笔记包含基础和集群,常见概念及操作讲解
在分析产业集群资源信息共享需求的基础上,论述了支持产业集群开放资源服务的资源共享环境的概念和内容;提出一种由客户端、代理存储、安全维护、应用服务和公共数据中心组成的支持产业集群资源共享服务的五层体系...
首先,本文介绍了产业集群的概念、产生及集聚因素:其次,对合肥高新 技术产业概况和产业集群现状进行分析。探寻合肥高新技术产业集群发展的特 点、优势和存在的问题:然后,运用产业集群相关理论以及相关成功案例的...
实验目的: 1. 熟悉常用的基本命令操作 2. 掌握搭建环境部署项目 3. 体会云计算虚拟化等...1. Linux 基础、docker 基础、hadoop 基础 2. Linux+docker 快速搭建服务器进行项目部署 3. Linux+hadoop 完全分布式集群搭建
在自适应扩展卡尔曼滤波的基础上,基于集群的概念判断适用于卫星定位的领航无人机(主机),剩余的从机(僚机)由相对导航确定与主机之间的位置关系,进而进行绝对定位。仿真实验结果表明:所用的无人机集群构型...
"模块化集群"主要是由智能产业的中间环节构成的集群,包括由智能基础产业为主构成的产业集群,如西安高新区电子元器件产业集群、昆山平板显示产业基地、湖南益阳传感器基地,由智能核心产业为主构成的产业集群,如...
介绍了创新集群的概念,并从人力资源、技术网络和R&D平台、组建战略联盟、风险资本四个方面分析了创新集群的形成。在此基础之上,对创新集群的形成路径进行了分析。
1、是什么 2、架构 1、工作方式 2、组件架构 1、控制平面组件(Control Plane Components) 3、kubeadm创建集群 1、安装ku
Cassandra知道它正在集群管理器中运行,并使用此集群管理基础结构来帮助实现该应用程序。 Kubernetes概念(如Replication Controller,StatefulSets等)可用于在Kubernetes集群上部署非持久性或持久性Cassandra集群
及构建Linux 集群的基础知识。在本文中,我们将会介绍有关OSCAR 的内容,这是一个用来帮助构建健壮集群的开放源码项目。另 外,我们还会概要介绍集群管理和基准测试的概念,并详细介绍在集群上运行标准LINPACK 测试...
算法与应用实例的选择均是以便于读者理解为基础的:对于熟悉机器人学与计算机视觉的读者,书中的算法及应用范例将使这类读者容易理解集群计算的相关概念与操作;同样,对于熟悉集群计算的读者,选择的算法及应用范例...
1. 每个 spark 应用都由一个驱动器程序( driver program )来发起集群上的各种并行操作 2. SparkContext :该对象代表了对计
Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样...
02-kubernetes基础概念.mp4 03-kubeadm初始化Kubernetes集群.mp4 04-kubernetes应用快速入门.mp4 05-kubernetes资源清单定义入门.mp4 06-Kubernetes Pod控制器应用进阶.mp4 07-Kubernetes Pod控制器应用进阶.mp4 08-...
3.1 Memcached基础 3.1.1 什么是Memcached 3.1.2 Memcached的特征 3.1.3 Memcached的安装 3.1.4 Memcached的简单使用过程 3.2 剖析Memcached的工作原理 3.2.1 Memcached的工作过程 3.2.2 Slab ...
专为初学者开设的,你可以零基础学习这项技术。我们将带你了解全部K8s的基础知识,帮你理解这些概念。包括了云原生存储ROOK集群技术,持久化存储PV&PVC等等。
在现今商业世界里,信息及其访问的畅通性,构成的不仅仅是基础架构,通常也是一些公司的预算模型。因此,对于或大或小的商业应用,维持信息的可用性和可访问性变得越来越重要。一直以来,高可用性对于关键性的商业...
我们将带你了解全部K8s的基础知识,帮你理解这些概念。课程内容包括了云原生存储ROOK集群技术,持久化存储PV&PVC,K8s存储Volumes,Prometheus集群化自动化监控,Ingress Nginx技术,Ceph与Redis集群实战技术等超...
对产业集群的概念进行了界定,阐述了产业集群中的技术创新集群的概念、类型和特征,在对生命周期理论回顾的基础上,提出了产业集群中技术创新集群生命周期的概念,并进行了初步的研究。
│ 02-kubernetes基础概念.mp4 │ 03-kubeadm初始化Kubernetes集群.mp4 │ 04-kubernetes应用快速入门.mp4 │ 05-kubernetes资源清单定义入门.mp4 │ 06-Kubernetes Pod控制器应用进阶.mp4 │ 07-Kubernetes Pod控制...