如何使用Consul确保只有一项服务正在执行任务?
我已经按照http://www.consul.io/中的示例进行了操作,但我并不是100%确定要走哪条路。我应该使用KV吗?我应该使用服务吗?或者我应该使用注册服务作为运行状况检查,并使群集以给定的时间间隔进行调用?
例如,假设有几个数据中心。在每个数据中心内都有许多服务在运行。这些服务中的每一项都可以发送电子邮件。这些服务必须检查是否有任何电子邮件要发送。如果有,则发送电子邮件。但是,我不希望多次发送同一封电子邮件。
如何确保所有电子邮件都被发送,而且没有一封电子邮件被多次发送?
我可以使用其他技术来做到这一点,但我正在尝试使用Consul实现这一点。
答案 0 :(得分:7)
例如,假设您在不同的AWS可用区域中有三台服务器进行故障转移。每个人都推出:
consul lock -verbose lock-name ./run_server.sh
Consul代理只会运行./run_server.sh
命令,服务器首先获取锁定。如果./run_server.sh
在具有锁定的服务器上失败,Consul代理将释放锁定,另一个先获取锁定的节点将执行./run_server.sh
。这样您就可以进行故障转移,并且一次只能运行一台服务器。如果您正确注册了Consul运行状况检查,您将能够看到第一个节点上的服务器发生故障,您可以修复并重新启动该节点上的consul lock ...
,它将阻塞,直到它可以获得锁定。
目前,分布式锁定只能在单个Consul Datacenter中进行。但是,由于您需要决定Consul Server构成数据中心的内容,因此您应该能够解决您的问题。如果您希望锁定联邦领事数据中心,则必须等待它,因为它是路线图项目。
答案 1 :(得分:1)
第一点: 问题是如何使用Consul来解决特定问题。但是,由于八卦协议性质的内在限制,Consul无法解决该特定问题。
当一个数据中心无法与另一个数据中心通信时,您无法安全地确定问题是网络还是受影响的数据中心。
通常的解决方案是定义当一个DC无法与另一个DC通信时会发生什么。例如,如果我们有3个数据中心(DC1,DC2和DC3),我们可以确定每当一个DC无法与其他2个DC通信时,它就会停止更新数据库。
如果DC1无法与DC2和DC3通话,则DC1将停止更新数据库,系统将假定DC2和DC3仍在线。
让我们假设DC2和DC3仍在线,他们可以互相交谈,然后我们有法定人数来继续运行系统。
当DC1再次上线时,它将赶上数据库。
领事在哪里可以帮到这里?它可以在DC之间进行通信并检查它们是否在线......但ICMP也是如此。
看看评论。这是否回答你的问题?并不是的。但我不认为这个问题有答案。
第二点:问题是“如何在领导人选举中使用领事?”最好问一下Consul如何选出一位新领导人。或者“鉴于Consul.io中的文档,您能否举例说明如何使用Consul确定领导者”。
如果这是您真正想要的,那么问题已经回答:How does a Consul agent know it is the leader of a cluster?