2014-12-28 2 views
9

Как использовать Консул, чтобы убедиться, что только одна служба выполняет задачу?Как использовать Консула в выборах лидера?

Я следовал примерам в http://www.consul.io/, но я не уверен на 100%, какой путь. Должен ли я использовать KV? Должен ли я пользоваться услугами? Или я должен использовать регистр в качестве проверки работоспособности и сделать его доступным для кластера с заданным интервалом?

Например, представьте, что имеется несколько центров обработки данных. В каждом центре обработки данных работает много служб. Каждая из этих служб может отправлять электронные письма. Эти службы должны проверять, есть ли какие-либо электронные письма для отправки. Если есть, отправьте электронные письма. Тем не менее, я не хочу, чтобы одно и то же электронное письмо отправлялось более одного раза.

Как бы он удостоверился, что все электронные письма отправлены, и никто не был отправлен более одного раза?

Я мог бы сделать это с использованием других технологий, но я пытаюсь реализовать это с помощью Consul.

+1

Похоже, вам также нужна распределенная очередь. – U2EF1

+0

AFAIK: ваша заявленная цель никогда не может быть достигнута со 100% уверенностью из-за ошибок сетевого разбиения (*, где сеть разбита на две отдельные сети, поскольку мост между двумя кластерами узлов отключен *). Несмотря на то, что есть определенные решения даже по этой проблеме, я не думаю, что они могут гарантировать одного лидера в 100% случаев, а это значит, что вы все равно можете получить несколько сообщений. Вы должны посмотреть на алгоритм paxos и реализовать его с помощью вашего инструмента выбора, хотя вам лучше посоветовать купить решение, а не строить его. –

+0

Возможно, вы захотите прочитать: http://book.mixu.net/distsys/replication.html –

ответ

3

Первый пункт: Вопрос заключается в том, как использовать Консул для решения конкретной проблемы. Однако Консул не может решить эту конкретную проблему из-за внутренних ограничений в характере протокола сплетен.

Когда один центр обработки данных не может разговаривать с другим, вы не можете безопасно определить, является ли проблема сетью или затронутым центром обработки данных.

Обычное решение - определить, что происходит, когда один DC не может разговаривать с другим. Например, если у нас есть 3 центра обработки данных (DC1, DC2 и DC3), мы можем определить, что всякий раз, когда один DC не может разговаривать с двумя другими DC, он прекращает обновление базы данных.

Если DC1 не может разговаривать с DC2 и DC3, тогда DC1 прекратит обновление базы данных, и система будет считать, что DC2 и DC3 все еще находятся в сети.

Представим себе, что DC2 и DC3 все еще в сети, и они могут разговаривать друг с другом, тогда у нас есть кворум для продолжения работы системы.

Когда DC1 снова появится в сети, он будет играть в догоняющую базу данных.

Куда может помочь Консул? Он может связываться между DC и проверять, находятся ли они в сети ... но так же может ICMP.

Взгляните на комментарии. Является ли это ответом на ваш вопрос? На самом деле, нет. Но я не думаю, что у этого вопроса есть ответ.

Второй вопрос: вопрос: «Как использовать Консула в выборах лидеров?» Было бы лучше спросить, как Консул выбирает нового лидера. Или «Учитывая документацию в Consul.io, можете ли вы привести мне пример того, как определить лидера с помощью Consul».

Если это то, что вы действительно хотите, то этот вопрос уже ответил: How does a Consul agent know it is the leader of a cluster?

+1

Как насчет https://www.consul.io/docs/guides/leader-election.html? Также консул поддерживает последовательные записи над CAS (насколько я знаю), и их должно быть достаточно для выборов. – mabn

+0

Я думаю, что ссылка, предоставленная @mabn, является хорошей отправной точкой для этого. В этой статье/руководстве описывается, как реализовать выбор лидеров на стороне клиента для данной службы в вашем кластере. –

7

Это именно случай использования для Consul Distributed Locks

Например, скажем, у вас есть три сервера в разных зонах доступности АМС для отказа. Каждый из них запускается с:

consul lock -verbose lock-name ./run_server.sh 

консулом агента будет работать только в ./run_server.sh команду, на которой когда-либо сервер получает блокировку первым.Если ./run_server.sh сбой на сервере с блокировкой, агент Consul освободит блокировку, а другой узел, который ее приобретет, сначала выполнит ./run_server.sh. Таким образом, вы получаете отказ и только один сервер работает одновременно. Если вы правильно зарегистрировали свои проверки работоспособности Consul, вы сможете увидеть, что сервер на первом узле не удалось, и вы можете восстановить и перезагрузить consul lock ... на этом узле, и он будет блокироваться, пока не сможет получить блокировку.

В настоящее время распределенная блокировка возможна только в одном центре данных Consul. Но, поскольку вам решать, какие серверы Консула составляют центр данных, вы должны решить свою проблему. Если вы хотите заблокировать центры данных Federated Consul, вам придется подождать, так как это дорожная позиция.

 Смежные вопросы

  • Нет связанных вопросов^_^