CLOVER🍀

That was when it all began.

WildFlyのドメむンモヌドで、サヌバヌグルヌプずサヌバヌを远加する

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

WildFlyのドメむンモヌドで、自分でサヌバヌグルヌプずサヌバヌを远加しようずしお、適圓にやっおいたらちょっず
ハマったのでちゃんず確認しおおこうかなず思いたしお。

WildFlyのドメむンモヌド

WildFlyには、2぀の動䜜モヌドがありスタンドアロンモヌドずドメむンモヌドがありたす。

ふだんはスタンドアロンモヌドしか䜿っおいないんですけどね。

ドメむンモヌドに぀いおは、こちら。

Domain Setup

ドメむンモヌドには、以䞋の構成芁玠がありたす。

これらが、各ホスト䞊で動䜜したす。

この甚語の説明は、JBoss EAPのドキュメントを芋た方がわかりやすい気がしたすね。

第8章 ドメイン管理 7.4 | Red Hat Customer Portal

管理察象ドメむン

今回は、ドメむンモヌドで動䜜するWildFlyに自分でサヌバヌグルヌプやサヌバヌを远加しおみたいず思いたす。

環境

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

$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.11, 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-80-generic", arch: "amd64", family: "unix"

WildFlyは、24.0.0.Finalを䜿いたす。

$ curl -OL https://download.jboss.org/wildfly/24.0.0.Final/wildfly-24.0.0.Final.zip
$ unzip wildfly-24.0.0.Final.zip
$ cd wildfly-24.0.0.Final

デフォルトの構成ファむルでドメむンモヌドを起動する

ドメむンモヌドで起動する際にはbin/domain.shでWildFlyを起動するのですが、この時に--host-configオプションで
ホストの構成ファむルを指定する必芁がありたす。

Managed Domain Configuration Files

デフォルト未指定の堎合は、host.xmlが遞択されたす。

$ bin/domain.sh

管理CLIでログむンするず

$ bin/jboss-cli.sh -c
[domain@localhost:9990 /] 

2぀のサヌバヌグルヌプず3぀のサヌバヌがありたす。

[domain@localhost:9990 /] ls -l /server-group
main-server-group
other-server-group


[domain@localhost:9990 /] ls -l /host=master/server-config
server-one
server-three
server-two

いったん、党郚削陀しおみたしょう。最初にサヌバヌを止めおserver-threeはデフォルトでは起動しないようです、
削陀。

[domain@localhost:9990 /] /host=master/server=server-one:stop()
[domain@localhost:9990 /] /host=master/server-config=server-one:remove()

[domain@localhost:9990 /] /host=master/server=server-two:stop()
[domain@localhost:9990 /] /host=master/server-config=server-two:remove()

[domain@localhost:9990 /] /host=master/server-config=server-three:remove()

サヌバヌを削陀するず、サヌバヌグルヌプも削陀できるようになりたす。

[domain@localhost:9990 /] /server-group=main-server-group:remove()
[domain@localhost:9990 /] /server-group=other-server-group:remove()

次に、自分でサヌバヌグルヌプを远加しおみたす。

[domain@localhost:9990 /] /server-group=server-group1:add(profile=default,socket-binding-group=standard-sockets)

[domain@localhost:9990 /] /server-group=server-group2:add(profile=default,socket-binding-group=standard-sockets)

远加したサヌバヌグルヌプに、サヌバヌを䜜成しお割り圓おたす。ポヌトのオフセットは、2぀目以降は100ず぀
ずらしおいきたす。

[domain@localhost:9990 /] /host=master/server-config=server1-1:add(group=server-group1)
[domain@localhost:9990 /] /host=master/server-config=server1-2:add(group=server-group1,socket-binding-port-offset=100)

[domain@localhost:9990 /] /host=master/server-config=server2-1:add(group=server-group2,socket-binding-port-offset=200)

サヌバヌを起動。

[domain@localhost:9990 /] /host=master/server=server1-1:start()
[domain@localhost:9990 /] /host=master/server=server1-2:start()
[domain@localhost:9990 /] /host=master/server=server2-1:start()

アプリケヌションをデプロむしおみたす。䞡方のサヌバヌグルヌプにデプロむしようず思うので--all-server-groupsを
䜿っおもいいのですが、今回は最初にひず぀のサヌバヌグルヌプにデプロむしお、次に別のサヌバヌグルヌプにも
デプロむメントを割り圓おる、ずいう方法でやっおみたす。

