# MariaDB Galera Cluster で keycloak を使おうとするとなにか DB 書き込みが起きるたびに落ちる

# 結論

--transaction-xa-enabled=false が必要

# 環境

  • keycloak: 20.0.1
  • OpenJDK: openjdk-11-jdk:amd64
  • MariaDB: 10.3.36-MariaDB-0+deb10u2 Debian 10
  • Galera Cluster: wsrep_provider_version = 3.25(rddf9876)

# 現象

例えば最初の admin アカウントを作ると落ちる、再起動するとアカウントは無事にできているんだけど realm を作るとまた落ちる、という感じで永続データの保存がありそうなタイミングで DB への書き込みは出来てるみたいなんだけど keycloak が落ちるという大変おもしろい挙動です

ログはこんな感じで

2022-12-13 09:47:46,413 WARN  [com.arjuna.ats.jta] (executor-thread-2) ARJUNA016039: onePhaseCommit on < formatId=131077, gtrid_length=35, bqual_length=36, tx_uid=0:ffff0a44d623:a13a:6397cb77:e1, node_name=quarkus, branch_uid=0:ffff0a44d623:a13a:6397cb77:e4, subordinatenodename=null, eis_name=0 > (io.agroal.narayana.BaseXAResource@70337290) failed with exception ARJUNA016099: Unknown error code:0: javax.transaction.xa.XAException: (conn=42) Socket error
	at org.mariadb.jdbc.MariaDbPoolConnection$MariaDbXAResource.mapXaException(MariaDbPoolConnection.java:190)
	at org.mariadb.jdbc.MariaDbPoolConnection$MariaDbXAResource.execute(MariaDbPoolConnection.java:200)
	at org.mariadb.jdbc.MariaDbPoolConnection$MariaDbXAResource.commit(MariaDbPoolConnection.java:206)

なんか XAResource に commit しようとしてワーニング出てます。もっと見ていくと

2022-12-13 09:47:46,507 WARN  [io.agroal.pool] (executor-thread-2) Datasource '<default>': (conn=42) Connection is closed
2022-12-13 09:47:46,960 WARN  [com.arjuna.ats.jta] (executor-thread-2) ARJUNA016061: TransactionImple.enlistResource - XAResource.start returned: XAException.XAER_RMFAIL for < formatId=131077, gtrid_length=35, bqual_length=36, tx_uid=0:ffff0a44d623:a13a:6397cb77:e9, node_name=quarkus, branch_uid=0:ffff0a44d623:a13a:6397cb77:ec, subordinatenodename=null, eis_name=0 >: javax.transaction.xa.XAException: Error trying to start xa transaction: (conn=41) Socket error

XAResource が start できない?

2022-12-13 09:47:46,973 WARN  [com.arjuna.ats.jta] (executor-thread-2) ARJUNA016138: Failed to enlist XA resource io.agroal.narayana.BaseXAResource@48874761: javax.transaction.xa.XAException: Error trying to start xa transaction: (conn=41) Socket error
2022-12-13 09:47:46,974 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (executor-thread-2) SQL Error: 0, SQLState: null
2022-12-13 09:47:46,977 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (executor-thread-2) Deferred enlistment not supported

なんで DB 一個しか使ってないのに分散トランザクションの XA が出てくるのか腑に落ちないものの、なんとなく問題は XA に関係してそうです

で、keycloak のガイド Configuring the database (opens new window) を読み進めていくと Using Database Vendors without XA transaction support って section があって、「Azure SQL とか MariaDB Galera とか XA をサポートしてない DBMS を使う時は --transaction-xa-enabled=false をつけなさい」って親切に書いてくれてました

え、Galera って分散トランザクション未サポートだったの?って調べてみたら確かにKnown Issues (opens new window) に書いてありました

無知であることに常日頃悩んでいる私はこうしてまた一つ知識が増えて嬉しかったのでした。keycloak も動くようになったし、めでたしめでたし(どっちが喜びの主要因なのか?)

# references


Last Updated: 12/13/2022, 3:47:59 AM