Leiderschapsverkiezing met consul

1. Overzicht

In deze tutorial we zullen zien hoe Leadership Election with Consul helpt om gegevensstabiliteit te waarborgen. We zullen een praktisch voorbeeld geven van hoe u gedistribueerde vergrendeling in gelijktijdige toepassingen kunt beheren.

2. Wat is consul?

Consul is een open-source tool die serviceregistratie en detectie biedt op basis van gezondheidscontrole. Bovendien bevat het een grafische webgebruikersinterface (GUI) om Consul te bekijken en er gemakkelijk mee te communiceren. Het omvat ook extra mogelijkheden van sessiebeheer en Key-Value (KV) -opslag.

In de volgende secties zullen we ons concentreren op hoe we dat kunnen gebruik het sessiebeheer van Consul en de KV-winkel om de leider te selecteren in toepassingen met meerdere instanties.

3. Consul Fundamentals

De consul-agent is het belangrijkste onderdeel dat op elk knooppunt van een consul-cluster wordt uitgevoerd. Het is verantwoordelijk voor de gezondheidscontrole; registreren, ontdekken en oplossen van diensten; het opslaan van configuratiegegevens; en veel meer.

De consul-agent kan binnenkomen twee verschillende modi - Server en agent.

De belangrijkste verantwoordelijkheden van de Consul Server moeten reageren op de vragen van de agenten en de leider kiezen. Het leiderschap wordt geselecteerd met behulp van het consensusprotocol om consistentie te bieden (zoals gedefinieerd door CAP) op basis van het Raft-algoritme.

Het valt niet in het bestek van dit artikel om in detail in te gaan op hoe de consensus werkt. Desalniettemin is het vermeldenswaard dat de knooppunten zich in een van de drie staten kunnen bevinden: leider, kandidaat of volger. Het slaat ook de gegevens op en reageert op vragen van de agenten.

Agent is lichter dan de consul-server. Het is verantwoordelijk voor het uitvoeren van de gezondheidscontrole van de geregistreerde services en het doorsturen van vragen naar de server. Laten we eens kijken naar een eenvoudig diagram van een consulcluster:

Consul kan ook op andere manieren helpen, bijvoorbeeld bij gelijktijdige toepassingen waarbij één instantie de leider moet zijn.

Laten we in de komende secties bekijken hoe Consul, door middel van sessiebeheer en KV-winkel, deze belangrijke mogelijkheid kan bieden.

4. Leiderschapsverkiezing met consul

Bij gedistribueerde implementaties is de dienst die het slot vasthoudt de leider. Daarom is het voor systemen met hoge beschikbaarheid van cruciaal belang om sloten en leiders te beheren.

Consul biedt een gebruiksvriendelijke KV-winkel en sessiebeheer. Die functionaliteiten dienen om leidersverkiezingen op te bouwen, dus laten we de principes erachter leren.

4.1. Leiderschapsconflict

Het eerste dat alle instanties die tot het gedistribueerde systeem behoren, doen, is strijden om het leiderschap. De bewering om een ‚Äč‚Äčleider te zijn omvat een reeks stappen:

  1. Alle instanties moeten het eens zijn over een gemeenschappelijke sleutel om te strijden.
  2. Vervolgens maakt de instantie een sessie aan met behulp van de overeengekomen sleutel via Consul-sessiebeheer en KV-mogelijkheden.
  3. Ten derde moeten ze de sessie verwerven. Als de geretourneerde waarde waar, het slot hoort bij de instantie, en als false, de instantie is een volger.
  4. De instanties moeten continu uitkijken naar de sessie om het leiderschap weer te verwerven in geval van mislukking of vrijlating.
  5. Ten slotte kan de leider de sessie loslaten en begint het proces opnieuw.

Zodra de leider is gekozen, gebruiken de rest van de instanties Consul KV en sessiebeheer om de leider te ontdekken door:

  • De afgesproken sleutel ophalen
  • Sessie-informatie ophalen om de leider te leren kennen

4.2. Een praktisch voorbeeld

