




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Terrocotta - 基于JVM的Java应用集群解决方案 前言越来越多的企业关键应用都必须采用集群技术,实现负载均衡(Load Balancing)、容错(Fault Tolerance)和灾难恢复(Failover)。以达到系统可用性(High Availability)和可伸缩性(Scalability)的要求。关于J2EE集群技术的基本原理和常用实现方式,TheServerS有一篇经典的文章:/tt/articles/article.tss?l=J2EEClusteringCSDN上,陶建风先生在他的博客中也作了翻译:/ESoftWind/archive/2006/10/19/1341089.aspx这篇文章虽然发表于2005年,但它对集群技术的概念、原理和实现的基本描述至今依然适用。刚刚接触集群技术的朋友不妨阅读一下这篇文章,以便掌握集群技术的基本知识。我写这篇文章是想介绍一个新的Java集群技术,Terracotta。它采用了与众不同的手段,解决了传统集群技术面临的一些关键问题。可以说为Java集群技术的实现吹来了一股新鲜的空气。Terracotta(/)是一个开源的框架。他的创始人Ari Zilka原本是W的首席架构师。他于2003年成立Terracotta公司,并且将产品开源。该产品在2006年左右趋于成熟,在很多财富500强企业获得成功应用。2009年Terracotta在该年度的JavaOne会议中获得Duke奖,并由Java创始人James Gosling先生亲自把该奖颁发给了Ari Zilka先生。本文着重介绍Terracotta技术的基本原理,尤其是它与其它集群技术的根本区别之处。然后会用一个简单的例子说明Terracotta的基本使用方式。在以后的文章里,我会陆续详细介绍Terrocotta的不同应用场景和技巧。基本原理Terracotta最大的特点是它使用Java二进制代码增强的方式(binary code injection)截获集群节点对数据的修改和获取的请求,利用单独的Terracotta服务器调配数据的流向,以达到最高的网络效率。这两点可以说是与传统集群技术采用的序列化和网络广播机制在实现思路上的根本不同。另外从开发人员角度来说,Teraccotta隐藏在Java API之后,开发人员不需要学习新的API。只需要使用标准的JDK数据结构(java.util.*, java.concurent.*等)、内置Java协同、加锁机制(synchronized, object.wait, object.notify等)开发代码,在Terracotta平台之上就可以把单机基于POJO的应用扩展到多机集群上。因此开发人员的学习曲线很短。Terracotta集群方案由两部分组成:Terracotta驱动器和Terracotta服务器: 其中驱动器部分(也称为Terracotta客户端)与应用程序执行在相同的JVM中。实际上应用程序是由Terracotta驱动器载入到内存中的。载入的同时,会对Java二进制代码进行增强。用户提供Terracotta配置文件指定本地程序中哪些数据需要在集群中共享。这样Terracotta就可以通过增强的代码截获对这些共享数据的读写请求,并且与Terracotta服务器协作,实现共享数据在集群中的一致性。对于Java代码中使用的“锁”也是利用相同的机制实现全局协同;Terracotta服务器则首先记录所有节点对共享数据和锁的访问信息,为读取数据的节点提供最新数据,把修改的数据通知给正在使用中这些数据的节点等等。服务器除了协调节点间数据的获取和变化通知以外,还利用其本地内存和硬盘实现共享数据的缓存和持久化。由于Terracotta驱动器和服务器都有缓存数据的能力,有时我们也称Terracotta驱动器为一级缓存L1,服务器为二级缓存L2。Terracotta这一体系架构跟其它集群解决方案相比,有如下几点好处:1、避免Java序列化,只把被修改的字段的数据传递给服务器和使用节点,大大减少CPU和内存消耗;2、避免数据的广播,只把修改的数据通知给正在使用该数据的节点,大大降低了网络流量;3、利用服务器实现网络扩展内存,使得有限内存的客户端节点可以访问远大于其内存容量的数据结构,而不必担心发生内存逸出的异常;4、通过服务器实现共享数据持久化,通过服务器集群实现容错性等等5、无须学习新的API,大大降低开发成本企业版的Terracotta服务器还提供了数据分片(striping)的功能,使得集群吞吐量随着Terracotta服务器数量的增加达到线性增长。Terracotta插件在核心产品的基础上,Terracotta制定了通用扩展机制Terracotta Integration Module TIM。Terracotta本身提供了大量的插件,应用于不同的集群应用场景,比如Tomcat session复制、Spring Security整合、与Hibernate的整合、异步数据库持久化等等。所有官方TIM可以在如下网站中找到:/releases/projects.html用户也可以开发新的TIM,以适应自己的应用需求。比如TIM-Session实现了Web应用服务器结点间session信息的共享。由于它利用了Terracotta集群间高效数据共享的机制实现session共享,整个集群的吞吐量可以随着服务器节点的增加而线性增长。与之相比,Tomcat自带的session集群实现,最多只能支持到4个节点左右。当节点数目进一步增加的时候,各节点的CPU使用率和网络负载会达到极限,反而降低整个集群的吞吐量。基于Terracotta的Tomcat集群可以达到几十个节点甚至更多。我会在以后的文章中详细介绍重要的TIM插件和他们的应用场景。基于Terracotta的Java集群下面用一个简单的Java程序描述如何利用Teracotta事件Java集群。这个例子大概只比一般的Hello World稍微复杂一点。目的主要是介绍使用Terracotta的最简单流程。我会在以后的文章中详细介绍不同应用场景下Terracotta不用的使用方式和解决问题的方法。首先看看Java代码。这是一个简单的多线程程序,启动后生成两个线程,给一个共享的计数器加一,然后打印出计数器的值:1 package simpleparallel;23 public class Main implements Runnable4 5 private Object lock = new Object();6 private int count = 0;7 private static Main inst = new Main();89 /*10 * param args11 */12 public static void main(String args) 13 new Thread(inst).start();14 new Thread(inst).start();15 1617 public void run() 18 /keep increasing count by one every few seconds1920 while(true)21 synchronized(lock)22 count+;23 System.out.println(Thread.currentThread().getName() + increased count to:+count);24 25 try26 Thread.sleep(int)(5000*Math.random();27 28 catch(Exception e)29 e.printStackTrace();30 31 32 33 3435 Details注意代码中没有任何特殊的JDK以外的API。单独执行这个程序,会看到如下现实的结果。 现在我们要把这个代码放到集群上。目的是让多个JVM共同访问同一个计数器,并且能够互斥地对它进行累加,而在全集群范围内不会产生数据冲突。具体的操作步骤如下:1、下载并安装JDK 1.5或1.6,设置系统的JAVA_HOME环境变量2、下载、安装Terracotta环境目前最新的Terracotta版本是3.0.1, 不过3.1马上就要发布了,所以我们使用3.1 stable1,可以从下列地址下载:/web/display/orgsite/Download或者直接从这个地址下载3.1 stable1 。用 java -jar terracotta-3.1.0-stable1-installer.jar 启动安装程序,把Terracotta安装到指定的目标目录。假设安装目录是 $TC_HOME(Unix/Linux)或%TC_HOME%(Windows)3、到刚才的Java代码的开发目录下,确认代码已经用javac编译好。假设编译目标文件在bin目录下。4、创建一个文本文件tc-config.xml, 把下面的配置保存在该文件中:36 37 38 39 40 951041 952042 terracotta/server-data43 terracotta/server-logs44 terracotta/cluster-statistics45 46 47 48 terracotta/client-logs49 terracotta/client-statistics/%D50 51 52 53 54 55 simpleparallel.Main56 57 58 59 60 simpleparallel.Main.inst61 62 63 64 65 void simpleparallel.Main.run()66 write67 68 69 70 71 Details5、启动Terracotta服务器:$TC_HOME/bin/start-tc-server.sh or%TC_HOME%binstart-tc-server.bat6、打开两个或者更多的Terminal或DOS窗口,分别启动一个测试程序:$TC_HOME/bin/dso-java.sh -cp . simpleparallel.Mainor%TC_HOME%bindso-java.bat -cp . simpleparallel.Main下图是同时执行三个程序的屏幕截图: 可见计数器已经在集群中被3个Java程序实例所共享。每个程序有两个线程访问计数器。这样整个集群中实际上有6个线程在同时累加计数器。从上面的启动顺序看,整个Java代码没有作任何改动。只是增加了一个tc-config.xml文件,并且用Terracotta的dso-java启动程序启动这个Java程序就可以了。tc-config.xml文件是使用Terracotta时最重要的配置文件。这里面最重要的几个配置为:1、roots:用来制定集群中要共享的数据。 simpleparallel.Main.inst 我们的例子制定共享Main类的inst对象,它包含的count和lock对象也就随之被整个集群共享了。2、locks:用来制定对共享数据操作的时候采用的加锁机制。 void simpleparallel.Main.run() write 这个例子中给Main.run()方法定义了自动锁(autolock)。他告诉Teraccotta当这个方法对共享的数据加锁的时候(注意:Main.lock对象是共享的),使得这个锁在整个集群范围内生效。这样一来集群中任何一个线程锁住这个对象的时候,其它任何线程都要等这个锁解除后才能访问被保护的数据(Main.count)。这样计数器的访问也就在整个集群中得到了保护。总结Terracotta是唯一一个在JVM层实现Java集群的平台。开发团队可以在对已
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年艺术创作与理论评价考试题及答案
- x射线考试题及答案
- 武汉合唱团面试题及答案
- 网络工程师成功案例试题及答案
- 西方政治中的社会责任探讨试题及答案
- 机电工程2025年创新思维试题及答案
- 软件设计师考试心理素质提升方法及试题与答案
- 教育公平实证研究与政策建议试题及答案
- 反腐败斗争的政治环境与动力分析试题及答案
- 西方国家的金融政策与政治体系试题及答案
- 国能集团工会工作报告
- 河南大河网数字科技有限公司招聘笔试题库2025
- 补缴社保员工协议书
- 水电项目实施中的环境保护措施试题及答案
- 2025标准劳动合同范本及模板
- 2025届广东省佛山市顺德区龙江镇八下物理期末统考试题含解析
- GB 7718-2025食品安全国家标准预包装食品标签通则
- 2025中考语文常考作文押题(10大主题+10篇范文)
- 安全工程安全系统工程课程设计
- SH3508-2011附录A填写示例
- 机械设计外文文献翻译、中英文翻译、外文翻译
评论
0/150
提交评论