Terracotta in Action (1)

1.  Introduction

    Terracotta 在其官方文档中的定义是一种透明的集群服务,也可以看成是JVM级别的集群。其中“透明”的含义并不是指已有程序无需做任何改动就可以使用Terracotta ,但是使用Terracotta 的代码无需实现特定的接口,也不依赖各种magic beans。通常意义上的“集群”是指多个应用通过网络通信、共享数据等,但是这种集群方式通常要求在应用程序中加入集群相关的代码。Terracotta 是在应用程序之下,JVM级别上的集群。这使得应用程序从复杂的集群相关的逻辑中解放出来,从而可以关注在业务逻辑本身。

 

 

    Terracotta是开源的,并且可以集成在很多主流的开源软件中,如Jetty、Tomcat、Spring、Geronimo和EHCache等。Terracotta 的核心组件有两个:客户端类库(client libraries)和服务端进程(Terracotta server),它们之间通过TCP/IP通信。Terracotta server独立于各个应用程序,它负责对集群的集中管理;客户端类库则用于加入集群。

    Terracotta 的最新版本是2.7.3,可以从http://www.terracotta.org/下载。其Windows安装文件100多M。默认的安装目录是C:\Program Files\Terracotta。安装后进入到bin目录执行start-tc-server.bat就可以启动Terracotta  server。从Windows开始菜单TerraCotta 2.7.3 -> Administrator Console启动Terracotta 的管理控制台。启动管理控制台后,使用默认的Server Host和JMX Port,点击Connect按钮。当TerraCotta管理控制台连接到Terracotta  server之后,会显示类似于下图的界面:


    其左侧树形控件的Servers节点会显示连接到的Terracotta server的详细信息。此时由于没有客户端程序连接到Terracotta server,因此Cluster Object节点和Clients节点内容为空。接下来演示一个Terracotta 附带的例子应用。通过Terracotta 2.7.3 -> Terracotta Welcome启动Terracotta Welcome程序,单击Sample Applications链接。在Sample Application Launcher中单击Shared Graphics Editor下边的Launch链接。在Shared Editor启动后,随意绘制几个图形。然后 回到Sample Application Launcher中再次单击Shared Graphics Editor下边的Launch链接。第二次启动的Shared Editor中会显示出之前绘制的图形,并且在任何一个Shared Editor中绘制的图形都会被同步到另外的Shared Editor中。接下来回到Terracotta 管理控制台,可以看到Clients节点中包含了两个客户端程序的信息。Cluster Object节点中包含了共享对象的信息。此时如果把所有的Shared Editor都关闭,那么Clients节点的内容变为空,但是Cluster Object节点中仍然包含了共享对象的信息。如果再次启动一个Shared Editor,那么这个Shared Editor中会显示之前的Shared Editor关闭时的图形。最后,通过bin目录中的stop-tc-server.bat停止Terracotta  server。

    最常见的应用Terracotta 的场景是分布式缓存、Session复制和网格计算等。通过Terracotta 在集群中共享的对象不必是可序列化的(但必须是portable的,portable是Terracotta 引进的一个概念,会在以后详细介绍)。当集群中的某个应用对共享对象进行修改的时候,这些修改会被同步到Terracotta server。Terracotta server可以对这些修改进行持久化保存,同时Terracotta server可以被配置成Master/Slave模式,这些都提供了高可用性。

    设想一个使用Terracotta 进行Session复制的场景: Tomcat A、B和C通过TerraCotta进行session复制,如果使用sticky load balancing,那么相同session的多个请求都会被发送到相同的Tomcat,比如A。A对该session的修改会被同步到Terracotta server,但是Terracotta server不会将这些修改同步到B和C(因为在B和C上不会访问到这个session),这样就减少了数据同步的次数。假设A由于某种故障而停止,那么load balancer可能会将该session的请求发送给B,在B的应用访问这个session的时候,TerraCotta才会将A之前对这个session的修改同步到B。此外,由于Terracotta 在同步的时候并没有使用序列化机制,因此它在同步数据的时候并不是每次都将整个session对象序列化后进行传输,而只是对session里改变的部分进行同步(Terracotta 使用了字节码加强的技术,拦截了包括内存读写在内的指令),这样就大大减少了网络传输的数据量。

你可能感兴趣的:(terracotta)