CLOVER🍀

That was when it all began.

Infinispan Server 5.3を使ってみる

Infinispan 5.3になってから、ずっとEmbedded Cacheしか使っていなかったのですが、6.0に向けた修正内容を見ていて、Remote Cacheでクエリが使えるようになりそうというところがちょっと気になりました。

Remote Query Design in Infinispan
https://community.jboss.org/wiki/RemoteQueryDesignInInfinispan

で、そういえばRemote Cacheをこのところ使ってないなぁと思って、最新安定版の5.3のServerを落として展開してみると…

$ unzip infinispan-server-5.3.0.Final-bin.zip
$ cd infinispan-server-5.3.0.Final/

なんか、5.2までとディレクトリ構成が全然違うんですが…。

$ ll
合計 336
drwxr-xr-x 8 xxxxx xxxxx   4096 Jun 25 17:14 ./
drwxrwxr-x 4 xxxxx xxxxx   4096 Aug 24 00:22 ../
-rw-r--r-- 1 xxxxx xxxxx  26530 Jun 25 17:14 LICENSE.txt
-rw-r--r-- 1 xxxxx xxxxx   2617 Jun 25 17:14 README.txt
drwxr-xr-x 3 xxxxx xxxxx   4096 Jun 25 17:14 bin/
drwxr-xr-x 4 xxxxx xxxxx   4096 Jun 25 17:14 client/
drwxr-xr-x 4 xxxxx xxxxx   4096 Jun 25 17:14 docs/
-rw-r--r-- 1 xxxxx xxxxx 277941 Jun 25 17:14 jboss-modules.jar
drwxr-xr-x 3 xxxxx xxxxx   4096 Jun 25 17:14 modules/
drwxr-xr-x 2 xxxxx xxxxx   4096 Jun 25 17:14 rest/
drwxr-xr-x 5 xxxxx xxxxx   4096 Jun 25 17:14 standalone/

あ、ダウンロードはこちらから。

Downloads
http://www.jboss.org/infinispan/downloads

設定ファイルの場所も、全然違います。
$ ll standalone/configuration/

合計 236
drwxr-xr-x 2 xxxxx xxxxx  4096 Jun 25 17:14 ./
drwxr-xr-x 5 xxxxx xxxxx  4096 Jun 25 17:14 ../
-rw-r--r-- 1 xxxxx xxxxx   634 Jun 25 17:14 application-roles.properties
-rw-r--r-- 1 xxxxx xxxxx   812 Jun 25 17:14 application-users.properties
-rw-r--r-- 1 xxxxx xxxxx 14213 Jun 25 17:14 clustered-ccl.xml
-rw-r--r-- 1 xxxxx xxxxx 16226 Jun 25 17:14 clustered-jdbc.xml
-rw-r--r-- 1 xxxxx xxxxx 12748 Jun 25 17:14 clustered-storage-only.xml
-rw-r--r-- 1 xxxxx xxxxx 13137 Jun 25 17:14 clustered-topology.xml
-rw-r--r-- 1 xxxxx xxxxx 12797 Jun 25 17:14 clustered-two-nodes.xml
-rw-r--r-- 1 xxxxx xxxxx 14656 Jun 25 17:14 clustered-xsite.xml
-rw-r--r-- 1 xxxxx xxxxx 13395 Jun 25 17:14 clustered.xml
-rw-r--r-- 1 xxxxx xxxxx  2231 Jun 25 17:14 keystore_client.jks
-rw-r--r-- 1 xxxxx xxxxx  2243 Jun 25 17:14 keystore_server.jks
-rw-r--r-- 1 xxxxx xxxxx  2695 Jun 25 17:14 logging.properties
-rw------- 1 xxxxx xxxxx   836 Jun 25 17:14 mgmt-users.properties
-rw-r--r-- 1 xxxxx xxxxx 10198 Jun 25 17:14 standalone-compatibility-mode.xml
-rw-r--r-- 1 xxxxx xxxxx 11196 Jun 25 17:14 standalone-fcs-local.xml
-rw-r--r-- 1 xxxxx xxxxx 10306 Jun 25 17:14 standalone-hotrod-multiple.xml
-rw-r--r-- 1 xxxxx xxxxx 10253 Jun 25 17:14 standalone-hotrod-rolling-upgrade.xml
-rw-r--r-- 1 xxxxx xxxxx 10462 Jun 25 17:14 standalone-hotrod-ssl.xml
-rw-r--r-- 1 xxxxx xxxxx 11514 Jun 25 17:14 standalone-rcs-local.xml
-rw-r--r-- 1 xxxxx xxxxx 10417 Jun 25 17:14 standalone.xml
-rw-r--r-- 1 xxxxx xxxxx   953 Jun 25 17:14 truststore_client.jks
-rw-r--r-- 1 xxxxx xxxxx   940 Jun 25 17:14 truststore_server.jks