We moeten de sleutel en de waarde creëren samen met de sessie in Consul met meerdere actieve instances. Om hierbij te helpen, gebruiken we de Kinguin Digital Limited Leadership Consul open-source Java-implementatie.

Laten we eerst de afhankelijkheid opnemen:

 com.github.kinguinltdhk leiderschap-consul $ {kinguinltdhk.version} com.ecwid.consul consul-api 

We hebben de consul-api afhankelijkheid om botsingen op de verschillende versies in Java te voorkomen.

Voor de gemeenschappelijke sleutel gebruiken we:

services /% s / leider

Laten we het hele proces testen met een eenvoudig fragment:

nieuwe SimpleConsulClusterFactory () .mode (SimpleConsulClusterFactory.MODE_MULTI) .debug (true) .build () .asObservable () .subscribe (i -> System.out.println (i));

Vervolgens maken we een cluster met meerdere instanties met asObservable () om toegang te krijgen tot evenementen door abonnees. De leider maakt een sessie in Consul en alle instanties verifiëren de sessie om het leiderschap te bevestigen.

Ten slotte passen we de configuratie van de consul en het sessiebeheer aan, en de overeengekomen sleutel tussen de instanties om de leider te kiezen:

cluster: leader: serviceName: cluster serviceId: node-1 consul: host: localhost poort: 8500 detectie: ingeschakeld: false sessie: ttl: 15 vernieuwen: 7 verkiezing: envelop Sjabloon: services /% s / leider

4.3. Hoe het te testen

Er zijn verschillende opties om Consul te installeren en een agent te runnen.

Een van de mogelijkheden om Consul in te zetten is via containers. We gebruiken de Consul Docker-image die beschikbaar is in Docker Hub, 's werelds grootste opslagplaats voor containerimages.

We implementeren Consul met Docker door de volgende opdracht uit te voeren:

docker run -d --naam consul -p 8500: 8500 -e CONSUL_BIND_INTERFACE = eth0 consul

De consul is nu actief en zou beschikbaar moeten zijn op localhost: 8500.

Laten we het fragment uitvoeren en de uitgevoerde stappen controleren:

  1. De leider maakt een sessie in Consul.
  2. Dan wordt het gekozen (gekozen. eerste).
  3. De rest van de instanties kijkt totdat de sessie wordt vrijgegeven:
INFO: multi mode actief INFO: sessie aangemaakt e11b6ace-9dc7-4e51-b673-033f8134a7d4 INFO: sessie vernieuwen gepland op 7 seconden frequentie INFO: stemfrequentie instellen op 10 seconden frequentie ElectionMessage (status = gekozen, stem = stem {sessionId = 'e11b6ace -9dc7-4e51-b673-033f8134a7d4 ', serviceName = "cluster-app", serviceId = "node-1"}, error = null) ElectionMessage (status = elected.first, vote = Stem {sessionId =' e11b6ace-9dc7- 4e51-b673-033f8134a7d4 ', serviceName = "cluster-app", serviceId = "node-1"}, error = null) ElectionMessage (status = gekozen, stem = Stem {sessionId =' e11b6ace-9dc7-4e51-b673-033f8134a7d4 ', serviceName = "cluster-app", serviceId = "node-1"}, error = null) 

Consul biedt ook een web-GUI die beschikbaar is op // localhost: 8500 / ui.

Laten we een browser openen en op het sleutelwaarde-gedeelte klikken om te bevestigen dat de sessie is gemaakt:

Daarom heeft een van de gelijktijdige instances een sessie gemaakt met de afgesproken sleutel voor de applicatie. Pas wanneer de sessie is vrijgegeven, kan het proces opnieuw beginnen en kan een nieuwe instantie een leider worden.

5. Conclusie

In dit artikel hebben we de grondbeginselen van de verkiezing van leiderschap laten zien in krachtige applicaties met meerdere instanties. We hebben laten zien hoe sessiebeheer en KV-winkelmogelijkheden van Consul kunnen helpen bij het verkrijgen van het slot en het selecteren van de leider.

Zoals altijd is de code beschikbaar op GitHub.