(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Keycloak/RHBK】クラスタ構成で起動時に"relation jgroupsping does not exist"というエラーが出る

スポンサーリンク

エラー内容

Red Hat Build of Keycloakをcache-ispn.xmlでクラスタ構成にした上でkc.sh startを実施するも以下のエラーが発生する。尚、JDBC_PINGの接続先はDB(PostgreSQL)を接続先としている。

# ./bin/kc.sh start
... ERROR [org.jgroups.protocols.JDBC_PING] (keycloak-cache-init) JGRP000138: Error reading JDBC_PING table: org.postgresql.util.PSQLException: ERROR: relation "jgroupsping" does not exist
  Position: 47
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2725)
...
環境情報
  • RHEL 9.3
  • rhbk-22.0.4
  • postgresql 16.5

原因/解消方法

DB側にクラスタ構成用のDBができていない。

cache-ispn.xmlにinitialize_sqlの行を追記した上で起動すると

<JDBC_PING connection_url="jdbc:postgresql://xx/keycloak"
  connection_username="postgres"
  connection_password="******"
  connection_driver="org.postgresql.Driver"
  initialize_sql="CREATE TABLE IF NOT EXISTS JGROUPSPING (
    own_addr VARCHAR(200) NOT NULL,
    cluster_name VARCHAR(200) NOT NULL,
    ping_data bytea DEFAULT NULL,
    added timestamp DEFAULT NOW(),
    PRIMARY KEY (own_addr, cluster_name)
    )"
...

正常に起動が行え

# ./bin/kc.sh start
...
... INFO  [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
... INFO  [org.infinispan.CLUSTER] (keycloak-cache-init) ISPN000078: Starting JGroups channel `ISPN` with stack `JDBC_PING`

対のサーバがクラスタ構成に参加すると以下のようなログが出力される。

... INFO  [org.infinispan.CLUSTER] (jgroups-6,ip-x-x-x-x34593) ISPN000094: Received new cluster view for channel ISPN: [ip-x-x-x-x-34593|1] (2) [ip-x-x-x-x-34593, ip-y-y-y-y-10465]
... INFO  [org.infinispan.CLUSTER] (jgroups-6,ip-x-x-x-x-34593) ISPN100000: Node ip-x-x-x-x-10465 joined the cluster
... INFO  [org.infinispan.CLUSTER] (jgroups-6,ip-x-x-x-x-34593) ISPN100000: Node ip-y-y-y-y-10465 joined the cluster ...

以下、補足です。

補足

DBに接続をすると分かりますが、同対応を行うと新たに"jgroupsping"というテーブルが作成されます。

keycloak=# \dt
                     List of relations
 Schema |             Name              | Type  |  Owner   
--------+-------------------------------+-------+----------
 public | admin_event_entity            | table | postgres
 ...
 public | jgroupsping                   | table | postgres
 ...
(93 rows)

中の構成は以下。

keycloak=# \d jgroupsping
                         Table "public.jgroupsping"
    Column    |            Type             | Collation | Nullable | Default 
--------------+-----------------------------+-----------+----------+---------
 own_addr     | character varying(200)      |           | not null | 
 cluster_name | character varying(200)      |           | not null | 
 ping_data    | bytea                       |           |          | 
 added        | timestamp without time zone |           |          | now()
Indexes:
    "jgroupsping_pkey" PRIMARY KEY, btree (own_addr, cluster_name)

同テーブルは自動的にはできないため、手動で作成を行うか初回接続時のみテーブルを作成するSQLを設定ファイルに仕込む必要があります。

以上、ご参考になれば幸いです。