NSQ Docker 群
Posted
技术标签:
【中文标题】NSQ Docker 群【英文标题】:NSQ Docker Swarm 【发布时间】:2017-04-25 04:32:45 【问题描述】:我正在尝试在 Docker Swarm 中使用 NSQ,但没有成功
mhlg/rpi-nsq 是为 Raspberry Pi ARM7 板构建的 Docker 映像,如果作为普通 Docker 容器运行,我可以确认它可以正常工作
在 Docker 中运行 NSQ(正常)
# crete a bridged network
$ docker network create nsq_network
# run lookupd
$ docker run --name nsqlookupd --network nsq_network -p 4160:4160 -p 4161:4161 mhlg/rpi-nsq nsqlookupd
# run nsqd
$ docker run --name nsqd --network nsq_network -p 4150:4150 -p 4151:4151 mhlg/rpi-nsq nsqd --broadcast-address=nsqd --lookupd-tcp-address=nsqlookupd:4160
# run nsqadmin
$ docker run --name nsqadmin --network nsq_network -p 4171:4171 mhlg/rpi-nsq nsqadmin --lookupd-http-address=nsqlookupd:4161
在 Docker Swarm 模式下运行 NSQ (FAIL) 这就是我在 swarm manager 中所做的事情
# crete an overlay network
$ docker network create nsq_network
# run nsqlookupd
$ docker service create --replicas 1 --name nsqlookupd --network nsq_network -p 4160:4160 -p 4161:4161 mhlg/rpi-nsq nsqlookupd
# run nsqd
$ docker service create --replicas 1 --name nsqd --network nsq_network -p 4150:4150 -p 4151:4151 mhlg/rpi-nsq nsqd --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=nsqd
# run nsqadmin
$ docker service create --replicas 1 --name nsqadmin --network nsq_network -p 4171:4171 mhlg/rpi-nsq nsqadmin --lookupd-http-address=nsqlookupd:4161
如果我附加到 nsqd 服务,我可以看到它无法连接到 nsqlookupd 服务。
[nsqd] 2016/12/09 16:51:56.851953 LOOKUPD(nsqlookupd:4160): sending heartbeat
[nsqd] 2016/12/09 16:51:56.852049 LOOKUP connecting to nsqlookupd:4160
[nsqd] 2016/12/09 16:51:57.852457 LOOKUPD(nsqlookupd:4160): ERROR PING - dial tcp: i/o timeout
看起来覆盖网络会产生一些问题(多播?),但我不知道如何解决它,尤其是在 ARM 设备上。
我尝试通过 ssh 进入运行 nsqd 服务的 Docker 主机并从 nsqd 容器内执行一些 dns 命令
# resolve google.com (OK)
root@3206d1c3cd3d:/# nslookup google.com
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: google.com
Address: 216.58.214.78
# resolve nsqd service (OK) - can resolve the container I'm executing the command from
root@e1f6430acd1c:/# nslookup nsqd
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: nsqd
Address: 10.0.0.2
# resolve nsqlookupd service (FAIL)
root@e1f6430acd1c:/# nslookup nsqlookupd
;; connection timed out; no servers could be reached
【问题讨论】:
【参考方案1】:在 docker swarm 中遇到了同样的问题。我就是这样解决的:
docker service create \
--mode global \
--name swarm-master-nsq_nsqlookupd \
--constraint node.role==manager \
--hostname nsqlookupd \
--network name=swarm-master-nsq_nsq,alias=nsqlookupd \
nsqio/nsq:latest /nsqlookupd
docker service create \
--replicas 3 \
--name swarm-master-nsq_nsqd \
--constraint node.role==manager \
--hostname nsqd \
--network name=swarm-master-nsq_nsq,alias=nsqd \
nsqio/nsq:latest sh -c '/nsqd --broadcast-address=$(hostname -i) --lookupd-tcp-address=nsqlookupd:4160'
docker service create \
--replicas 1 \
--publish 4171:4171 \
--name swarm-master-nsq_nsqadmin \
--constraint node.role==manager \
--hostname nsqadmin \
--network name=swarm-master-nsq_nsq,alias=nsqadmin \
nsqio/nsq:latest /nsqadmin --lookupd-http-address=nsqlookupd:4161
据我所知,您的示例中有几个问题:
-
您没有为 nsqlookupd 和其他服务设置别名
nsqd 的广播不正确(假设您想在某个时候增加 nsqd 节点的数量)
【讨论】:
这如何与 nsqd 的 3 个副本一起工作?您不会因为主题转到错误的实例而丢失消息吗? @JoePhillips,我不确定您所说的“您不会因为主题转到错误的实例而丢失消息”是什么意思。我对 nsq 不是很全能,但我认为您的意思是不同的 nsqds 可以专用于不同的主题,而上述设置可能导致主题转到错误的 nsqds?根据我目前的理解(以及我的用例),我设置中的所有 nsqd 节点共享相同的主题,因此对于任何给定的主题,消息可以在任何 nsqd 节点上,并且工作人员将负责查询每个 nsqd 节点和正在检索这些消息。 你是对的。我没有意识到您可以将单个主题的消息分发到不同的 nsqd 实例【参考方案2】:您表示:
# crete an overlay network
$ docker network create nsq_network
但是,这不会创建覆盖网络,而是创建桥接网络。 考虑运行:
docker network create --driver overlay nsq_network
【讨论】:
以上是关于NSQ Docker 群的主要内容,如果未能解决你的问题,请参考以下文章