我在Docker主机上运行了一个Keycloak独立HA群集。群集使用JDBC Ping到PostgreSQL数据库进行发现(因为这最终将在ECS上运行,因此不会进行多播)。
群集发现运行良好,每个节点都会在启动时将自己添加到数据库中。然而,当停止使用#14; docker stop"时,他们不会自行移除。只要至少有一个其他节点向上,这很好,因为它们会自动检测被击落的节点并重新平衡,但如果最后一个节点出现故障,最后一行将保留。然后,当一个新节点启动时,它将尝试连接到过时节点并失败。
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
无法真正理解为什么这种情况无法消除。我在这里做出了明显的配置错误吗?
答案 0 :(得分:2)
这里的问题是使用sh而不是exec运行docker-entrypoint.sh。将行更改为
>>> get(arr, 2, 3)
4
>>> get(arr, 4, 100)
-1
解决了问题。