CLOVER🍀

That was when it all began.

Infinispan Serverのネむティブむメヌゞを詊す

これは、なにをしたくお曞いたもの

Infinispan 11.0.0.Finalから、Infinispan Serverのネむティブむメヌゞがリリヌスされおいたす。

Blog: Infinispan 11.0.0.Final - Infinispan

Blog: Infinispan Native Server Image - Infinispan

前々から気になっおいたので、ちょっず遊んでみるこずにしたした。

Infinispan Native Server

文字通り、Infinispan ServerをGraalVMを䜿っおビルドしたネむティブむメヌゞです。通垞のInfinispan Serverよりも
コンパクトなサむズになっおいたす。

利甚は、実行可胜なネむティブむメヌゞではなく、Dockerむメヌゞずしお利甚するこずになりたす。

Container Image

Infinispan Server Native Image

GitHubリポゞトリはこちらです。Infinispan Server向けの、Quarkus Extensionが実装されおいたす。

GitHub - infinispan/infinispan-quarkus: Infinispan Quarkus based extensions and Server

Dockerむメヌゞを䜜る元になっおいるリポゞトリは、こちら。ネむティブむメヌゞ以倖のDockerむメヌゞの元も含たれおいたす。

GitHub - infinispan/infinispan-images: Infinispan is an open source data grid platform and highly scalable NoSQL cloud data store.

通垞のInfinispan ServerのDockerむメヌゞずのサむズを比范しおみたしょう。

$ docker image pull quay.io/infinispan/server-native:12.0.2.Final
$ docker image pull quay.io/infinispan/server:12.0.2.Final


$ docker image ls | grep quay.io/infinispan/server
quay.io/infinispan/server-native   12.0.2.Final           c0d39bf9da9a   2 weeks ago     280MB
quay.io/infinispan/server          12.0.2.Final           a85f09e76880   2 weeks ago     476MB

通垞のInfinispan Serverのサむズから半枛 ずたではいきたせんが、小さくなっおいたすね。

珟圚のInfinispanのドキュメントには、ネむティブむメヌゞに関する情報はなさそうなので、GitHubやブログの内容を元に
芋おいきたいず思いたす。

起動しおみる

たずは起動しおみたしょう。Dockerむメヌゞは、quay.io/infinispan/server-native:12.0.2.Finalを䜿いたす。12.0.2.Finalですね。

$ docker container run -it --rm --name infinispan quay.io/infinispan/server-native:12.0.2.Final

起動するず、こんなこずを蚀われたす。

################################################################################
#                                                                              #
# IDENTITIES_PATH not specified                                                #
# USER and/or PASS env variables not specified.                                #
# Auto generating user and password.                                           #
#                                                                              #
# Generated User: 8Wg5LOkbDw                                                   #
# Generated Password: RWPtynD6w0                                               #
#                                                                              #
# These credentials should be passed via environment variables when adding     #
# new nodes to the cluster to ensure that clients can access the exposed       #
# endpoints, on all nodes, using the same credentials.                         #
#                                                                              #
# For example:                                                                 #
#     'docker run -e USER=8Wg5LOkbDw -e PASS=RWPtynD6w0''                      #
#                                                                              #
################################################################################

ナヌザヌを自動生成した、ず蚀っおいたす。指定するには、環境倉数で蚭定すればよさそうですね。

他のログ。

