Keycloak集群部署时standalone-ha.xml的<stacks>配置用法咨询
关于Keycloak集群配置中stacks标签及UDP栈的说明
你贴出的是Keycloak底层依赖的WildFly组件中JGroups子系统的配置内容,完整配置代码如下:
<stacks> <stack name="udp"> <transport type="UDP" socket-binding="jgroups-udp"/> <protocol type="PING"/> <protocol type="MERGE3"/> <protocol type="FD_SOCK"/> <protocol type="FD_ALL"/> <protocol type="VERIFY_SUSPECT"/> <protocol type="pbcast.NAKACK2"/> <protocol type="UNICAST3"/> <protocol type="pbcast.STABLE"/> <protocol type="pbcast.GMS"/> <protocol type="UFC"/> <protocol type="MFC"/> <protocol type="FRAG3"/> </stack> <stack name="tcp"> <transport type="TCP" socket-binding="jgroups-tcp"/> <protocol type="JDBC_PING"> <property name="datasource_jndi_name">java:jboss/datasources/KeycloakDS</property> <property name="initialize_sql"> CREATE TABLE IF NOT EXISTS jgroupsping ( own_addr VARCHAR(200) NOT NULL, cluster_name VARCHAR(200) NOT NULL, ping_data BYTEA DEFAULT NULL, PRIMARY KEY (own_addr, cluster_name) ) </property> </protocol> <protocol type="MERGE3"/> <protocol type="FD_SOCK"/> <protocol type="FD_ALL"/> <protocol type="VERIFY_SUSPECT"/> <protocol type="pbcast.NAKACK2"/> <protocol type="UNICAST3"/> <protocol type="pbcast.STABLE"/> <protocol type="pbcast.GMS"/> <protocol type="MFC"/> <protocol type="FRAG3"/> </stack> </stacks>
为什么配置里存在UDP栈
- 这份配置是基于WildFly的通用高可用配置模板衍生的,UDP栈是WildFly默认自带的预定义通信栈,并非针对AWS环境专门添加
- UDP协议配合组播机制在局域网集群场景下的节点通信效率远高于TCP,是传统物理机/私有云集群的首选传输方案,因此默认会被包含在通用配置模板中
- 你提到的AWS环境不支持组播、UDP不可用的情况完全正确,该UDP栈在AWS ECS部署场景下不会被启用,只是通用模板的残留配置,不会对实际运行产生任何影响
<stacks>标签的工作逻辑
<stacks>是WildFly中JGroups组件的核心配置块,负责定义集群节点间的通信规则:
- 一个
<stacks>块下可以定义多个独立的<stack>通信栈,每个栈通过name属性唯一标识,支持按需切换使用 - 每个通信栈的配置分为两部分:
- 开头的
<transport>标签:定义底层通信使用的传输层协议,以及对应的端口绑定规则,示例中分别对应UDP传输和TCP传输 - 后续按顺序排列的
<protocol>标签:定义通信链路上的各个功能组件,按从上到下的顺序执行,涵盖节点发现(比如示例中TCP栈的JDBC_PING)、故障检测、消息可靠传输、流量控制、消息分片等集群通信所需的全部能力
- 开头的
- 实际运行时只会加载你指定使用的那个栈,默认会优先使用UDP栈,在AWS ECS场景下只要启动时添加参数
-Djgroups.default.stack=tcp,就会自动使用配置的带JDBC_PING的TCP栈,完全不会触发UDP相关逻辑
内容的提问来源于stack exchange,提问作者MrRobot9
相关产品推荐
相关产品推荐

