我正在使用领事build立一个服务发现的云端堆栈,但是我打了一堵墙,所以我问了一下互联网的人。
我想要做的是在多个主机的consul上注册一个服务,但是在服务启动时只返回其中的一个查询。 确切地说:
在这个时候,当我查询这些数据的领事时,我会得到所有三个节点的答案。 我只想得到其中的一个,只要服务是由该节点提供的,但是如果没有,我想为所有问题find另一个节点。
更准确地说,我构build了一个xtradb集群,其中一个节点必须从我们的旧数据中心复制。 可能只有一个,在给定时刻正在复制,但如果该节点closures,其他一些节点必须继续复制。
我可以用一个外部的监控主机来解决这个问题,但是这可以是一个SPOF,所以最好的办法是在所有节点上放置一个复制监督脚本,向总领事询问“我是否是负责复制的主机? 如果答案是肯定的,那么在本地设置副本。 从理论上讲,如果该节点closures,领事可以投票给新的“副本主” – 并且该节点上的代理将设置复制。
那么,领事能干吗? 如果没有,有没有其他办法来实现这一目标? (我们在GCP上运行,所以我不能使用磁盘或浮动IP进行仲裁,所有的主机都是独立的,我需要一些能够对主机有共识的层次)。在最坏的情况下,我会自己写这个,但是有一个生产就绪的解决scheme会更好。
假设你有三个服务运行并注册了领事,并且查询curl -s 'http://localhost:8500/v1/catalog/service/consul' | jq ''
curl -s 'http://localhost:8500/v1/catalog/service/consul' | jq ''
导致这个
[{ "Node": "local01-consul0001.local", "Address": "192.168.33.11", "ServiceID": "consul", "ServiceName": "consul", "ServiceTags": [ "master" ], "ServiceAddress": "", "ServicePort": 8300 }, { "Node": "local01-consul0002.local", "Address": "192.168.33.12", "ServiceID": "consul", "ServiceName": "consul", "ServiceTags": [ "master" ], "ServiceAddress": "", "ServicePort": 8300 }, { "Node": "local01-consul0003.local", "Address": "192.168.33.13", "ServiceID": "consul", "ServiceName": "consul", "ServiceTags": [ "master" ], "ServiceAddress": "", "ServicePort": 8300 }]
由于所有可用的,你应该能够使用字母数字顺序的第一个:
# curl -s 'http://localhost:8500/v1/catalog/service/consul' | jq '.[0]' { "Node": "local01-consul0001.local", "Address": "192.168.33.11", "ServiceID": "consul", "ServiceName": "consul", "ServiceTags": [ "master" ], "ServiceAddress": "", "ServicePort": 8300 }