首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aerospike心跳呼叫在TIME_WAIT中卡住

Aerospike心跳呼叫在TIME_WAIT中卡住
EN

Stack Overflow用户
提问于 2019-11-02 15:32:10
回答 2查看 146关注 0票数 3

我正试着在GCP上设置一个航空梭子机集群。我正在使用Core OS和Docker来运行Aerospike守护进程。

我在as-node-01aerospike.conf中进行了以下配置

代码语言:javascript
复制
    service {
        service-threads 10

    }               

    network {                

        service {
            address any
            port 3000
            access-address as-node-01
        }           
        fabric {
            address any
            port 3001

        }            
        info {
            address any
            port 3003
        }              
        heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-02 3002
            mesh-seed-address-port as-node-01 3002

        }         
    }


    logging {
        console { 
            context any info
        }
    }               


    namespace rte {       
    memory-size 4G           
        replication-factor 1     
        high-water-memory-pct 60 

        stop-writes-pct 90       
        default-ttl 0            

        storage-engine memory    
    }

以下是as-node-02的说明

代码语言:javascript
复制
    service {
        service-threads 10

    }               

    network {                

        service {
            address any
            port 3000
            access-address as-node-02
        }           
        fabric {
            address any
            port 3001

        }            
        info {
            address any
            port 3003
        }              
        heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-01 3002
            mesh-seed-address-port as-node-02 3002

        }         
    }


    logging {
        console { 
            context any info
        }
    }               


    namespace rte {       
    memory-size 4G           
        replication-factor 1     
        high-water-memory-pct 60 

        stop-writes-pct 90       
        default-ttl 0            

        storage-engine memory    
    }

我正在通过以下命令使用aerospike:4.6.0.4 docker镜像

代码语言:javascript
复制
docker run -d -v `pwd`:/opt/aerospike/etc --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike asd --foreground --config-file /opt/aerospike/etc/aerospike.conf

当我在两个节点上启动守护进程时,我在日志内容中看到以下内容。

代码语言:javascript
复制
Nov 02 2019 07:20:23 GMT: WARNING (socket): (socket.c:959) (repeated:67) Error while connecting socket to 10.160.0.14:3002
Nov 02 2019 07:20:23 GMT: WARNING (hb): (hb.c:4882) (repeated:67) could not create heartbeat connection to node {10.160.0.14:3002}
Nov 02 2019 07:20:23 GMT: WARNING (socket): (socket.c:900) (repeated:67) Error while connecting: 111 (Connection refused)

然后,我尝试用netstat查看哪里出了问题,我看到心跳调用停留在TIME_WAIT状态。

代码语言:javascript
复制
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39890        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38662        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39998        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39878        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39716        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39252        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39872        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39776        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38796        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38668        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38844        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39668        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39120        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39138        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39174        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38740        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39614        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39000        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39318        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38982        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39584        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39420        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38758        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39656        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39866        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39482        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39222        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39818        TIME_WAIT  

有成百上千个这样的调用处于TIME_WAIT状态。

我不明白为什么这些调用会卡在TIME_WAIT中,而不会被转发到docker容器。

EN

回答 2

Stack Overflow用户

发布于 2019-11-12 01:36:49

看起来您正在两个不同的节点上运行两个容器。并在aerospike.conf中使用节点(主机)名称。

代码语言:javascript
复制
heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-01 3002
            mesh-seed-address-port as-node-02 3002
}

  • address as-node-01指向一个接口,如果容器不在主机网络上,则该接口在容器内将无法访问。这就是--network=host为您工作的原因。
  • 如果您没有使用--net=host,则默认情况下,容器位于专用网络上,并且无法ping通其他主机(节点)或连接到其他主机上的容器。

因此,要使用此功能,您可能需要一个覆盖网络(用于多主机网络)。然后,您就可以在aerospike mesh配置中使用容器的内网IP了。

你可以试试docker swarm。如果不是docker swarm,您可能需要运行外部键值存储(如consul等)。用于覆盖网络的发现。

https://www.aerospike.com/docs/deploy_guides/docker/networking/index.html

https://docs.docker.com/network/overlay-standalone.swarm/

https://docs.docker.com/network/overlay/

票数 4
EN

Stack Overflow用户

发布于 2019-11-12 04:37:32

除了@SP Kesan所说的,

看起来您对指向as-node-01的两个节点使用了相同的地址绑定。(地址as-node-01)最佳实践是使用接口名称(即: eth0或eth1等)这也适用于覆盖网络,并允许您指定覆盖网络的接口名称。

请参阅:https://docs.docker.com/network/overlay/

如果容器驻留在同一台主机上,那么只需更改地址绑定就可以解决此问题。由于您的容器位于不同的主机上,因此您可以使用覆盖网络进行节点间通信,也可以使用--net host并利用主机的网络接口。

代码语言:javascript
复制
        service {
            address any
            port 3000
            access-address as-node-01
        }           
     ...     
        heartbeat {
            mode mesh
            address as-node-01
            port 3002

代码语言:javascript
复制
 service {
            address any
            port 3000
            access-address as-node-02
        }           
...            
        heartbeat {
            mode mesh
            address as-node-01
            port 3002
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58669123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档