keycloak 与 mysql-innodb-cluster 的独立集成
Posted
技术标签:
【中文标题】keycloak 与 mysql-innodb-cluster 的独立集成【英文标题】:keycloak standalone integration with mysql-innodb-cluster 【发布时间】:2020-11-27 19:37:27 【问题描述】:试图让 keycloak 与 mysql-innodb-cluster 一起工作。我已经按照文档配置了 keycloak Standalone.xml。
这是数据源
<datasource jndi-name="java:/jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true">
<connection-url>jdbc:mysql://19.57.1.115:6446/keycloak?useSSL=false&characterEncoding=UTF-8</connection-url>
<driver>mysql</driver>
<pool>
<min-pool-size>5</min-pool-size>
<max-pool-size>15</max-pool-size>
</pool>
<security>
<user-name>key</user-name>
<password>abababab</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
<validate-on-match>true</validate-on-match>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
</validation>
</datasource>
这是驱动程序
<drivers>
<driver name="mysql" module="com.mysql">
<driver-class>com.mysql.cj.jdbc.Driver</driver-class>
</driver>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
我还添加了module.xml,用于打包mysql jdbc驱动(我使用的是最新版本的mysql-connector-java-8.0.21.jar)
我在运行 keycloak 时遇到的错误是
10:45:23,155 INFO [org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider] (ServerService Thread Pool -- 66) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
10:45:24,088 ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thread Pool -- 66) Change Set META-INF/jpa-changelog-
1.0.0.Final.xml::1.0.0.Final-KEYCLOAK-5461::sthorger@redhat.com failed. Error: Table 'APPLICATION_DEFAULT_ROLES' already exists [Failed SQL: CREATE TABLE keycloak.APPLICATION_DEFAULT_ROLES (APPLICATION_ID VARCHAR(36) NOT NULL, ROLE_ID VARCHAR(36) NOT NULL)]
10:45:24,414 FATAL [org.keycloak.services] (ServerService Thread Pool -- 66) java.lang.RuntimeException: Failed to update database
10:45:24,446 INFO [org.jboss.as.server] (Thread-2) WFLYSRV0220: Server shutdown has been requested via an OS signal
在这方面的任何帮助都会非常有帮助。
【问题讨论】:
这能回答你的问题吗? Connection Java-MySql : Public Key Retrieval is not allowed 很遗憾,这并没有解决问题。 【参考方案1】:我认为您看到的错误“错误:表 'APPLICATION_DEFAULT_ROLES' 已存在”不是根本原因。 Keycloak 使用Liquibase 进行数据库初始化和升级管理。 Liquibase 似乎不支持 MySQL innodb 集群,因为它创建了一个表“DATABASECHANGELOG”without a primary key。如果您检查您的 MySLQ 日志,您可能会在 keycloak 创建数据库表时第一次启动时看到以下日志消息:
[ERROR] Plugin group_replication reported: 'Table DATABASECHANGELOG does not have any PRIMARY KEY. This is not compatible with Group Replication'
该表现在存在于您的主数据库上,但尚未复制到其他复制组成员。如果您再次启动 Keycloak,您将收到错误消息“表 'APPLICATION_DEFAULT_ROLES' 已存在”。
如果您从空数据库架构开始,手动创建带有主键的 DATABASECHANGELOG 表,然后让 Keycloak(实际上是 Liquibase)创建其余表,则可以解决此问题。
您可以使用以下语句来创建表:
CREATE TABLE `DATABASECHANGELOG` (
`ID` varchar(255) NOT NULL,
`AUTHOR` varchar(255) NOT NULL,
`FILENAME` varchar(255) NOT NULL,
`DATEEXECUTED` datetime NOT NULL,
`ORDEREXECUTED` int(11) NOT NULL,
`EXECTYPE` varchar(10) NOT NULL,
`MD5SUM` varchar(35) DEFAULT NULL,
`DESCRIPTION` varchar(255) DEFAULT NULL,
`COMMENTS` varchar(255) DEFAULT NULL,
`TAG` varchar(255) DEFAULT NULL,
`LIQUIBASE` varchar(20) DEFAULT NULL,
`CONTEXTS` varchar(255) DEFAULT NULL,
`LABELS` varchar(255) DEFAULT NULL,
`DEPLOYMENT_ID` varchar(10) DEFAULT NULL,
PRIMARY KEY (`ID`,`AUTHOR`,`FILENAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
【讨论】:
感谢您的回复...会尽力让您知道 @ChandraKanth 对你有用吗?面临同样的问题,但这至少对我没有帮助。你能分享你的反馈吗?以上是关于keycloak 与 mysql-innodb-cluster 的独立集成的主要内容,如果未能解决你的问题,请参考以下文章
SSO 与 SAML、Keycloak 和 Nextcloud
Keycloak 与 Spring boot 集成,使用自定义登录页面(在没有 keycloak 的默认登录页面的情况下登录)