我正试着在GCP上设置一个航空梭子机集群。我正在使用Core OS和Docker来运行Aerospike守护进程。
我在as-node-01的aerospike.conf中进行了以下配置
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的说明
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镜像
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当我在两个节点上启动守护进程时,我在日志内容中看到以下内容。
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状态。
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容器。
发布于 2019-11-12 01:36:49
看起来您正在两个不同的节点上运行两个容器。并在aerospike.conf中使用节点(主机)名称。
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
发布于 2019-11-12 04:37:32
除了@SP Kesan所说的,
看起来您对指向as-node-01的两个节点使用了相同的地址绑定。(地址as-node-01)最佳实践是使用接口名称(即: eth0或eth1等)这也适用于覆盖网络,并允许您指定覆盖网络的接口名称。
请参阅:https://docs.docker.com/network/overlay/
如果容器驻留在同一台主机上,那么只需更改地址绑定就可以解决此问题。由于您的容器位于不同的主机上,因此您可以使用覆盖网络进行节点间通信,也可以使用--net host并利用主机的网络接口。
service {
address any
port 3000
access-address as-node-01
}
...
heartbeat {
mode mesh
address as-node-01
port 3002和
service {
address any
port 3000
access-address as-node-02
}
...
heartbeat {
mode mesh
address as-node-01
port 3002https://stackoverflow.com/questions/58669123
复制相似问题