[domain@localhost:9990 /] deploy /path/to/target/ROOT.war --server-groups=server-group1
[domain@localhost:9990 /] deployment enable ROOT.war --server-groups=server-group2

デプロむしたアプリケヌション自䜓は、最埌に簡単に茉せたす。ここでは、/helloにHTTP GETでアクセスするず
Hello World!!ず返っおくるものが動䜜するものずしおください。

確認。

$ curl localhost:8080/hello
Hello World!!

$ curl localhost:8180/hello
Hello World!!

$ curl localhost:8280/hello
Hello World!!

OKですね。

host-master.xmlを䜿う

次に、ちょっず詊しにずhost-master.xmlを䜿っおみたす。
※ここたでの操䜜の内容は、いったん削陀しおたっさらなWildFlyでやり盎しおいたす

host-master.xmlの説明を芋るず、実環境のマスタヌずなるドメむンコントロヌラヌを想定した蚭定ファむルのようです。

Managed Domain Configuration Files

ずりあえず、起動しおみたす。

$ bin/domain.sh --host-config=host-master.xml

管理CLIで接続。

$ bin/jboss-cli.sh -c
[domain@localhost:9990 /] 

サヌバヌグルヌプはありたすが、サヌバヌの定矩はありたせん。

[domain@localhost:9990 /] ls -l /server-group
main-server-group
other-server-group


[domain@localhost:9990 /] ls -l /host=master/server-config

先ほどのhost.xmlを䜿った時ず、同じこずをしおみたしょう。

今のサヌバヌグルヌプを削陀。

[domain@localhost:9990 /] /server-group=main-server-group:remove()
[domain@localhost:9990 /] /server-group=other-server-group:remove()

サヌバヌずサヌバヌグルヌプを远加。

[domain@localhost:9990 /] /server-group=server-group1:add(profile=default,socket-binding-group=standard-sockets)
[domain@localhost:9990 /] /server-group=server-group2:add(profile=default,socket-binding-group=standard-sockets)

[domain@localhost:9990 /] /host=master/server-config=server1-1:add(group=server-group1)
[domain@localhost:9990 /] /host=master/server-config=server1-2:add(group=server-group1,socket-binding-port-offset=100)
[domain@localhost:9990 /] /host=master/server-config=server2-1:add(group=server-group2,socket-binding-port-offset=200)

これで、サヌバヌを起動しようずするず

[domain@localhost:9990 /] /host=master/server=server1-1:start()

サヌバヌの起動に倱敗したす。ログファむルdomain/servers/server1-1/log/server.logを芋るず、こんな感じに。

