当 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
我们的应用程序中有大约一百万用户。我们使用具有标准配置的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 |