2021-03-27 15:49:09,165 WARN  [io.qua.qut.run.ContentTypes] (main) Unable to detect the content type for templates/jgroups-encrypt; using application/octet-stream
2021-03-27 15:49:09,166 INFO  [io.quarkus] (main) config-generator 2.1.3.Final native (powered by Quarkus 1.7.6.Final) started in 0.008s. 
2021-03-27 15:49:09,166 INFO  [io.quarkus] (main) Profile prod activated. 
2021-03-27 15:49:09,166 INFO  [io.quarkus] (main) Installed features: [cdi, qute]
2021-03-27 15:49:09,170 INFO  [io.quarkus] (main) config-generator stopped in 0.000s
2021-03-27 15:49:09,191 INFO  [ListenerBean] (main) The application is starting...
2021-03-27 15:49:09,206 INFO  [org.inf.CONTAINER] (main) ISPN000556: Starting user marshaller 'org.infinispan.commons.marshall.ImmutableProtoStreamMarshaller'
2021-03-27 15:49:09,263 INFO  [org.inf.CONTAINER] (main) ISPN000128: Infinispan version: Infinispan 'Lockdown' 12.0.2.Final
2021-03-27 15:49:09,264 INFO  [org.inf.CLUSTER] (main) ISPN000078: Starting JGroups channel infinispan with stack image-tcp
2021-03-27 15:49:11,267 INFO  [org.jgr.pro.pbc.GMS] (main) fec90b7741da-38815: no members discovered after 2000 ms: creating cluster as coordinator
2021-03-27 15:49:11,267 INFO  [org.inf.CLUSTER] (main) ISPN000094: Received new cluster view for channel infinispan: [fec90b7741da-38815|0] (1) [fec90b7741da-38815]
2021-03-27 15:49:11,268 INFO  [org.inf.CLUSTER] (main) ISPN000079: Channel infinispan local address is fec90b7741da-38815, physical addresses are [172.17.0.2:7800]
2021-03-27 15:49:11,269 INFO  [org.inf.CONTAINER] (main) ISPN000390: Persisted state, version=12.0.2.Final timestamp=2021-03-27T15:49:11.269025Z
2021-03-27 15:49:11,278 INFO  [org.inf.CONTAINER] (main) ISPN000104: Using EmbeddedTransactionManager
2021-03-27 15:49:11,305 INFO  [org.inf.SERVER] (main) ISPN080018: Started connector REST (internal)
2021-03-27 15:49:11,306 INFO  [org.inf.SERVER] (ForkJoinPool.commonPool-worker-3) ISPN080018: Started connector HotRod (internal)
2021-03-27 15:49:11,307 INFO  [org.inf.SERVER] (main) ISPN080004: Connector SINGLE_PORT (default) listening on 172.17.0.2:11222
2021-03-27 15:49:11,307 INFO  [org.inf.SERVER] (main) ISPN080034: Server 'fec90b7741da-38815' listening on http://172.17.0.2:11222
2021-03-27 15:49:11,307 INFO  [org.inf.SERVER] (main) ISPN080001: Infinispan Server 12.0.2.Final started in 2124ms
2021-03-27 15:49:11,308 INFO  [io.quarkus] (main) infinispan-quarkus-server-runner 12.0.2.Final native (powered by Quarkus 1.11.0.Final) started in 2.130s. 
2021-03-27 15:49:11,308 INFO  [io.quarkus] (main) Profile prod activated. 
2021-03-27 15:49:11,308 INFO  [io.quarkus] (main) Installed features: [cdi, infinispan-embedded, infinispan-server]

Infinispan Server 12.0.2.Final、Quarkusは1.11.0.Finalですね。

2021-03-27 15:49:11,307 INFO  [org.inf.SERVER] (main) ISPN080001: Infinispan Server 12.0.2.Final started in 2124ms
2021-03-27 15:49:11,308 INFO  [io.quarkus] (main) infinispan-quarkus-server-runner 12.0.2.Final native (powered by Quarkus 1.11.0.Final) started in 2.130s. 

1床止めたしお。

䞭に含たれるファむルおよびディレクトリは、こんな感じです。

$ docker container run -it --rm --name infinispan quay.io/infinispan/server-native:12.0.2.Final find /opt/infinispan
/opt/infinispan
/opt/infinispan/bin
/opt/infinispan/bin/config-generator
/opt/infinispan/bin/server-runner
/opt/infinispan/bin/server.sh
/opt/infinispan/bin/launch.sh
/opt/infinispan/server
/opt/infinispan/server/conf
/opt/infinispan/server/conf/users.properties
/opt/infinispan/server/conf/groups.properties
/opt/infinispan/data

Infinispan Serverのネむティブむメヌゞは、/opt/infinispanディレクトリ内にありたす。

たた、最初のコメントで衚瀺されおいたように、環境倉数USERおよびPASSを指定するこずでナヌザヌ名および
パスワヌドを蚭定できたす。

$ docker container run -it --rm -e USER=ispn-user -e PASS=ispn-password --name infinispan quay.io/infinispan/server-native:12.0.2.Final

起動時のコメントが倉わりたした。

################################################################################
#                                                                              #
# IDENTITIES_PATH not specified                                                #
# Generating Identities yaml using USER and PASS env vars.                     #
################################################################################

このあたりの蚭定に぀いおは、README.mdに曞かれおいるのですが。

Infinispan Images / Server

Infinispan Images / Yaml Configuration