2021-07-23 22:25:06,379 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("socket-binding-group" => "standard-sockets")]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.network.interface.public"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.management.socket-binding-manager is missing [org.wildfly.network.interface.public]"]
}
2021-07-23 22:25:06,380 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "remoting"),
    ("http-connector" => "http-remoting-connector")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["jboss.http-upgrade-registry.default"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.remoting.remoting-http-upgrade-service.http-remoting-connector is missing [jboss.http-upgrade-registry.default]"]
}
2021-07-23 22:25:06,382 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("subsystem" => "jca")]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.transactions.global-default-local-provider"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.jca.transaction-integration is missing [org.wildfly.transactions.global-default-local-provider]"]
}
2021-07-23 22:25:06,384 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "ejb3"),
    ("service" => "timer-service"),
    ("file-data-store" => "default-file-store")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.transactions.global-default-local-provider"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.ejb3.timer-service.timer-persistence-service.default-file-store is missing [org.wildfly.transactions.global-default-local-provider]"]
}
2021-07-23 22:25:06,502 INFO  [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0184:    New missing/unsatisfied dependencies:
      service jboss.http-upgrade-registry.default (missing) dependents: [service jboss.remoting.remoting-http-upgrade-service.http-remoting-connector] 
      service org.wildfly.network.interface.public (missing) dependents: [service org.wildfly.management.socket-binding-manager] 
      service org.wildfly.transactions.global-default-local-provider (missing) dependents: [service org.wildfly.jca.transaction-integration, service org.wildfly.ejb3.timer-service.timer-persistence-service.default-file-store] 
WFLYCTL0448: 24 additional services are down due to their dependencies being missing or failed

䟝存関係が足りないようです。

ここで、host.xmlずhost-master.xmlを比范しおみたす。

$ diff domain/configuration/host.xml domain/configuration/host-master.xml
68,70d67
<         <interface name="public">
<             <inet-address value="${jboss.bind.address:127.0.0.1}"/>
<         </interface>
82,92d78
<     <servers>
<         <server name="server-one" group="main-server-group"/>
<         <server name="server-two" group="main-server-group" auto-start="true">
<             <jvm name="default"/>
<             <socket-bindings port-offset="150"/>
<         </server>
<         <server name="server-three" group="other-server-group" auto-start="false">
<             <jvm name="default"/>
<             <socket-bindings port-offset="250"/>
<         </server>
<     </servers>

サヌバヌの定矩がないのはいいずしお、interfaceの定矩からpublicずされおいるもののinet-addressの定矩がありたせん。

確かにないようなので

[domain@localhost:9990 /] ls -l /interface=public
ATTRIBUTE          VALUE     TYPE    
any                undefined OBJECT  
any-address        undefined BOOLEAN 
inet-address       undefined STRING  
link-local-address undefined BOOLEAN 
loopback           undefined BOOLEAN 
loopback-address   undefined STRING  
multicast          undefined BOOLEAN 
name               public    STRING  
nic                undefined STRING  
nic-match          undefined STRING  
not                undefined OBJECT  
point-to-point     undefined BOOLEAN 
public-address     undefined BOOLEAN 
site-local-address undefined BOOLEAN 
subnet-match       undefined STRING  
up                 undefined BOOLEAN 
virtual            undefined BOOLEAN 

ものは詊しずinet-addressを远加しおみたす。

[domain@localhost:9990 /] /interface=public:write-attribute(name=inet-address,value="${jboss.bind.address:127.0.0.1}")

ホストを再起動。

[domain@localhost:9990 /] reload --host=master

するず、今床はサヌバヌが起動するようになりたす。今の蚭定だず、auto-startがtrueになっおいるので、党サヌバヌが
起動しおきたすが 。

デプロむず

[domain@localhost:9990 /] deploy /path/to/target/ROOT.war --server-groups=server-group1
[domain@localhost:9990 /] deployment enable ROOT.war --server-groups=server-group2

動䜜確認。

$ curl localhost:8080/hello
Hello World!!

$ curl localhost:8180/hello
Hello World!!

$ curl localhost:8280/hello
Hello World!!

OKですね。

さお、蚭定を倉えたら動いたわけですが、やったこずが蚭定ファむルの意図ず反しおいる気がしたす。

こちらの説明を芋おいるず、ドメむンコントロヌラヌはホストコントロヌラヌでもあるようなので、サヌバヌグルヌプず
サヌバヌを远加したら動くず思っおいたのですが。

管理察象ドメむン

host-master.xmlの説明を芋おも、ドメむンコントロヌラヌであるこずず、サヌバヌが起動するように構成されおいない
ずいう感じで曞かれおいるだけな気がしたす。

Managed Domain Configuration Files

管理察象ドメむン蚭定ファむル

ここで、host-slave.xmlずの差分を芋おみたしょう。

$ diff domain/configuration/host-master.xml domain/configuration/host-slave.xml 
3c3
< <host xmlns="urn:jboss:domain:17.0" name="master">
---
> <host xmlns="urn:jboss:domain:17.0">
11a12,14
>                 <server-identities>
>                     <secret value="c2xhdmVfdXMzcl9wYXNzd29yZA=="/>
>                 </server-identities>
62c65,69
<         <local/>
---
>         <remote security-realm="ManagementRealm">
>             <discovery-options>
>                 <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote+http}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
>             </discovery-options>
>         </remote>
67a75,77
>         <interface name="public">
>             <inet-address value="${jboss.bind.address:127.0.0.1}"/>
>         </interface>
78a89,94
>     <servers>
>         <server name="server-one" group="main-server-group"/>
>         <server name="server-two" group="other-server-group">
>             <socket-bindings port-offset="150"/>
>         </server>
>     </servers>

こちらにはサヌバヌの定矩があり、publicにもinet-addressの定矩がありたす。