起動スクリプトは、binディレクトリにstandalone.shもしくは.bat、そしてclustered.shもしくは.batとなっています。起動オプションで使用できる設定ファイルも指定できるようなのですが、デフォルトではそれぞれstandalone.xml、clusterd.xmlが該当します。

というか、設定ファイルの形式も5.2までと全然違うんですが…。
standalone/configuration/standalone.xml

<?xml version='1.0' encoding='UTF-8'?>

<server xmlns="urn:jboss:domain:1.4">
    <extensions>
        <extension module="org.infinispan.server.endpoint"/>
        <extension module="org.jboss.as.clustering.infinispan"/>
        <extension module="org.jboss.as.connector"/>
        <extension module="org.jboss.as.jdr"/>
        <extension module="org.jboss.as.jmx"/>
        <extension module="org.jboss.as.logging"/>
        <extension module="org.jboss.as.naming"/>
        <extension module="org.jboss.as.remoting"/>
        <extension module="org.jboss.as.security"/>
        <extension module="org.jboss.as.threads"/>
        <extension module="org.jboss.as.transactions"/>
        <extension module="org.jboss.as.web"/>
    </extensions>
    <management>

〜省略〜

    </management>
    <profile>

〜省略〜

        <subsystem xmlns="urn:infinispan:server:endpoint:5.3">
            <hotrod-connector socket-binding="hotrod" cache-container="local">
                <topology-state-transfer lazy-retrieval="false" lock-timeout="1000" replication-timeout="5000"/>
            </hotrod-connector>
            <memcached-connector socket-binding="memcached" cache-container="local"/>
            <rest-connector virtual-server="default-host" cache-container="local" security-domain="other" auth-method="BASIC"/>
            <websocket-connector socket-binding="websocket" cache-container="local"/>
        </subsystem>

〜省略〜

        <subsystem xmlns="urn:infinispan:server:core:5.3" default-cache-container="local">
            <cache-container name="local" default-cache="default">
                <local-cache name="default" start="EAGER">
                    <locking isolation="NONE" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
                    <transaction mode="NONE"/>
                </local-cache>
                <local-cache name="memcachedCache" start="EAGER">
                    <locking isolation="NONE" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
                    <transaction mode="NONE"/>
                </local-cache>
                <local-cache name="namedCache" start="EAGER"/>
            </cache-container>
            <cache-container name="security"/>
        </subsystem>

〜省略〜

    </profile>

〜省略〜

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="hotrod" port="11222"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="memcached" port="11211"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <socket-binding name="websocket" port="8181"/>
    </socket-binding-group>
</server>

この設定ファイルの書き方は…というか、Infinispan Serverって、JBoss As 7.2で動いてるんですか?

Infinispan Server
https://docs.jboss.org/author/display/ISPN/Infinispan+Server

設定ファイルで、Cacheの設定はこの部分

        <subsystem xmlns="urn:infinispan:server:core:5.3" default-cache-container="local">
            <cache-container name="local" default-cache="default">
                <local-cache name="default" start="EAGER">
                    <locking isolation="NONE" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
                    <transaction mode="NONE"/>
                </local-cache>
                <local-cache name="memcachedCache" start="EAGER">
                    <locking isolation="NONE" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
                    <transaction mode="NONE"/>
                </local-cache>
                <local-cache name="namedCache" start="EAGER"/>
            </cache-container>
            <cache-container name="security"/>
        </subsystem>

