background image

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、通过服务器实现共享数据持久化,通过服务器集群实现容错性等等