代码之家  ›  专栏  ›  技术社区  ›  Bonnotbh

keypolt docker集群未从jdbc_ping数据库中删除

  •  1
  • Bonnotbh  · 技术社区  · 6 年前

    我在Docker主机上运行了一个KeyCovert独立的HA集群。集群使用jdbc ping到postgresql数据库进行发现(因为这最终将在ecs上运行,所以没有多播)。

    集群发现工作得很好,每个节点在启动时都会将自己添加到数据库中。然而,当他们被“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
    

    我真的看不出为什么这个不被移除。我这里有没有明显的配置错误?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bonnotbh    6 年前

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

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

    解决了这个问题。