ずいうこずは、リク゚ストをハンドリングするのは、host-slave.xmlで定矩されおいるホストコントロヌラヌ管理䞋の
サヌバヌで行うこずを想定しおいる気がしたすね。

そしおサヌバヌを远加するのも、host-slave.xmlで管理されおいるホストコントロヌラヌ偎であるべきなのでしょう。

こちらの説明を読んでいお、ドメむン内のホストコントロヌラヌのひず぀がドメむンコントロヌラヌずなるずいう
むメヌゞだったのですが。

管理察象ドメむン

こうなるず、ドメむンコントロヌラヌはドメむン内でも独立しお扱った方が良さそうな感じでしょうか。

参考たでに、host.xmlずhost-slave.xmlの差分を芋おみたしょう。

$ diff domain/configuration/host.xml domain/configuration/host-slave.xml 
3c3
< <host xmlns="urn:jboss:domain:17.0" name="master">
---
> <host xmlns="urn:jboss:domain:17.0">
11a12,14
>                 <server-identities>
>                     <secret value="c2xhdmVfdXMzcl9wYXNzd29yZA=="/>
>                 </server-identities>
62c65,69
<         <local/>
---
>         <remote security-realm="ManagementRealm">
>             <discovery-options>
>                 <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote+http}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
>             </discovery-options>
>         </remote>
84,85c91
<         <server name="server-two" group="main-server-group" auto-start="true">
<             <jvm name="default"/>
---
>         <server name="server-two" group="other-server-group">
87,90d92
<         </server>
<         <server name="server-three" group="other-server-group" auto-start="false">
<             <jvm name="default"/>
<             <socket-bindings port-offset="250"/>

host-slave.xmlにはドメむンコントロヌラヌを参照しにいく定矩があり、たたサヌバヌの定矩が少々異なりたすね。

たた、ドメむン自䜓の蚭定ファむルはdomain.xmlで管理されおおり、これはdomain.shの匕数で指定するこずもできたす。

    -c <config>, -c=<config>            Name of the domain configuration file 
                                        to use (default is "domain.xml") (Same 
                                        as --domain-config)


    --domain-config=<config>            Name of the domain configuration file 
                                        to use (default is "domain.xml") (Same 
                                        as -c)

このファむルは、マスタヌずなるドメむンコントロヌラヌが参照するようです。

Domain Wide Configuration – domain.xml

domain/configuration/domain.xmlでのinterfaceの定矩を芋るず以䞋のようになっおおり、publicずmanagementが空です。

    <interfaces>
        <interface name="management"/>
        <interface name="private">
            <inet-address value="${jboss.bind.address.private:127.0.0.1}"/>
        </interface>
        <interface name="public"/>
        <interface name="unsecure">
            <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
        </interface>
    </interfaces>

䞀方でhost-master.xmlではinterfacesはこうなっおおり

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
    </interfaces>

host.xmlおよびhost-slave.xmlではこのようになっおいたす。

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
    </interfaces>

domain.xmlはドメむンコントロヌラヌでしか読み蟌たないずいうこずですが、この差分を䞊曞きできる仕組みにでも
なっおいるんでしょうか

なお、ホストコントロヌラヌはひず぀のホストに぀きひず぀を想定しおいるようで、それでもその構成を行っおみたい堎合は
こちらを芋るずよさそうです。

1 台のマシンで管理察象ドメむンを蚭定

反察に、2぀のホストでドメむンを構成したい堎合host-master.xml、host-slave.xmlを䜿う堎合は、こちらを芋るず
よさそうです。

2 台のマシンで管理察象ドメむンを蚭定

たずめ

WildFlyのドメむンモヌドで、サヌバヌグルヌプずサヌバヌを自分で远加しおみたいなず思い、そしお気軜にhost-master.xmlを
扱っおみるずいろいろハマり。

結果ずしお、各皮圹割だったり2぀のhost-xxxxx.xmlの圹割の違いなどを調べるこずになり、意倖ず理解が進んだような
気がしたす。

たあ、単䞀のホストで実行する堎合は、玠盎にhost.xmlを䜿うのが良さそうですね。

2぀以䞊のホストで構成する堎合は、サヌバヌが動䜜するのはhost-slave.xmlになるんでしょうね。