NSQ Docker Swarm

3

我试图在Docker Swarm中使用NSQ,但没有成功

mhlg/rpi-nsq是为Raspberry Pi ARM7板构建的Docker镜像,如果作为普通Docker容器运行,我可以确认它能够正常工作

在Docker中运行NSQ(OK)

# 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(失败)这是我在Swarm管理器中正在做的事情

# 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
2个回答

0

您指示:

# crete an overlay network
$ docker network create nsq_network

然而,这并不会创建一个覆盖网络,而是一个桥接网络。 考虑运行:

docker network create --driver overlay nsq_network

0

在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

据我所知,您的示例中存在几个问题:
  1. 您没有为nsqlookupd和其他服务设置别名
  2. nsqd的广播不正确(假设您希望在某个时候增加nsqd节点)

这在使用3个nsqd副本时如何工作?主题是否会被发送到错误的实例,导致消息丢失? - Joe Phillips
@JoePhillips,我不确定您所说的“主题进入错误的实例会丢失消息”是什么意思。 我对nsq不是非常熟悉,但我认为您的意思是,不同的nsqd可能专用于不同的主题,并且上述设置可能导致主题进入错误的nsqd?根据我的当前理解(也适用于我的用例),我设置中的所有nsqd节点都共享相同的主题,因此对于任何给定的主题,消息可能在任何nsqd节点上,工作人员负责查询每个nsqd节点并检索这些消息。 - Aibek
你是对的。我没有意识到你可以在不同的nsqd实例之间分发单个主题的消息。 - Joe Phillips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接