Open Terracottaは、複数のJVMをまたいでJavaオブジェクトをキャッシュすることができるクラスタリングソリューションだ。以前は商用製品であったものが、2006年末にオープンソース化された。ライセンスは、Mozilla Public LicenseをベースとしたTerracotta Public Licenseであり、商用プロダクトにも問題なく利用できる。

なぜTerracottaが必要か

アプリケーションにとって「パフォーマンス」は重要だ。特にデータベースを使用するアプリケーションはデータベースへのネットワークアクセス、検索クエリの実行性能などに足を引っ張られてパフォーマンスが思うように出ないことも多い。

そこで考え付くのが検索結果をキャッシュして再利用することであるが、これには別の問題がある。一つは、キャッシュを利用すると将来的な拡張性を損ねる可能性があることである。例えばスケーラビリティを向上させるべくアプリケーションサーバを複数台利用したとする。そうした環境で、個々のサーバが自分専用のキャッシュを持ち、キャッシュに対する書き込みも行うような状況だと、キャッシュの不整合が生じてしまう。もう一つの問題は、複数のプロセスがキャッシュを共有している場合、同時にキャッシュを更新してもデータが破壊されないことを保証しなくてはならないということである。ほかにもキャッシュが肥大化してRAMに乗り切らなくなった場合どうするか、などだ。

こうした問題を、スマートに解決しようというソフトウェアがOpen Terracottaである。

Open Terracottaの特色

Open Terracottaの特色は「JVMレベルのクラスタリング」--「シングルJVM用のコードをいじることなく、複数JVM間でのオブジェクト共有が可能」という点である。

仕組みとしては、クラスタリングを調停し、オブジェクトのマスターを持つサーバに対して、個々のJVMがクライアントとなり、Javaオブジェクトのフィールド変更があった場合通知を行うことによってクラスタリングが実現されている。

また、JVMをまたいだスレッド間の同期(synchronized)も適切に行われる。つまり、あるJVM上のスレッドがオブジェクトのロックを獲得したら、クラスタリングに参加している全てのJVM上のスレッドがそのロックを獲得できるまでウェイトするのだ。こうした仕組みは、クラスをロードする前にバイトコードを操作することで実現されており、アプリケーションにとっては透過的に行われる。

こうした機能を持つOpen Terracottaの用途は、HTTPセッションのクラスタリング、分散キャッシュ、JVM単位での作業分割など様々だ。

ではさっそくインストールして動かしてみよう。