Hot RodやMemcachedプロトコルなどのリッスンポートは、ここを見ればわかります。

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="hotrod" port="11222"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="memcached" port="11211"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <socket-binding name="websocket" port="8181"/>
    </socket-binding-group>

clustered.xmlでは、これにJGroupsの設定が加わります。

5.2からの変わりっぷりにはだいぶ面食らいましたが、こちらを眺めているとなんとか設定できそうな気がします。

Infinispan Server
https://docs.jboss.org/author/display/ISPN/Infinispan+Server

せっかくなので、ちょっと起動してみましょう。今回は、standalone.shで起動することにします。

$ bin/standalone.sh
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /xxxxx/infinispan-server-5.3.0.Final

  JAVA: /usr/lib/jvm/java-7-oracle/bin/java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

00:34:55,817 INFO  [org.jboss.modules] (main) JBoss Modules version 1.2.0.CR1
00:34:56,206 INFO  [org.jboss.msc] (main) JBoss MSC version 1.0.4.GA
00:34:56,380 INFO  [org.jboss.as] (MSC service thread 1-3) JBAS015899: JBoss Infinispan Server 5.3.0.Final (AS 7.2.0.Final) starting

〜省略〜

00:34:58,949 INFO  [org.apache.coyote.http11] (MSC service thread 1-4) JBWEB003000: Coyote HTTP/1.1 starting on: http-/127.0.0.1:8080
00:34:59,527 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-3) JDGS010000: HotRodServer starting
00:34:59,548 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-3) JDGS010001: HotRodServer listening on 127.0.0.1:11222
00:34:59,748 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-1) JDGS010000: WebSocketServer starting
00:34:59,759 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-1) JDGS010001: WebSocketServer listening on 127.0.0.1:8181

〜省略〜

00:35:01,410 INFO  [org.jboss.as.clustering.infinispan] (MSC service thread 1-3) JBAS010281: Started default cache from local container

〜省略〜