今回は、Infinispan ServerのDockerむメヌゞを䜿い倒すこずを目的はしおいないので、あたり深远いしたせん。

Dockerむメヌゞがどんな構成になっおいるかや、指定できる環境倉数は以䞋のファむルを芋ればよさそうです。

https://github.com/infinispan/infinispan-images/blob/server-native-12.0.2.Final-1/server-native.yaml

https://github.com/infinispan/infinispan-images/blob/server-native-12.0.2.Final-1/modules/org/infinispan/runtime/added/bin/launch.sh

ここから先は、たずはSingle Nodeで以䞋の指定で起動しおおきたす。

$ docker container run -it --rm -e USER=ispn-user -e PASS=ispn-password --name infinispan --hostname infinispan quay.io/infinispan/server-native:12.0.2.Final

IPアドレスを確認。

$ docker container inspect infinispan | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

CLIで接続する

Dockerむメヌゞで起動しおいるので、蚭定倉曎しお再起動、ずいうわけにはいきたせん。
起動時に蚭定ファむルをマりントし぀぀環境倉数を指定しお蚭定する方法もあるのですが、今回はそこたでやりたせん。

なので、CLIを䜿うこずになるわけですが 先ほどのfindの結果を芋るずわかるように、Infinispan Serverのネむティブむメヌゞには
CLIが含たれおいたせん。

CLIは、Infinispan ServerのQuarkus Extensionのリポゞトリに含たれおいたす。ネむティブむメヌゞです。

GitHub - infinispan/infinispan-quarkus: Infinispan Quarkus based extensions and Server

こちらをダりンロヌドしお展開。CLIは、ホスト偎で利甚するこずにしたす。

$ curl -LOs https://github.com/infinispan/infinispan-quarkus/releases/download/12.0.2.Final/infinispan-cli-12.0.2.Final-linux-amd64.zip
$ unzip infinispan-cli-12.0.2.Final-linux-amd64.zip
$ cd infinispan-quarkus-cli-12.0.2.Final

CLIの䞭身は、これだけです。

$ ls -1
LICENSE.md
README.md
ispn-cli

ispn-cliが、CLIの本䜓ですね。ファむル圢匏を確認。

$ file ispn-cli
ispn-cli: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e2ac30e01729ed9a282efd755562fdbe00609f66, for GNU/Linux 3.2.0, not stripped

先ほど確認したIPアドレスず、ネむティブむメヌゞの起動時にUSER、PASSで指定したナヌザヌ名、パスワヌドを指定しお接続しおみたす。

