当 offline_user_session table 有很多记录时,Keycloak 启动很慢

Keycloak starts very slow when offline_user_session table has many records

我们的应用程序中有大约一百万用户。我们使用具有标准配置的Keycloak实例(https://hub.docker.com/r/jboss/keycloak/)。 我们还使用离线令牌,这个问题以某种方式与之相关

offline_user_sessiontable的记录越多,启动keycloak实例所需的时间就越多。

如果它有 0 条记录,则启动大约需要 30 秒。

当它有 800 000 个会话时,需要 8 分钟才能启动

当它有大约 1 000 000 个会话时,它可以启动 30 分钟或更长时间

在网上找了找,官方文档也查了,还是没有结果。

在分析 user_session 离线 table 时,在定义此 table 时存在与良好实践相关的问题。

Field Type Null Key Default Extra
USER_SESSION_ID varchar(36) NO PRI NULL
USER_ID varchar(255) YES
REALM_ID varchar(36) NO
CREATED_ON int(11) NO MUL
OFFLINE_FLAG varchar(4) NO PRI
DATA longtext YES
LAST_SESSION_REFRESH int(11) NO 0

在数据库层,我们有一个构造问题,当使用两个“varchar”类型的列组成一个主键时。这种情况是出现问题的唯一原因,只有在记录很多的情况下才会明显。

这个问题的解决方案是将主键换成大整数数据类型,并将其保留为列(USER_SESSION_ID、OFFLINE_FLAG)作为唯一索引。但是,这涉及到应用层的配置调整,这应该与解决方案提供商一起看到。

Field Type Null Key Default Extra
ID BIGINT NO PRIL
USER_SESSION_ID varchar(36) NO UNI NULL
USER_ID varchar(255) YES
REALM_ID varchar(36) NO
CREATED_ON int(11) NO MUL
OFFLINE_FLAG varchar(4) NO UNI
DATA longtext YES
LAST_SESSION_REFRESH int(11) NO 0