00:35:01,474 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-2) JDGS010000: REST starting
00:35:01,505 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-4) ISPN000031: MBeans were successfully registered to the platform MBean server.
00:35:01,507 INFO  [org.jboss.as.clustering.infinispan] (MSC service thread 1-4) JBAS010281: Started namedCache cache from local container
00:35:01,596 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-4) ISPN000031: MBeans were successfully registered to the platform MBean server.
00:35:01,597 INFO  [org.jboss.as.clustering.infinispan] (MSC service thread 1-4) JBAS010281: Started memcachedCache cache from local container
00:35:01,627 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-4) JDGS010000: MemcachedServer starting
00:35:01,628 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-4) JDGS010001: MemcachedServer listening on 127.0.0.1:11211
00:35:02,061 INFO  [org.infinispan.server.endpoint] (MSC service thread 1-2) JDGS010002: REST mapped to /rest
00:35:02,213 INFO  [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:9999
00:35:02,217 INFO  [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:4447
00:35:02,614 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management
00:35:02,617 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
00:35:02,618 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss Infinispan Server 5.3.0.Final (AS 7.2.0.Final) started in 7483ms - Started 92 of 130 services (38 services are passive or on-demand)

5.2までのInfinispan Serverだと、起動時にHot Rod、Memcachedなど、どのプロトコルを使うかを決めていますが、5.3からは全部使えそうな雰囲気ですね。

あ、この方法で起動した場合は、停止はCtrl-Cで。

JGroupsを使ったクラスタを試したい場合は、

$ bin/standalone.sh -c clustered.xml

として「-c」スイッチ付きで設定ファイルを指定するか、

$ bin/clustered.sh

を使って起動してください。

ログファイルは、デフォルトだと

standalone/log/server.log

に出力されます。

それでは、Hot Rod Clientを使って、ちょっと接続してみます。
build.sbt

name := "infinispan-remote-53"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.10.2"

scalacOptions += "-deprecation"

resolvers += "JBoss Public Maven Repository Group" at "http://repository.jboss.org/nexus/content/groups/public-jboss"

libraryDependencies ++= Seq(
  "org.infinispan" % "infinispan-core" % "5.3.0.Final",
  "org.infinispan" % "infinispan-client-hotrod" % "5.3.0.Final",
  "net.jcip" % "jcip-annotations" % "1.0"
)

src/main/scala/InfinispanRemote.scala

import org.infinispan.client.hotrod.RemoteCacheManager
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder

object InfinispanRemote {
  def main(args: Array[String]): Unit = {
    val manager =
      new RemoteCacheManager(
        new ConfigurationBuilder()
          .addServers("localhost:11222")
          .build)
    val cache = manager.getCache[String, String]("namedCache")

    try {
      val range = 1 to 5

      if (cache.size > 0) {
        for (i <- range) {
          require(cache.get(s"key$i") == s"value$i")
        }
      }

      for (i <- range) {
        cache.put(s"key$i", s"value$i")
      }

      for (i <- range) {
        require(cache.get(s"key$i") == s"value$i")
      }
    } finally {
      manager.stop()
    }
  }
}

Cacheは、デフォルトで用意されているnamedCacheを使いました。

2回目以降の起動では、前回起動時に放り込んだエントリの内容を検証するコードになっています。

では、このままMemcachedプロトコルを試してみます。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set key1 0 0 6
value1
STORED
get key1
VALUE key1 0 6
value1
END
quit
Connection closed by foreign host.

Memcachedプロトコルを使用した場合は、memcachedCacheという名前のCacheを使うようですよ。このCacheの名前を単純に変更すると、Infinispan Serverの起動に失敗するようになりましたし。

先のプログラムを動かして、telnetでmemcachedCacheに値を入れた後にCLIでstatsしてみると

$ bin/ispn-cli.sh 
[disconnected//]> connect
8 24, 2013 12:46:01 午前 org.xnio.Xnio <clinit>
INFO: XNIO Version 3.0.7.GA
8 24, 2013 12:46:01 午前 org.xnio.nio.NioXnio <clinit>
INFO: XNIO NIO Implementation Version 3.0.7.GA
8 24, 2013 12:46:01 午前 org.jboss.remoting3.EndpointImpl <clinit>
INFO: JBoss Remoting version 3.2.14.GA
[remoting://localhost:9999/local/]> cache namedCache
[remoting://localhost:9999/local/namedCache]> stats
Statistics: {
  stores: 10
  averageRemoveTime: 0
  elapsedTime: 165
  numberOfEntries: 5
  removeHits: 0
  averageReadTime: 0
  removeMisses: 0
  readWriteRatio: 2.0
  statisticsEnabled: true
  hitRatio: 1.0
  evictions: 0
  timeSinceReset: 165
  misses: 0
  averageWriteTime: 0
  hits: 20
}
LockManager: {
  concurrencyLevel: 1000
  numberOfLocksAvailable: 0
  numberOfLocksHeld: 0
}

[remoting://localhost:9999/local/namedCache]> cache memcachedCache
[remoting://localhost:9999/local/memcachedCache]> stats
Statistics: {
  stores: 1
  averageRemoveTime: 0
  elapsedTime: 170
  numberOfEntries: 1
  removeHits: 0
  averageReadTime: 0
  removeMisses: 0
  readWriteRatio: 1.0
  statisticsEnabled: true
  hitRatio: 1.0
  evictions: 0
  timeSinceReset: 170
  misses: 0
  averageWriteTime: 0
  hits: 1
}
LockManager: {
  concurrencyLevel: 1000
  numberOfLocksAvailable: 0
  numberOfLocksHeld: 0
}

それぞれ、投入結果が反映されていますしね。

Infinispan Serverの方は全然見てなかったから、知らなかったです。6.0から機能も増えるみたいですし、ちょっとチェックしておきましょう。