首页 文章

Keycloak Docker Cluster无法从JDBC_PING数据库中删除

提问于
浏览
1

我在Docker主机上运行了一个Keycloak独立HA群集 . 群集使用JDBC Ping到PostgreSQL数据库进行发现(因为这最终将在ECS上运行,因此不会进行多播) .

群集发现运行良好,每个节点将在启动时将自己添加到数据库 . 但是,当停靠“docker stop”时,它们不会自行移除 . 只要至少有一个其他节点向上,这很好,因为它们会自动检测被击落的节点并重新 balancer ,但如果最后一个节点出现故障,最后一行将保留 . 然后,当新节点启动时,它将尝试连接到过时节点并失败 .

JGroups TCP堆栈如下所示

<stack name="tcp">
<transport type="TCP" socket-binding="jgroups-tcp">
    <property name="external_addr">
        ${env.EXTERNAL_ADDR}
    </property>
</transport>
<protocol type="org.jgroups.protocols.JDBC_PING">
    <property name="connection_driver">
        org.postgresql.Driver
    </property>
    <property name="connection_url">
        jdbc:postgresql://${env.DB_ADDR:postgres}:${env.DB_PORT:5432}/${env.DB_DATABASE:keycloak}
    </property>
    <property name="connection_username">
        ${env.DB_USER:keycloak}
    </property>
    <property name="connection_password">
        ${env.DB_PASSWORD:password}
    </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, added timestamp DEFAULT NOW(), 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="FRAG2"/>
</stack>

Dockerfile是

FROM jboss/keycloak:latest

# elevate to install iproute
USER root
RUN yum install -y iproute

USER jboss

ADD cli/* /opt/jboss/keycloak/cli/
RUN cd /opt/jboss/keycloak \
  && bin/jboss-cli.sh --file=cli/setup.cli \
  && rm -rf /opt/jboss/keycloak/standalone/configuration/standalone_xml_history

RUN sed -i -e "/.*<\/dependencies>$/i \ \ \ \ \ \ \ \ <module 
name=\"org.postgresql.jdbc\"\/>" 
/opt/jboss/keycloak/modules/system/layers/base/org/jgroups/main/module.xml

ADD start.sh /opt/jboss/

ENTRYPOINT [ "/opt/jboss/start.sh" ]
CMD ["-b", "0.0.0.0", "--server-config", "standalone-ha.xml"]

EXPOSE 7600

而startup.sh包含

#!/bin/sh

DEFAULT_NIC=`ip route | grep default | awk '{print $NF}'`
export EXTERNAL_ADDR=`ip -f inet -o addr show $DEFAULT_NIC | cut -d" " -f 7 | cut -d/ -f 1`

if [ "$EXTERNAL_ADDR" = "" ]; then
    EXTERNAL_ADDR=127.0.0.1
fi


sh /opt/jboss/docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR -Djboss.bind.address.private=$EXTERNAL_ADDR -Djboss.bind.address.management=$EXTERNAL_ADDR -Djgroups.bind.address=$EXTERNAL_ADDR -Djava.net.preferIPv4Stack=true -Dignore.bind.address=true

无法真正看到为什么这不会被删除的原因 . 我在这里有任何明显的配置错误吗?

1 回答

  • 1

    这里的问题是用sh而不是exec运行docker-entrypoint.sh . 将行更改为

    exec ./docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR
    

    解决了这个问题 .

相关问题