如何在 keycloak 17 中设置分布式集群

Aki*_*nga 5 keycloak quarkus

当keycloak在wildfly上运行时,我们可以使用jgroups在standalone-ha.xml中指定集群配置

我们如何在 keycloak 17 的 quarkus 发行版中做同样的事情?

我尝试在 keycloak.conf 中设置下面给出的属性

cache-config-file=conf/cache-ispn.xml
Run Code Online (Sandbox Code Playgroud)

当两个keycloak实例在同一台机器上运行时,成功建立集群。

但是,如果两个keycloak实例运行在不同的服务器(分布式集群)中,那么服务器之间相互发现需要什么配置呢?

小智 5

设置集群时有几个选项。

如此处所述: https: //www.keycloak.org/2019/05/keycloak-cluster-setup.html,您可以使用以下内容:

  1. TCPPING
  2. JDBC_PING
  3. 在 Kubernetes 上我们可以使用 DNS_PING 或 KUBE_PING

感谢:https://gist.github.com/xgp/768eea11f92806b9c83f95902f7f8f80我找到了一个使用 JDBC_PING 的解决方案。

您的配置中有一个堆栈,如下所示:

<jgroups>
<stack name="jdbc-ping-tcp" extends="tcp">
  <TCP external_addr="${env.JGROUPS_DISCOVERY_EXTERNAL_IP}" bind_port="7600" />
  <JDBC_PING connection_driver="org.postgresql.Driver"
             connection_username="${env.KC_DB_USERNAME}" connection_password="${env.KC_DB_PASSWORD}"
             connection_url="jdbc:postgresql://${env.KC_DB_URL_HOST}/${env.KC_DB_URL_DATABASE}"
             initialize_sql="CREATE SCHEMA IF NOT EXISTS ${env.KC_DB_SCHEMA:public}; CREATE TABLE IF NOT EXISTS ${env.KC_DB_SCHEMA:public}.JGROUPSPING (own_addr varchar(200) NOT NULL, cluster_name varchar(200) NOT NULL, bind_addr varchar(200) NOT NULL, updated timestamp default current_timestamp, ping_data BYTEA, constraint PK_JGROUPSPING PRIMARY KEY (own_addr, cluster_name));"
             insert_single_sql="INSERT INTO ${env.KC_DB_SCHEMA:public}.JGROUPSPING (own_addr, cluster_name, bind_addr, updated, ping_data) values (?, ?, '${env.JGROUPS_DISCOVERY_EXTERNAL_IP:127.0.0.1}', NOW(), ?);"
             delete_single_sql="DELETE FROM ${env.KC_DB_SCHEMA:public}.JGROUPSPING WHERE own_addr=? AND cluster_name=?;"
             select_all_pingdata_sql="SELECT ping_data, own_addr, cluster_name FROM ${env.KC_DB_SCHEMA:public}.JGROUPSPING WHERE cluster_name=?"
             info_writer_sleep_time="500"
             remove_all_data_on_view_change="true"
             stack.combine="REPLACE"
             stack.position="MPING" />
</stack>
</jgroups>
Run Code Online (Sandbox Code Playgroud)

请注意,您需要确保定义了此处使用的环境变量:

  1. KC_DB_URL_HOST
  2. KC_DB_URL_DATABASE
  3. KC_DB_SCHEMA
  4. KC_DB_USERNAME
  5. KC_DB_PASSWORD
  6. JGROUPS_DISCOVERY_EXTERNAL_IP

注意:

  • JGROUPS_DISCOVERY_EXTERNAL_IP非常重要
  • 这里使用的端口是 7600,根据需要更改,但如果您使用 docker,请确保其暴露