内容域集群模式
域模式是集中管理和发布服务器配置的一种方法。
在标准模式下运行集群可能会随着集群规模的增长而迅速恶化。每次需要进行配置更改时,都需要在集群中的每个节点上执行它。
域模式通过提供存储和发布配置中心来解决此问题。设置起来可能很复杂,但最后还是值得的。该功能内置于Keycloak派生的Wildfly应用服务器中。
以下是在域模式下运行的一些基本概念。
domain controller 域控制器
域控制器是负责存储,管理和发布群集中每个节点的常规配置的进程。这个进程是集群中的节点获得它们的配置的中心点。
host controller 主机控制器
主机控制器负责管理特定机器上的服务器实例。将其配置为运行一个或多个服务器实例。域控制器还可以与每个机器上的主机控制器交互以管理集群。为了减少运行进程的数量,域控制器还可以在运行的机器上充当主机控制器。
domain profile 域配置文件
域配置文件是服务器可以使用的一组命名的配置。域控制器可以定义不同服务器使用的多个域配置文件。
server group 服务器组
服务器组是服务器的集合。它们被看作是一个整体来管理和配置。可以将域配置文件分配给服务器组,并且该组中的每个服务将使用该域配置文件作为其配置。
在域模式下,在主节点上启动域控制器。集群的配置位于域控制器中。接下来,在集群中的每个机器上启动主机控制器。每个主机控制器部署配置指定在该机器上启动多少个Keycloak服务器实例。当主机控制器启动时,它启动与配置的许多Keycloak服务器实例一样。这些服务器实例从域控制器中拉取其配置。
域配置
本指南中的其他章节将引导您完成数据库,HTTP网络连接,缓存和其他基础设施相关事宜等各个方面的配置。而独立模式使用standalone.xml文件来配置这些内容,域模式使用... /domain/configuration/domain.xml配置文件。这是Keycloak服务器的域配置文件和服务器组的定义。
警告:在域控制器运行时对此文件所做的任何更改都不会生效,甚至可能被服务器覆盖。而是使用命令行脚本或Wildfly的Web控制台。有关更多信息,请参阅WildFly 10文档。
让我们来看看这个domain.xml文件的一些配置。很大一部分配置是在auth-server-standalone和auth-server-clustered配置文件XML块的。您将在这里配置网络连接,缓存和数据库连接。
auth-server profile
<profiles>
<profile name="auth-server-standalone">
...
</profile>
<profile name="auth-server-clustered">
...
</profile>
auth-server-standalone配置文件是一个非集群设置。auth-server-clustered文件是集群设置。
进一步向下查看,您将看到定义的各种socket-binding-groups。
socket-binding-groups
<socket-binding-groups>
<socket-binding-group name="standard-sockets" default-interface="public">
...
</socket-binding-group>
<socket-binding-group name="ha-sockets" default-interface="public">
...
</socket-binding-group>
<!-- load-balancer-sockets should be removed in production systems and replaced with a better softare or hardare based one -->
<socket-binding-group name="load-balancer-sockets" default-interface="public">
...
</socket-binding-group>
</socket-binding-groups>
此配置定义为每个Keycloak服务器实例打开的各种连接器的默认端口映射。包含$ {...}的任何值都是可以在-D开关的命令行上覆盖的值,例如:
$ domain.sh -Djboss.http.port=80
Keycloak服务器组的定义位于 server-groups XML块中。它指定主机控制器引导实例时使用的域配置文件(默认)以及Java VM的一些默认启动参数.它还将 socket-binding-group 绑定到服务器组。
server group
<server-groups>
<!-- load-balancer-group should be removed in production systems and replaced with a better softare or hardare based one -->
<server-group name="load-balancer-group" profile="load-balancer">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="load-balancer-sockets"/>
</server-group>
<server-group name="auth-server-group" profile="auth-server-clustered">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="ha-sockets"/>
</server-group>
</server-groups>
主机控制器配置
Keycloak带有驻留在... / domain / configuration /目录中的两个主机控制器配置文件:host-master.xml和host-slave.xml。 host-master.xml配置为启动域控制器,负载均衡器和一个Keycloak服务器实例。 host-slave.xml被配置为与域控制器通信并启动一个Keycloak服务器实例。
注意:负载均衡器不是必需的服务。有了它可以方便测试开发机器上的集群。在生产环境中,如果有不同的硬件或基于软件的负载均衡器,则可以选择替换它。
要禁用负载平衡器服务器实例,请在host-master.xml中注释掉或删除“load-balancer”标签及内容。
<servers>
<!-- remove or comment out next line -->
<server name="load-balancer" group="loadbalancer-group"/>
...
</servers>
服务器实例工作目录
主机文件中定义的每个Keycloak服务器实例都会在... / domain / servers / {SERVER NAME}下创建一个工作目录。其他配置可以放在那里,服务器实例需要或创建的任何临时,日志或数据文件也都在那里。每个服务器目录的结构看起来就像任何其他的Wildfly启动服务器一样。
Domain Boot Script域启动脚本
如果域模式下运行服务器时,需要根据操作系统来运行一个特定的脚本来启动服务器。这些脚本存在于服务器分发的bin /目录中。
启动服务:
Linux/Unix
$ .../bin/domain.sh --host-config=host-master.xml
Windows
> ...\bin\domain.bat --host-config=host-slave.xml
当运行启动脚本时需要通过--host-config设置的主机控制文件来配置。
Clustered Domain Example 集群域示例
可以使用现成的domain.xml配置来测试域集群。这个域模式例子是在一台 机器上启动并运行:
一个域控制器
一个HTTP负载均衡器
2个Keycloak实例
要模拟在两台机器上运行集群,需要运行两次domain.sh脚本来启动两个独立的主机控制器。
第一个将是主控制器,它将启动一个域控制器,一个HTTP负载均衡器和一个Keycloak认证服务器实例。
第二个将是仅启动认证服务器实例的从属主机控制器。
Setup Slave Connection to Domain Controller 设置从属主机控制器连接到域控制器
在启动之前,必须配置从属主机控制器,以便它可以安全地与域控制器通信 。如果不这样做,则从主机将无法从域控制器配置中心获取配置。要设置安全连接,必须创建一个服务器管理员用户和将在主服务器和从属服务器之间共享的密钥。您可以通过运行... /bin/add-user.sh脚本来执行此操作。
当运行脚本时选择Management User 并且它询问新用户是否要用于一个AS进程连接到另一个AS进程时需要回答yes。完成后产生一个密钥,将它剪切并粘贴到... /domain/configuration/host-slave.xml文件中。
Add App Server Admin
$ add-user.sh
What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a
Enter the details of the new user to add.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : admin
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
- The password should not be one of the following restricted values {root, admin, administrator}
- The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
- The password should be different from the username
Password :
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
About to add user 'admin' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'admin' to file '/.../standalone/configuration/mgmt-users.properties'
Added user 'admin' to file '/.../domain/configuration/mgmt-users.properties'
Added user 'admin' with groups to file '/.../standalone/configuration/mgmt-groups.properties'
Added user 'admin' with groups to file '/.../domain/configuration/mgmt-groups.properties'
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="bWdtdDEyMyE=" />
注意:add-user.sh不会将用户添加到Keycloak服务器,而是向底层的JBoss Enterprise应用程序平台添加。在上述脚本中使用和生成的凭据仅作为示例目的。请使用系统上生成的那些。
现在将密钥值剪切并粘贴到... /domain/configuration/host-slave.xml文件中,如下所示:
<management>
<security-realms>
<security-realm name="ManagementRealm">
<server-identities>
<secret value="bWdtdDEyMyE="/>
</server-identities>
Run the Boot Scripts运行启动脚本:
由于在一台开发机器上模拟两个节点集群,所以需要运行两次引导脚本:
Boot up master
$ domain.sh --host-config=host-master.xml
Boot up slave
$ domain.sh --host-config=host-slave.xml
To try it out, open your browser and go to http://localhost:8080/auth