- 浏览: 506237 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (422)
- 重要 (12)
- BUG解决备忘录 (32)
- 环境搭建 (17)
- 开源组件 (4)
- 数据库 (16)
- 设计模式 (4)
- 测试 (3)
- javascript (5)
- Android (14)
- jdk相关 (9)
- struts2 (10)
- freemark (3)
- 自定义扩展及工具类 (5)
- jdk5新特性及java基础 (13)
- ssh及其他框架 (15)
- linux (32)
- tcp-ip http协议 (8)
- 服务器集群与负载均衡 (34)
- 项目管理相关 (11)
- 实用小技术 (10)
- 架构相关 (14)
- firefox组件 (11)
- spider (6)
- 产品设计 (11)
- PHP (1)
- ws (4)
- lucene (10)
- 其他 (2)
- BI (1)
- NoSQL (3)
- gzip (1)
- ext (4)
- db (6)
- socket (1)
- 源码阅读 (2)
- NIO (2)
- 图片处理 (1)
- java 环境 (2)
- 项目管理 (4)
- 从程序员到项目经理(一):没有捷径 (1)
- bug (1)
- JAVA BASE (8)
- 技术原理 (0)
- 新框架新技术 (1)
- 量化与python (1)
- 系统编程 (0)
- C语言 (0)
- 汇编 (0)
- 算法 (0)
最新评论
-
hyspace:
别逗了,最后一个算法根本不是最优的,sort(function ...
数组去重——一道前端校招试题 -
washingtin:
楼主能把策略和路由的类代码贴出来吗
Spring + iBatis 的多库横向切分简易解决思路 -
sdyjmc:
初略看了一下,没有闹明白啊,均衡负载使用Nginx,sessi ...
J2EE集群原理 I -
shandeai520:
谢谢大神!请教大神一个问题:假如我有三台服务器,连接池的上限是 ...
集群和数据库负载均衡的研究 -
hekuilove:
给lz推荐一下apache commonsStringUtil ...
request 获取 ip
什么是集群呢?总的来说,集群包括两个概念:“负载均衡”(load balancing)和“ 失败接管 ”(failover)
多个客户端同时发出请求,位于前端的负载均衡器根据特定算法,将请求分担给比较空闲的机器,从而实现较高性能和较好的扩展性
当客户端连续向某个服务器发出请求时,该服务器可能处理到一半就宕机了,失败接管系统能够检测出有问题的服务器,将后续的请求转发至其他可用的机器,从而实现容错功能
那么,哪些对象可以被集群呢,答案是:“可以被部署在分布式拓扑的组件 ”
因此,负载均衡和失败接管会发生在哪些 J2EE代码中呢?“仅当你调用分布式对象的方法时 ”
客户端和目标服务器不在一个 JVM上,他们之间通过标准的网络协议进行通讯,这也就给集群提供了用武之地,实现集群效果的设备可以放在边界上对通讯做一些处理。
J2EE的分布式技术包括: JSP,JDBC,EJB,JNDI,WEB SERVICE等等
一. Web层的集群实现
这是最重要最基本的 J2EE集群功能,网络层集群技术包括:Web负载均衡和HTTPSession失败接管
Web负载均衡
负载均衡器可以是一个硬件设备,比如 F5 Load Balancer,也可以是另外一台服务器加一个负载均衡的插件,甚至一个 Linux的嵌入式设备都能胜任。通常,负载均衡包括以下几个特点:
1.实现负载均衡算法
常用的算法有: Round-Robin, Random 和 Weight
Based,算法的最终目标是尽量使每台服务器的负载达到平衡,但以上算法只是根据每台服务器接收的请求来进行均衡,因此都不能完全达到理想化的目标。有
些复杂的算法可以在分发请求之前检测机器的性能,从而决定要由哪台机器来处理请求。
2.健康监测
一旦某台机器宕机了,负载均衡器要能够及时发现情况,并且将请求转交给其他可用的服务器,保证做到“ failover”
3.Session stickiness
即是让一次 session会话的请求都尽量交给一台机器处理,这样省去了服务器之间交换 session数据的开销
HTTPSession失败接管
当session进行到一半时,如果服务器挂了,我们就要想办法让session在另外一台机器上继续进行,而不是让用户重新来过。下面图六解释
了实现HTTPSession
Failover的原理:每次的session都会分配一个唯一的id,这个id以cookies的形式存放在客户端中,负载均衡器通过id分辨请求是属
于哪个session的。在第四步中,服务器 A以某种定义好的方式,定期将
session数据保存起来,一旦出问题,负载均衡器会自动通知另一台服务器 B,让它取出保存的数据,接 A的班
要实现以上基本功能,首先要支持以下特性:
1.全局session id
每个jvm内部都会为每次session维护一个唯一的id,但多个jvm之间的session id会不会重复就很难说了,所以负载均衡器要能够协调各个jvm,使每个session id都能全局唯一。
2.如何备份session
这个跟具体厂商有关,后面会讲到
3.备份的频度和粒度
这个事关负载均衡的性能,因为备份数据的过程直接占用cpu、网络和IO性能
I.数据库方式备份
这是最简单的实现方式,数据库还能在整个系统都当掉时依旧保存好 session 数据,可靠性高,几乎所有 J2EE
实现都提供了这种方式,当然,你的 session 数据必须是可序列化的。但是,这种方式一般推荐不要在 session
中存放过大过多的数据,因为数据库的事务过程相当费资源,但这样也大大限制了它的使用范围,毕竟我们有时必须要在 session 中存放一些大对象
II.内存拷贝方式
这种方式好处很多,首先它省去了数据库连接和事务的开销,其次由于备份的数据已经放在内存中了,也就省去了从数据库恢复的过程
“JavaGroup”是当前tomcat和jboss集群方案的通讯层协议,本质上是一个可靠的组间通讯和管理的toolkit,它的核心功能
在于“ Group membership protocols” 和“message
multicast”,用在集群上非常适合,关于JavaGroup的更多内容,请参考
http://www.jgroups.org/javagroupsnew/docs/index.html
III. Tomcat的实现:多服务器之间互相拷贝内存
虽然实现起来容易,但这种方法的弊端也显而易见,当节点增加时,拷贝量就要成倍增长,性能有时还不如不集群
IV.Weblogic, Jboss 和 WebSphere 的实现:双服务器拷贝
虽然这种方法的性能和扩展性都很好,但也有不少弊端
1 负载均衡器的复杂度加大,因为要记住每个服务器的备份者是谁
2 除了处理请求外,每个服务器还得自己维护备份开销
3 平时大量的内存都被用于备份数据,会增加 jvm 的垃圾收集频率,间接影响性能
4 一旦某个服务器长时间挂掉,那么另一台服务器的负荷就会翻倍,可能也被一起拖垮
为了克服以上缺点,各个厂商都有自己的不同解决方案
V. IBM 的方案:中央服务器
很像是之前的数据库方式吧,只是把数据库换成了一台专门备份的服务器,综合了数据库和内存方式的优点。
1 将备份和请求处理分开,增强了系统的鲁棒性
2 所有的备份数据都在专门的服务器上,节省了其他服务器的内存
3 所有服务器都能存取备份机器上的数据,任何服务器宕机了,负载都能平滑的分配到剩余所有服务器上,而不至于加重某台机器的负担
4 比起数据库连接,备份服务器使用的 socket 连接更加轻量级
比起直接的双服务器互拷内存,这种方式效率还是比较低的,因为还要有个恢复的过程,而且在管理上也增加了系统的复杂度。此外,备份服务器本身也很有可能成为瓶颈。
VI. Sun 的实现:专用数据库
表面上就是数据库的方式,但实际上, Sun JES 应用服务器使用的称为“ HADB ”的数据库是专门为 session 的备份做了优化的,其大部分数据都是直接存放在内存中
* Session 备份的性能考虑
集群中每台服务器都有多个 web 应用,每个应用又同时有数以千记的用户 session ,这些 session
的备份和恢复都会耗费大量资源。更恐怖的是, session 一直在变,比如失效了,比如增加或修改某个属性了,等等。所以如何备份 session
是考验系统架构水平的
何时备份?
不管是用数据库还是内存方式,下面两点都是比较常见的考虑
1. 按 web 请求,即每次请求都进行备份更新,这样可以保证备份的数据是最新的
2. 固定时间备份,虽然不能保证备份的 session 是最新的,但却可以提高性能
备份粒度
1.全部备份,最保险也是最慢的方法
2.备份修改过的 session 。通常的做法是检测 ”HTTPSession.setAttribute()” 或
“HTTPSession.removeAttribute()” 的调用,当然你要保证 session 的状态只能由这两个方法更改,尽管这不是
J2EE 规范的要求。
3.备份修改过的 session 的属性,最节省性能的做法。但是有一点很重要:防止交叉引用。如下图, session 中包含
school 对象,指向一个 student 对象。当 school 对象某个属性改变后,被备份到 AS2 中,它此时引用的是旧的
student 对象。接着 student 对象被单独改变了,也进行了备份,但是 school 中仍然引用旧的 student 。因此这种方法对
web 容器的设计要求很高,尽管它的性能是最好的。
图十三: session 复制中的交叉引用
VII.其他 失效接管的实现
以上不论是数据库还是内存复制,归根结底都要使用 Java 的序列化机制,这给 web 容器的性能造成了不小的影响,因此有些应用服务器使用别的方式进行 session 备份
JRun with Jini
JRun 4 使用 jini 实现集群, jini 的详细介绍请参考 http://java.sun.com/products/jini/2_0index.html
Tangosol with Distributed Cache
Tangosol Coherence™ 提供了一个分布式数据管理平台,可以嵌入到大部分 J2EE 系统中,此外还提供一个分布式缓存系统,能够在多台 jvm 上有效的共享缓存,详情请参考 http://www.tangosol.com/
原文出自 http://www.theserverside.com/tt/articles/article.tss?l=J2EEClustering
发表评论
-
Spring + iBatis 的多库横向切分简易解决思路2
2011-12-26 16:43 2022Table of Contents I. 向Co ... -
Spring + iBatis 的多库横向切分简易解决思路
2011-12-26 16:36 11321.引言 笔者最近在做一个互联网的“类SNS” ... -
tomcat端口被长时间连接,CPU使用率高的原因分析
2011-11-20 23:50 1034tomcat使用的是电脑的80端口。 当客户端访问的 ... -
Nginx+keepalived做双机热备加tomcat负载均衡
2011-10-25 16:55 1620环境说明: nginx1: 192.168.2.4 ... -
MySQL 6.0 集群(cluster)+复制(replicate)
2011-05-05 02:08 1458http://www.net5 . 简介 本 ... -
centos下MySQL主从同步配置
2011-05-05 00:38 1016一、环境 主机: ... -
HadHoop分布式框架配置(二)
2011-03-16 21:42 1124我们假定,你已经下 ... -
HadHoop分布式框架简介(一)
2011-03-16 21:42 1442分布式系统基本原理 分布式系统被设计成可以存 ... -
利用nginx+apache+mysql+php+memcached+squid搭建门户网站
2011-03-06 04:27 1445转自:http://hi.csdn.net/rushcc200 ... -
CentOS 5.3上安装Apache+php+Mysql+phpMyAdmin
2011-03-03 22:00 10791、系统下载 CentOS 开发社区已发布了新的 5.3 版 ... -
1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL
2011-03-03 21:58 1294PHP 5.3.1 MySQL 5.0.89 Ngin ... -
集群和数据库负载均衡的研究
2011-03-01 03:34 1706http://dadupi.blogbus.com/logs/ ... -
Memcached集群/分布式的单点故障
2011-03-01 03:24 1885我看到过这样一段文字 “memcached如何处理容错的? ... -
Memcached 集群架构问题归纳
2011-03-01 02:54 997集群架构方面的问题 o memcached是怎么工作的 ... -
大型bbs架构(squid+nginx)实例分享
2011-03-01 01:50 1495这个架构 基于squid、nginx 和lvs等技术 , ... -
nginx图片服务器的架构方案
2011-03-01 01:44 1708图片服务 通常数据 容量较大,而且访问也频繁,鉴于此,图片 ... -
解密大中型网站架构设计来自威鹏网信息化解决方案专家。
2011-03-01 01:38 984相信很多IT ... -
基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
2011-03-01 00:59 1483基于mod_proxy+Apache 2.2.16+Tomca ... -
揭秘全球最大网站Facebook背后的那些软件
2011-03-01 00:53 10662010年6月,Google公布全球Top 1000网站 ... -
基于nginx的tomcat负载均衡和集群(超简单)
2011-03-01 00:46 1079今天看到"基于apache ...
相关推荐
主要讲J2EE集群原理 ,很不错。 可以供学习
多个客户端同时发出请求,位于前端的负载均衡器根据特定算法,将请求分担给比较空闲的机器,从而实现较高性能和较好的扩展性
NULL 博文链接:https://showlike.iteye.com/blog/1474393
这本书介绍了J2EE项目中集群的原理及运用,由浅入深,把复杂的问题介绍的通俗易懂,集群少不了。
6.5:集群分布式应用(以JBOSS为例) 190 6.6:JNLP原理及应用: 190 6.7:Log4原理及应用: 191 6.8:JFreeChat原理及应用: 191 6.9:几种常用协议 192 7.0:SOA原理 200 8:搜索引擎专题 205 9:CMS(内容发布管理系统)...
22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 ...
22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 ...
22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 ...
22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 ...
一个完整的门户平台可以有效支持以下的技术要求: 基于J2EE的开放式体系结构 支持国际主流标准Portlet、XML、WSRP、JAAS、JNDI、JCA等 客户端程序和服务端程序相结合,既保障系统的高效灵活扩展性,又降低服务器的...
5.5.3 RMI的基本原理 220 5.6 同时作为客户端和服务器的 RMI程序 222 5.6.1 开发客户端程序 222 5.6.2 开发服务器端程序 223 5.7 本章小结 225 第6章 利用JMS实现企业消息处理 226 6.1 面向消息的架构和JMS概述 227 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
│ 第04节:Git基本原理和安装配置使用.avi │ 第05节:TortoiseGit的本地使用.avi │ 第06节:Egit的本地使用.avi │ 第07节:远程使用以及冲突解决.avi │ 第08节:基本业务功能和数据字典.avi │ 第09节:搭建...