11
votes

Comment mettre en œuvre un sémaphore distribué?

J'ai un ensemble limité de ressources que je souhaite partager entre plusieurs processus que de courir sur plusieurs serveurs. Je suppose que ce que j'ai besoin pourrait être appelé un sémaphore distribué .

J'ai trouvé un ancien implémentation PERL (basée sur sur memcached) qui pourrait être adapté. Je ne l'ai pas encore examiné complètement.

Y a-t-il une bibliothèque / composant / logiciel qui le fait déjà? Un algorithme, peut-être? Que diriez-vous de basculement?


0 commentaires

5 Réponses :


7
votes

L'algorithme pour cela s'appelle Paxos . Il y a d'autres algorithmes, mais ils réduisent tous jusqu'à Paxos (ou sont incorrects). La mise en œuvre la plus populaire est Apache Zookeper . Les serveurs de zookeeper gèrent Paxos parmi eux. Les clients se réfèrent à des objets nommés et peuvent les verrouiller, etc.


3 commentaires

Je souhaitais que je puisse avoir quelque chose de plus simple, mais je suppose que je vais apprendre quelque chose de plonger dans ceci. Merci pour le lien.


Instance de zabof paxos vertical; Paxos vertical Instanc Paxos


Zab ≠ Paxos (juste mettre à jour le lien dans le précédent Commentaire. Zookeper a besoin commandé écrit que Paxos ne garantit pas. Les commentaires liés à l'article sur une modification à Paxos qui fourniraient la fonctionnalité, mais au prix de la performance.



1
votes

Pour mettre en œuvre un sémaphore distribué, vous devez définir une autorité parmi un groupe de nœuds, puis une fois sélectionné, vous devez centraliser des demandes. Manipulation des demandes de verrouillage est un morceau de gâteau, sélectionnant le leader est plus compliqué.

Paxos résoudra que pour vous. Je viens de mettre à jour le page wikipedia , car la description de l'algorithme était incomplète et trompeuse.


0 commentaires

1
votes

Il y a un algorithme plus simple similaire à Paxos, il s'appelle radeau: http://raftconsensus.github.io/


0 commentaires

0
votes

J'aimerais suggérer de mettre en œuvre un sémaphore distribué en fonction des sessions de consul. Une session à Consul représente un contrat qui a une sémantique très spécifique.

Le contrat que le Consul fournit est que, dans l'une des situations suivantes, la session sera invalidée:

  1. Node est dérégué
  2. L'un des contrôles de santé est dérégué
  3. Tous les contrôles de santé vont à l'état critique
  4. la session est explicitement détruite
  5. TTL expire, le cas échéant

    Lorsqu'une session est invalidée, elle est détruite et ne peut plus être utilisée.

    Guide détaillé: https://www.consul.io/docs/internals/ sessions.html


0 commentaires

3
votes

Je tiens à souligner que du cas d'utilisation que vous décrivez, il y a probablement peu de besoin pour que le sémaphore lui-même soit distribué. Donc, vous ne voulez pas nécessairement un sémaphore distribué, mais un sémaphore A pour le système distribué.

L'accélérateur peut correspondre à ce projet de loi: https://github.com/pacman82/throttle


0 commentaires