エラー内容
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を設定ファイルに仕込む必要があります。
以上、ご参考になれば幸いです。