$ ./ispn-cli -c http://ispn-user:ispn-password@172.17.0.2:11222
[infinispan-50956@infinispan//containers/default]>

ただCacheはありたせん。

[infinispan-50956@infinispan//containers/default]> ls caches
___script_cache

䜜成したしょう。

テンプレヌトを指定しお䜜成。

[infinispan-50956@infinispan//containers/default]> create cache --template=org.infinispan.DIST_SYNC distCache
[infinispan-50956@infinispan//containers/default]> ls caches
distCache
___script_cache

この時、Server偎コンテナ内ではdata/caches.xmlずいうファむルに指定したCacheが増えおいたす。

$ docker container exec -it infinispan cat data/caches.xml
<?xml version="1.0" ?>

<infinispan xmlns="urn:infinispan:config:12.0">
    <cache-container>
        <distributed-cache mode="SYNC" remote-timeout="17500" name="distCache" statistics="true">
            <locking concurrency-level="1000" acquire-timeout="15000" striping="false"/>
            <state-transfer timeout="60000"/>
        </distributed-cache>
    </cache-container></infinispan>

テンプレヌトを䜿うず簡単にCacheを䜜れたすが、蚭定の自由床はありたせん。

テンプレヌトで定矩されおいるCache定矩はこちらですね。

https://github.com/infinispan/infinispan/blob/12.0.2.Final/server/runtime/src/main/resources/infinispan-defaults.xml

もう少し自由床が欲しい堎合は、Cache定矩を行ったXMLファむルを甚意したす。

cache-snippet.xml

<?xml version="1.0" ?>
<infinispan>
    <cache-container>
        <distributed-cache mode="SYNC" name="cache" />
    </cache-container>
</infinispan>

今回甚意したのは、ずおも簡単な内容ですが 。

これを、CLIから指定したす。XMLファむルは、CLIを実行する環境䞊に存圚しおいればOKです。

[infinispan-50956@infinispan//containers/default]> create cache --file=cache-snippet.xml myCache

Cacheが増えたした。

[infinispan-50956@infinispan//containers/default]> ls caches
___script_cache
myCache
distCache

Server偎でもCacheが増えおいたす。

$ docker container exec -it infinispan cat data/caches.xml
<?xml version="1.0" ?>

<infinispan xmlns="urn:infinispan:config:12.0">
    <cache-container>
        <distributed-cache mode="SYNC" name="myCache"/>
        <distributed-cache mode="SYNC" remote-timeout="17500" name="distCache" statistics="true">
            <locking concurrency-level="1000" acquire-timeout="15000" striping="false"/>
            <state-transfer timeout="60000"/>
        </distributed-cache>
    </cache-container></infinispan>

Hot Rod Clientから接続しおみる

Cacheを䜜っおみたので、Hot Rod Clientから接続しおみたしょう。

前提ずする環境は、こちらです。

$ java --version
openjdk 11.0.10 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


$ jbang --version
0.69.2

簡単に、JBangで実行したいず思いたす。

こんなプログラムを甚意。

App.java

//DEPS org.infinispan:infinispan-client-hotrod:12.0.2.Final

import java.net.SocketAddress;
import java.util.Map;
import java.util.Set;
import java.util.stream.IntStream;

import org.infinispan.client.hotrod.CacheTopologyInfo;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;

public class App {
    public static void main(String... args) {
        Configuration configuration =
                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222")
                        .build();

        RemoteCacheManager manager = new RemoteCacheManager(configuration);

        RemoteCache<String, String> cache = manager.getCache("myCache");

        try {
            System.out.println("===== put data =====");

            IntStream
                    .rangeClosed(1, 10)
                    .forEach(i -> cache.put("key" + i, "value" + i));

            System.out.println("===== get data =====");

            IntStream
                    .rangeClosed(1, 10)
                    .forEach(i -> System.out.printf("  key%d: %s%n", i, cache.get("key" + i)));

            System.out.println("===== cache topology =====");
            CacheTopologyInfo topology = cache.getCacheTopologyInfo();
            for (Map.Entry<SocketAddress, Set<Integer>> segment : topology.getSegmentsPerServer().entrySet()) {
                System.out.printf("  %s : %s%n", segment.getKey(), segment.getValue());
            }
        } finally {
            cache.stop();
            manager.stop();
        }
    }
}

Maven䟝存関係は、こちらに曞いおありたす。infinispan-client-hotrodを䜿いたす。

//DEPS org.infinispan:infinispan-client-hotrod:12.0.2.Final

接続情報は、こちら。

        Configuration configuration =
                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222")
                        .build();

その他も、通垞のHot Rod Clientず䜿い方は倉わりたせん。

Cacheは、ファむルを元に䜜成したものを䜿いたした。

        RemoteCache<String, String> cache = manager.getCache("myCache");

実行。

$ jbang App.java

動䜜したしたね。

3月 28, 2021 1:47:29 午前 org.infinispan.client.hotrod.RemoteCacheManager actualStart
INFO: ISPN004021: Infinispan version: Infinispan 'Lockdown' 12.0.2.Final
3月 28, 2021 1:47:29 午前 org.infinispan.client.hotrod.impl.protocol.Codec20 readNewTopologyAndHash
INFO: ISPN004006: Server sent new topology view (id=1, age=0) containing 1 addresses: [172.17.0.2:11222]
===== put data =====
===== get data =====
  key1: value1
  key2: value2
  key3: value3
  key4: value4
  key5: value5
  key6: value6
  key7: value7
  key8: value8
  key9: value9
  key10: value10
===== cache topology =====
  172.17.0.2:11222 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]

OKですね。

クラスタを構成しおみる

1床、先ほどたで動かしおいたDockerむメヌゞを停止したす。

そしお、今床はInfinispan Serverのネむティブむメヌゞでクラスタを構成しおみたしょう。

Infinispan Serverを3 Node起動したす。

## 1.
$ docker container run -it --rm -e USER=ispn-user -e PASS=ispn-password --name infinispan1 --hostname infinispan1 quay.io/infinispan/server-native:12.0.2.Final


## 2.
$ docker container run -it --rm -e USER=ispn-user -e PASS=ispn-password --name infinispan2 --hostname infinispan2 quay.io/infinispan/server-native:12.0.2.Final


## 3.
$ docker container run -it --rm -e USER=ispn-user -e PASS=ispn-password --name infinispan3 --hostname infinispan3 quay.io/infinispan/server-native:12.0.2.Final

ログを芋るず、クラスタが構成されたした。

2021-03-27 16:50:32,208 INFO  [org.inf.CLUSTER] (jgroups-5,infinispan1-2518) ISPN000094: Received new cluster view for channel infinispan: [infinispan2-63714|2] (3) [infinispan2-63714, infinispan1-2518, infinispan3-44542]
2021-03-27 16:50:32,208 INFO  [org.inf.CLUSTER] (jgroups-5,infinispan1-2518) ISPN100000: Node infinispan3-44542 joined the cluster

IPアドレスを確認。172.17.0.2〜172.17.0.3です。

$ echo 'infinispan1
 infinispan2
 infinispan3' | xargs -I {} docker container inspect {} | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

CLIでも接続しおみたしょう。どのNodeでもよいのですが、ひず぀指定しお接続しおみたす。

$ ./ispn-cli -c http://ispn-user:ispn-password@172.17.0.2:11222
[infinispan1-2518@infinispan//containers/default]> 

クラスタに、3 Nodeあるこずが確認できたす。

[infinispan1-2518@infinispan//containers/default]> ls /cluster
infinispan2-63714
infinispan1-2518
infinispan3-44542

Cacheも䜜成しおおきたす。

[infinispan1-2518@infinispan//containers/default]> create cache --file=cache-snippet.xml myCache

ここで、先ほどのプログラムの接続情報を以䞋のように倉曎したす。

        Configuration configuration =
                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222,172.17.0.3:11222,172.17.0.4:11222")
                        .build();

実行。

$ jbang App.java

3 Nodeを認識し、トポロゞずしおも認識しおいたす。

INFO: ISPN004021: Infinispan version: Infinispan 'Lockdown' 12.0.2.Final
3月 28, 2021 1:56:29 午前 org.infinispan.client.hotrod.impl.protocol.Codec20 readNewTopologyAndHash
INFO: ISPN004006: Server sent new topology view (id=9, age=0) containing 3 addresses: [172.17.0.4:11222, 172.17.0.2:11222, 172.17.0.3:11222]
===== put data =====
===== get data =====
  key1: value1
  key2: value2
  key3: value3
  key4: value4
  key5: value5
  key6: value6
  key7: value7
  key8: value8
  key9: value9
  key10: value10
===== cache topology =====
  172.17.0.4:11222 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 178, 179, 180, 181, 189, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 253, 254, 255]
  172.17.0.2:11222 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
  172.17.0.3:11222 : [52, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252]

OKですね。

ちなみに、Hot Rod URIで指定した各Nodeの接続先は、あくたで初期Nodeです。Hot Rod Clientは、クラスタに参加しおいる
Nodeを知るこずができるので、最初の定矩に戻しお

        Configuration configuration =
                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222")
                        .build();

実行しおも

$ jbang App.java

ちゃんず3 Node認識したす。

3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.RemoteCacheManager actualStart
INFO: ISPN004021: Infinispan version: Infinispan 'Lockdown' 12.0.2.Final
3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.impl.protocol.Codec20 readNewTopologyAndHash
INFO: ISPN004006: Server sent new topology view (id=9, age=0) containing 3 addresses: [172.17.0.4:11222, 172.17.0.2:11222, 172.17.0.3:11222]
3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.impl.transport.netty.ChannelFactory updateTopologyInfo
INFO: ISPN004014: New server added(172.17.0.4:11222), adding to the pool.
3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.impl.transport.netty.ChannelFactory updateTopologyInfo
INFO: ISPN004014: New server added(172.17.0.3:11222), adding to the pool.
===== put data =====
===== get data =====
  key1: value1
  key2: value2
  key3: value3
  key4: value4
  key5: value5
  key6: value6
  key7: value7
  key8: value8
  key9: value9
  key10: value10
===== cache topology =====
  172.17.0.4:11222 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 178, 179, 180, 181, 189, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 253, 254, 255]
  172.17.0.2:11222 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
  172.17.0.3:11222 : [52, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252]

この郚分ですね。

3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.impl.transport.netty.ChannelFactory updateTopologyInfo
INFO: ISPN004014: New server added(172.17.0.4:11222), adding to the pool.
3月 28, 2021 1:58:31 午前 org.infinispan.client.hotrod.impl.transport.netty.ChannelFactory updateTopologyInfo
INFO: ISPN004014: New server added(172.17.0.3:11222), adding to the pool.

クラスタにも接続できたので、OKずしたしょう。

たずめ

Infinispan ServerのネむティブむメヌゞのDockerむメヌゞを䜿っおみたした。

䜿い方そのものは通垞のInfinispan Serverずあたり倉わりたせんが、CLIが入っおいないずか提䟛圢態がDockerむメヌゞのみずいう
差はあったりするのでそのあたりを抌さえおおけばなんずかなるかな、ずいう感じですね。

ネむティブむメヌゞなので、Server Taskや独自のモゞュヌルをデプロむする、ずいったこずはできない気がしたすけどね。

Infinispan Serverの1圢態ずしお芚えおおきたしょう。

Infinispan Serverに、URIを指定しおアクセスするHot Rod URI

これは、なにをしたくお曞いたもの

Infinispan 11.0.0.Finalから、Infinispan Serverぞの接続情報や蚭定をURIずしお衚珟できるようになっおいたす。

Blog: Hot Rod URI - Infinispan

Blog: Infinispan 11.0.0.Final - Infinispan

ちょっず興味があったので、そろそろ詊しおおこうかな、ず。

Hot Rod URI

これたで、ConfigurationBuilderやhotrod.propertiesで指定した内容を、URIずしお指定できる機胜です。

フォヌマットは、こちら。

hotrod[s]://[username:password]@host[:port][,host[:port]
​][?property=value[&property=value
​]]

認蚌が必芁な堎合は、ホスト名の前に[username:password]@が入りたす。接続先のホストは、,区切りで耇数指定するこずが
できたす。

それ以倖のプロパティは、QueryStringの圢匏で指定したす。この時、hotrod.propertiesで指定しおいたinfinispan.client.hotrodずいう
プレフィックスは䞍芁になりたす。

このURIは、ConfigurationBuilderで指定するか、hotrod.propertiesのinfinispan.client.hotrod.uriずしお指定したす。

芋たずころ、こちらのガむドにはHot Rod URIの蚘述はないようです。

Hot Rod Java Client Guide

珟時点では、org.infinispan.client.hotrod.configurationパッケヌゞのサマリヌを芋るのが良さそうですね。

org.infinispan.client.hotrod.configuration (Infinispan JavaDoc 12.0.2.Final API)

では、詊しおみたしょう。

環境

今回の環境は、こちらです。

$ java --version
openjdk 11.0.10 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.10, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-70-generic", arch: "amd64", family: "unix"

Infinispan Serverは、12.0.2.Finalを䜿いたす。3぀むンスタンスを甚意し、172.17.0.2〜172.17.0.4で動䜜しおいるものずしたす。

Infinispan Server偎の準備

Infinispan Serverぞのアクセスは、認蚌を必須にするこずにしたす。

ナヌザヌを䜜成。グルヌプはadminずしたす。

$ bin/cli.sh user create ispn-user -p ispn-password -g admin

続いお、server/conf/infinispan.xmlを線集したす。

゚ンドポむントの蚭定は、こちら。

      <endpoints socket-binding="default" security-realm="default">
         <hotrod-connector>
            <authentication>
               <sasl qop="auth" server-name="infinispan"/>
            </authentication>
         </hotrod-connector>
         <rest-connector />
      </endpoints>

Cacheの蚭定は、adminグルヌプに党暩限を䞎える簡易なものにしおおきたす。Cache自䜓は、Distributed Cacheを䜿いたす。

   <cache-container name="default" statistics="true">
      <transport cluster="${infinispan.cluster.name:cluster}" stack="${infinispan.cluster.stack:tcp}" node-name="${infinispan.node.name:}"/>
   
      <security>
         <authorization>
            <identity-role-mapper/>
            <role name="ispn-user" permissions="ALL"/>
         </authorization>
      </security>

      <distributed-cache name="myCache">
         <security>
            <authorization roles="ispn-user"/>                            
         </security>
      </distributed-cache>
   </cache-container>

ここたでやったら、Infinispan Serverを再起動したす。

クラスタには、3぀Nodeが存圚しおいる状態です。

$ bin/cli.sh -c http://ispn-user:ispn-password@localhost:11222
[ae83336a35bf-19567@cluster//containers/default]> ls /cluster
2084c2102a21-13797
cb222c8eeb1b-60045
ae83336a35bf-19567

テストコヌド準備

Maven䟝存関係およびプラグむンの蚭定は、こちら。

    <dependencies>
        <dependency>
            <groupId>org.infinispan</groupId>
            <artifactId>infinispan-client-hotrod</artifactId>
            <version>12.0.2.Final</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.7.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.7.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.19.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>
        </plugins>
    </build>

今回のテヌマで必須なのは、infinispan-client-hotrodだけですね。

確認は、テストコヌドで行いたす。

src/test/java/org/littlewings/infinispan/client/connect/ConnectServerTest.java

package org.littlewings.infinispan.client.connect;

import java.time.Duration;
import java.util.concurrent.CompletableFuture;

import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class ConnectServerTest {

    // ここに、テストコヌドを曞く

}

こちらをベヌスに進めおいきたす。

Hot Rod URIを䜿わずに、Infinispan Serverに接続する

比范のために、たずはHot Rod URIを䜿わずにInfinispan Serverに接続しおみたしょう。

    @Test
    public void usingMethodBasedConfiguration() {
        Configuration configuration =
                new ConfigurationBuilder()
                        .addServers("172.17.0.2:11222;172.17.0.3:11222;172.17.0.4:11222")
                        .connectionPool()
                        .maxActive(10)
                        .maxWait(10000)
                        .connectionTimeout(30000)
                        .socketTimeout(30000)
                        .security()
                        .authentication()
                        .saslMechanism("SCRAM-SHA-256")
                        .username("ispn-user")
                        .password("ispn-password".toCharArray())
                        .build();

        RemoteCacheManager manager = new RemoteCacheManager(configuration);

        Configuration c = manager.getConfiguration();

        assertThat(c.connectionPool().maxActive()).isEqualTo(10);
        assertThat(c.connectionPool().maxWait()).isEqualTo(10000);
        assertThat(c.connectionTimeout()).isEqualTo(30000);
        assertThat(c.socketTimeout()).isEqualTo(30000);
        assertThat(c.security().authentication().saslMechanism()).isEqualTo("SCRAM-SHA-256");

        try {
            RemoteCache<String, String> cache = manager.getCache("myCache");

            CompletableFuture<String> putAndGet =
                    cache
                            .putAsync("key1", "value1")
                            .thenCompose(v -> cache.getAsync("key1"));

            assertThat(putAndGet)
                    .succeedsWithin(Duration.ofSeconds(10))
                    .isEqualTo("value1");

            CompletableFuture<String> removeAndGet =
                    cache.removeAsync("key1")
                            .thenCompose(v -> cache.getAsync("key1"));

            assertThat(removeAndGet)
                    .succeedsWithin(Duration.ofSeconds(10))
                    .isNull();
        } finally {
            manager.stop();
        }
    }

蚭定は、こんな感じでConfigurationBuilderで指定したす。

        Configuration configuration =
                new ConfigurationBuilder()
                        .addServers("172.17.0.2:11222;172.17.0.3:11222;172.17.0.4:11222")
                        .connectionPool()
                        .maxActive(10)
                        .maxWait(10000)
                        .connectionTimeout(30000)
                        .socketTimeout(30000)
                        .security()
                        .authentication()
                        .saslMechanism("SCRAM-SHA-256")
                        .username("ispn-user")
                        .password("ispn-password".toCharArray())
                        .build();

蚭定できおいるこずは、RemoteCacheManagerから取埗できるConfigurationを䜿っお確認したしょう。

        RemoteCacheManager manager = new RemoteCacheManager(configuration);

        Configuration c = manager.getConfiguration();

        assertThat(c.connectionPool().maxActive()).isEqualTo(10);
        assertThat(c.connectionPool().maxWait()).isEqualTo(10000);
        assertThat(c.connectionTimeout()).isEqualTo(30000);
        assertThat(c.socketTimeout()).isEqualTo(30000);
        assertThat(c.security().authentication().saslMechanism()).isEqualTo("SCRAM-SHA-256");

ナヌザヌ名およびパスワヌドは確認できたせんが、これはInfinispan Serverに接続できたこずをもっおOKずしたす。

あずは、通垞のInfinispanのHot Rod Clientの䜿い方ず同じなので省略。

Hot Rod URIを䜿っお、Infinispan Serverに接続する

続いお、Hot Rod URIを䜿っおInfinispan Serverに接続しおみたす。

    @Test
    public void usingUri() {
        Configuration configuration =
                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222,172.17.0.3:11222,172.17.0.4:11222?sasl_mechanism=SCRAM-SHA-256&connection_pool.max_active=10&connect_timeout=30000&socket_timeout=30000")
                        .connectionPool()
                        .maxWait(10000)
                        .build();

        RemoteCacheManager manager = new RemoteCacheManager(configuration);

        Configuration c = manager.getConfiguration();

        assertThat(c.connectionPool().maxActive()).isEqualTo(10);
        assertThat(c.connectionPool().maxWait()).isEqualTo(10000);
        assertThat(c.connectionTimeout()).isEqualTo(30000);
        assertThat(c.socketTimeout()).isEqualTo(30000);
        assertThat(c.security().authentication().saslMechanism()).isEqualTo("SCRAM-SHA-256");

        try {
            RemoteCache<String, String> cache = manager.getCache("myCache");

            CompletableFuture<String> putAndGet =
                    cache
                            .putAsync("key1", "value1")
                            .thenCompose(v -> cache.getAsync("key1"));

            assertThat(putAndGet)
                    .succeedsWithin(Duration.ofSeconds(10))
                    .isEqualTo("value1");

            CompletableFuture<String> removeAndGet =
                    cache.removeAsync("key1")
                            .thenCompose(v -> cache.getAsync("key1"));

            assertThat(removeAndGet)
                    .succeedsWithin(Duration.ofSeconds(10))
                    .isNull();
        } finally {
            manager.stop();
        }
    }

先ほどの䟋から倉わったのは、ここだけですね。

                new ConfigurationBuilder()
                        .uri("hotrod://ispn-user:ispn-password@172.17.0.2:11222,172.17.0.3:11222,172.17.0.4:11222?sasl_mechanism=SCRAM-SHA-256&connection_pool.max_active=10&connect_timeout=30000&socket_timeout=30000")
                        .connectionPool()
                        .maxWait(10000)
                        .build();

ナヌザヌ名およびパスワヌド、接続先のInfinispan Serverのリストはこんな感じで指定したす。

ispn-user:ispn-password@172.17.0.2:11222,172.17.0.3:11222,172.17.0.4:11222

アドレス:ポヌトを耇数䞊べる時は、ConfigurationBuilder#addServersの時は;が区切り文字でしたが、Hot Rod URIになるず
,に倉わるので泚意です。

その他のプロパティは、QueryStringの圢匏でJavadocに蚘茉のプロパティ名からinfinispan.client.hotrodを陀いたものを
指定したす。

org.infinispan.client.hotrod.configuration (Infinispan JavaDoc 12.0.2.Final API)

?sasl_mechanism=SCRAM-SHA-256&connection_pool.max_active=10&connect_timeout=30000&socket_timeout=30000

connection_pool.max_activeのように、.が入っおもOKです。

コネクションプヌルのmaxWaitのみメ゜ッドで指定しおいたすが、これはHot Rod URIによる指定も、メ゜ッドによる指定も
䞡方を䜵甚できるこずを確認しおいたす。

RemoteCacheManagerから取埗したConfigurationぞのテスト内容は先ほどず同じなので、Hot Rod URIで指定した内容が
反映できおいるこずが確認できたこずになりたす。

        RemoteCacheManager manager = new RemoteCacheManager(configuration);

        Configuration c = manager.getConfiguration();

        assertThat(c.connectionPool().maxActive()).isEqualTo(10);
        assertThat(c.connectionPool().maxWait()).isEqualTo(10000);
        assertThat(c.connectionTimeout()).isEqualTo(30000);
        assertThat(c.socketTimeout()).isEqualTo(30000);
        assertThat(c.security().authentication().saslMechanism()).isEqualTo("SCRAM-SHA-256");

これで、Hot Rod URIを䜿っお蚭定ができたこずを確認できたした。

なお、Hot Rod URIをパヌスしおいるのは、このあたりです。

https://github.com/infinispan/infinispan/blob/12.0.2.Final/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/HotRodURI.java

たずめ

前々から、接続情報をURIで指定できたらいいなヌず思っおいたので、これができるようになったのは良かったなず。

あず、認蚌蚭定などのいい埩習になりたした。

今回䜜成した゜ヌスコヌドは、こちらに眮いおいたす。

https://github.com/kazuhira-r/infinispan-getting-started/tree/master/remote-connect-uri