Как реализовать распределенный семафор? - PullRequest
9 голосов
/ 25 марта 2011

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

Я нашел старую реализацию Perl (основанную на memcached), которую можно адаптировать.Я еще не полностью исследовал это.

Есть ли библиотека / компонент / программное обеспечение, которое уже делает это?Алгоритм, возможно?Как насчет аварийного переключения?

Ответы [ 4 ]

7 голосов
/ 25 марта 2011

Алгоритм для этого называется Paxos .Существуют и другие алгоритмы, но все они сводятся к Paxos (или неверны).Самая популярная реализация - Apache Zookeeper .Серверы Zookeeper запускают Paxos между собой.Клиенты обращаются к именованным объектам и могут блокировать их и т. Д.

1 голос
/ 01 августа 2014

есть более простой алгоритм, похожий на paxos, он называется raft: http://raftconsensus.github.io/

1 голос
/ 02 мая 2011

Чтобы реализовать распределенный семафор, вам нужно определить полномочия среди кластера узла, а затем, когда он выбран, вам необходимо централизовать запросы к нему. Обработка запросов на блокировку - это просто, выбор лидера более сложен.

Паксос решит это за вас. Я только что обновил страницу wikipedia , потому что описание алгоритма было неполным и вводящим в заблуждение.

0 голосов
/ 20 марта 2019

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

Контракт, который предоставляет Консул, заключается в том, что в любой из следующих ситуаций сеанс будет признан недействительным:

  1. Узел снят с учета
  2. Любые проверки работоспособности сняты с учета
  3. Любая проверка работоспособности переходит в критическое состояние
  4. Сессия явно уничтожена
  5. Срок действия истекает, если применимо

Когда сеанс признан недействительным, он уничтожается и больше не может использоваться.

Подробное руководство: https://www.consul.io/docs/internals/sessions.html

...