越来越多的企业关键应用都必须采用集群技术,实现负载均衡(Load Balancing)、容错(Fault Tolerance)和灾难恢复(Failover)。以达到系统可用性(High Availability)和可伸缩性(Scalability)的要求。
前言
优快云上,陶建风先生在他的博客中也作了翻译: 这篇文章虽然发表于2005年,但它对集群技术的概念、原理和实现的基本描述至今依然适用。刚刚接触集群技术的朋友不妨阅读一下这篇文章,以便掌握集群技术的基本知识。 我写这篇文章是想介绍一个新的Java集群技术,Terracotta。它采用了与众不同的手段,解决了传统集群技术面临的一些关键问题。可以说为Java集群技术的实现吹来了一股新鲜的空气。 Terracotta(http://terracotta.org/)是一个开源的框架。他的创始人Ari Zilka原本是Walmat.com的首席架构师。他于2003年成立Terracotta公司,并且将产品开源。该产品在2006年左右趋于成熟,在很多财富500强企业获得成功应用。2009年Terracotta在该年度的JavaOne会议中获得Duke奖,并由Java创始人James Gosling先生亲自把该奖颁发给了Ari Zilka先生。 本文着重介绍Terracotta技术的基本原理,尤其是它与其它集群技术的根本区别之处。然后会用一个简单的例子说明Terracotta的基本使用方式。在以后的文章里,我会陆续详细介绍Terrocotta的不同应用场景和技巧。 基本原理 Terracotta集群方案由两部分组成:Terracotta驱动器和Terracotta服务器: 其中驱动器部分(也称为Terracotta客户端)与应用程序执行在相同的JVM中。实际上应用程序是由Terracotta驱动器载入到内存中的。载入的同时,会对Java二进制代码进行增强。用户提供Terracotta配置文件指定本地程序中哪些数据需要在集群中共享。这样Terracotta就可以通过增强的代码截获对这些共享数据的读写请求,并且与Terracotta服务器协作,实现共享数据在集群中的一致性。对于Java代码中使用的“锁”也是利用相同的机制实现全局协同; 由于Terracotta驱动器和服务器都有缓存数据的能力,有时我们也称Terracotta驱动器为一级缓存L1,服务器为二级缓存L2。 Terracotta这一体系架构跟其它集群解决方案相比,有如下几点好处: Terracotta插件 比如TIM-Session实现了Web应用服务器结点间session信息的共享。由于它利用了Terracotta集群间高效数据共享的机制实现session共享,整个集群的吞吐量可以随着服务器节点的增加而线性增长。与之相比,Tomcat自带的session集群实现,最多只能支持到4个节点左右。当节点数目进一步增加的时候,各节点的CPU使用率和网络负载会达到极限,反而降低整个集群的吞吐量。基于Terracotta的Tomcat集群可以达到几十个节点甚至更多。 我会在以后的文章中详细介绍重要的TIM插件和他们的应用场景。 基于Terracotta的Java集群 首先看看Java代码。这是一个简单的多线程程序,启动后生成两个线程,给一个共享的计数器加一,然后打印出计数器的值:
public class Main implements Runnable{ private Object lock = new Object(); private int count = 0; private static Main inst = new Main(); /** * @param args */ public static void main(String[] args) { new Thread(inst).start(); new Thread(inst).start(); } public void run() { //keep increasing count by one every few seconds while(true){ synchronized(lock){ count++; System.out.println(Thread.currentThread().getName() + " increased count to:"+count); } try{ Thread.sleep((int)(5000*Math.random())); } catch(Exception e){ e.printStackTrace(); } } } } Details 注意代码中没有任何特殊的JDK以外的API。 现在我们要把这个代码放到集群上。目的是让多个JVM共同访问同一个计数器,并且能够互斥地对它进行累加,而在全集群范围内不会产生数据冲突。 目前最新的Terracotta版本是3.0.1, 不过3.1马上就要发布了,所以我们使用3.1 stable1,可以从下列地址下载:
<con:tc-config xmlns:con="http://www.terracotta.org/config"> <servers> <server host="%i" name="localhost"> <dso-port>9510</dso-port> <jmx-port>9520</jmx-port> <data>terracotta/server-data</data> <logs>terracotta/server-logs</logs> <statistics>terracotta/cluster-statistics</statistics> </server> </servers> <clients> <logs>terracotta/client-logs</logs> <statistics>terracotta/client-statistics/%D</statistics> </clients> <application> <dso> <instrumented-classes> <include> <class-expression>simpleparallel.Main</class-expression> </include> </instrumented-classes> <roots> <root> <field-name>simpleparallel.Main.inst</field-name> </root> </roots> <locks> <autolock> <method-expression>void simpleparallel.Main.run()</method-expression> <lock-level>write</lock-level> </autolock> </locks> </dso> </application> </con:tc-config> Details 6、打开两个或者更多的Terminal或DOS窗口,分别启动一个测试程序: 下图是同时执行三个程序的屏幕截图: 从上面的启动顺序看,整个Java代码没有作任何改动。只是增加了一个tc-config.xml文件,并且用Terracotta的dso-java启动程序启动这个Java程序就可以了。 这里面最重要的几个配置为: 总结 今天介绍的主要还是Terracotta的基本原理。实际开发的Java应用大部分都是基于Web的应用,并且有很多系统使用了Hibernate, Tomcat, Spring等工具和平台。在以后的文章中我会陆续介绍Terracotta是如何支持这些工具的。 |
本文介绍了Terracotta,一种用于Java集群的开源框架,它通过独特的二进制代码注入方式和服务器协调,实现了高效的集群管理。文章详细解释了Terracotta的基本原理、与传统集群技术的区别、集群方案组成以及优势特性。并通过一个简单的Java程序实例,展示了如何将单机应用扩展到多机集群环境。此外,文章还提到了Terracotta提供的插件系统和集群应用场景,以及如何利用Terracotta实现数据共享、协同和持久化等功能。



324

被折叠的 条评论
为什么被折叠?



