Heim Betrieb und Instandhaltung Nginx Wie Nginx den Abfragealgorithmus implementiert

Wie Nginx den Abfragealgorithmus implementiert

May 21, 2023 pm 09:43 PM
nginx

Einfacher Abfragealgorithmus

Dieser Algorithmus ist relativ einfach. Sie haben beispielsweise drei Server

Der dritte Server192.168.1.3
public class simplepolling {

  /**
   * key是ip
   */
  public static list <string> ipservice = new linkedlist <>();
  static {
    ipservice.add("192.168.1.1");
    ipservice.add("192.168.1.2");
    ipservice.add("192.168.1.3");
  }
  public static int pos = 0;
  public static string getip(){
    if(pos >= ipservice.size()){
      //防止索引越界
      pos = 0;
    }
    string ip = ipservice.get(pos);
    pos ++;
    return ip;

  }

  public static void main(string[] args) {
    for (int i = 0; i < 4; i++) {
      system.out.println(getip());

    }
  }
}
Nach dem Login kopieren
Gewichteter Abfragealgorithmus
Nachdem die erste Anfrage eingegangen ist, wird standardmäßig auf den ersten Server zugegriffen, die zweite Anfrage wird auf den zweiten Server zugreifen und die dritte Anfrage wird auf den dritten Server zugreifen . Die vierte Aufforderung kommt, die erste Station zu besuchen, und so weiter. Das Folgende ist ein einfacher Algorithmus, der von meinem Code implementiert wird: Das Ergebnis von 4 simulierten Ausführungen ist
Wenn ich zu diesem Zeitpunkt einen Server mit besserer Leistung habe (z. B. 192.168.1.1), möchte ich dies Server verarbeitet mehr Eine kleine Anfrage, diesmal mit Wahrscheinlichkeitsgewichtung, kann dieser Algorithmus nicht implementiert werden. Bitte sehen Sie sich den Polling-Algorithmus der aktualisierten Version an, den ich später beschreibe.

Zu diesem Zeitpunkt muss ich die Gewichtungen der drei Server vor mir festlegen. Beispielsweise ist der erste Server auf 5, der zweite Server auf 1 und der dritte eingestellt Server ist auf 1 eingestellt.


Wie Nginx den Abfragealgorithmus implementiertDer erste Server

Dritter Server

192.168.1.3

1

Top 5 zu diesem Zeitpunkt Jede Anfrage greift auf den ersten Server zu, die sechste Anfrage greift auf den zweiten Server zu und die siebte Anfrage greift auf den dritten Server zu. Das Folgende ist das Codebeispiel, das ich gegeben habe: Das laufende Ergebnis zu diesem Zeitpunkt ist Der erste sichtbare Server wurde 5 Mal ausgeführt, die nächsten 2 Server wurden einmal ausgeführt und bald. Vielleicht denken Sie, dass dieser Algorithmus nicht schlecht ist. Tatsächlich besteht ein Nachteil dieses Algorithmus darin, dass ich möglicherweise viele Anforderungen an den ersten Server ausführen muss, wenn das Gewicht des ersten Servers zu groß ist. In diesem Fall ist die Verteilung ungleichmäßig und führt zu Druck auf einem bestimmten Server. Übermäßige Größe führt zum Zusammenbruch. Deshalb werde ich später einen dritten Algorithmus vorstellen, um dieses Problem zu lösen Kombiniert werde ich mein eigenes Verständnis mit Bildern und Text erläutern. Die Serverkonfiguration und das Gewicht, die ich hier als Beispiel gebe, sind immer noch die gleichen wie obenaktuelles Gewicht = Eigengewicht + aktuelles Gewicht nach AuswahlAktuelles Gewicht nach Auswahl = aktuelles Maximalgewicht - Gesamtgewicht
public class weightpolling {

  /**
   * key是ip,value是权重
   */
  public static map<string, integer> ipservice = new linkedhashmap<>();
  static {
    ipservice.put("192.168.1.1", 5);
    ipservice.put("192.168.1.2", 1);
    ipservice.put("192.168.1.3", 1);
  }
  public static int requestid = 0;
  public static int getandincrement() {
    return requestid++;
  }

  public static string getip(){
    //获取总的权重
    int totalweight =0;
    for (integer value : ipservice.values()) {
      totalweight+= value;
    }
    //获取当前轮询的值
    int andincrement = getandincrement();
    int pos = andincrement% totalweight;
    for (string ip : ipservice.keyset()) {
      if(pos < ipservice.get(ip)){
        return ip;
      }
      pos -= ipservice.get(ip);
    }
    return null;
  }

  public static void main(string[] args) {
    for (int i = 0; i < 7; i++) {
      system.out.println(getip());
    }
  }

}
Nach dem Login kopieren
Anfrage
Gesamtgewichtaktuelles Maximalgewicht Zurückgegebenes IP

1


{5,1,1}

7Wie Nginx den Abfragealgorithmus implementiert

5

192 .168 .1.1

{-2, 1,3 ,3}

7

3192.168.1.2192,16 8.1.1 8.1.3{4,-2,-2}{2,-1,-1}{0,0,0}Wie Sie auf dem Bild oben sehen können, obwohl das Gewicht von Der erste Server ist auf 5 eingestellt, es ist nicht die fünfte Anfrage. Sie werden alle auf dem ersten Server ausgeführt, aber die Planungssequenz ist sehr einheitlich und das aktuelle Gewicht kehrt zu {0, 0, zurück. 0} nach der Auswahl in der siebten Planung Der Status der Instanz stimmt mit dem Anfangsstatus überein Der Planungsvorgang kann in Zukunft wiederholt werden. Einige Leute verstehen die Bedeutung des vorherigen Bildes möglicherweise nicht genau: 1 Das Gesamtgewicht wird sich nicht ändern 2 . In Kapitel 2. Wenn eine Anfrage eingeht, initialisiere ich den aktuellen Gewichtungswert standardmäßig auf {0,0,0}, sodass der aktuelle Gewichtungswert {5+0,1+0,1+0} ist, wobei 5,1,1 ist die von jedem Server festgelegte Gewichtung, die wir zuvor festgelegt haben. 3. Hier können wir daraus schließen, dass das maximale Gewicht der ersten Anfrage 5 beträgt. Dann kehren wir zum ersten Server zurück ip4. Dann wird das aktuelle Maximalgewicht abzüglich des Gesamtgewichts (5-7) festgelegt Der Wert des ausgewählten Gewichts beträgt {5-7,1,1}5. Wenn die zweite Anfrage eingeht, fahren wir mit den Schritten 2, 3 und 4 fort Wenn ich es hier nicht verstehe, werde ich unten meinen eigenen Java-Code bereitstellen. Implementierter Algorithmus: Es ist ersichtlich, dass das Ausführungsergebnis hier mit dem in beschriebenen Ergebnis übereinstimmt der Tisch.
{1,-4,3}4{6,-3,4} 76
6{9,-1,-1}79192.168.1.1
7{7,0,0} 77192.168.1.1
public class polling {

  /**
   * key是ip,value是权重
   */
  public static map <string,integer> ipservice = new linkedhashmap <>();
  static {
    ipservice.put("192.168.1.1",5);
    ipservice.put("192.168.1.2",1);
    ipservice.put("192.168.1.3",1);
  }
  private static map<string,weight> weightmap = new linkedhashmap <>();

  public static string getip(){
    //计算总的权重
     int totalweight = 0;
    for (integer value : ipservice.values()) {
      totalweight+=value;
    }
    //首先判断weightmap是否为空
    if(weightmap.isempty()){
      ipservice.foreach((ip,weight)->{
        weight weights = new weight(ip, weight,0);
        weightmap.put(ip,weights);
      });
    }
    //给map中得对象设置当前权重
    weightmap.foreach((ip,weight)->{
      weight.setcurrentweight(weight.getweight() + weight.getcurrentweight());
    });

    //判断最大权重是否大于当前权重,如果为空或者小于当前权重,则把当前权重赋值给最大权重
    weight maxweight = null;
    for (weight weight : weightmap.values()) {
      if(maxweight ==null || weight.getcurrentweight() > maxweight.getcurrentweight()){
        maxweight = weight;
      }
    }
    //最后把当前最大权重减去总的权重
    maxweight.setcurrentweight(maxweight.getcurrentweight() - totalweight);
    //返回
    return maxweight.getip();
  }

  public static void main(string[] args) {
    //模拟轮询7次取ip
    for (int i = 0; i < 7; i++) {
      system.out.println(getip());
    }
  }

}

class weight{
  /**
   * ip
   */
  private string ip;
  /**
   * 设置得权重
   */
  private int weight;
  /**
   * 当前权重
   */
  private int currentweight;

  public weight(string ip, int weight,int currentweight) {
    this.ip = ip;
    this.weight = weight;
    this.currentweight = currentweight;
  }

  public string getip() {
    return ip;
  }

  public void setip(string ip) {
    this.ip = ip;
  }

  public int getweight() {
    return weight;
  }

  public void setweight(int weight) {
    this.weight = weight;
  }

  public int getcurrentweight() {
    return currentweight;
  }

  public void setcurrentweight(int currentweight) {
    this.currentweight = currentweight;
  }
}
Nach dem Login kopieren
Das Ausführungsergebnis des Codes hier ist:

Das obige ist der detaillierte Inhalt vonWie Nginx den Abfragealgorithmus implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So überprüfen Sie die Nginx -Version So überprüfen Sie die Nginx -Version Apr 14, 2025 am 11:57 AM

Die Methoden, die die Nginx -Version abfragen können, sind: Verwenden Sie den Befehl nginx -v; Zeigen Sie die Versionsrichtlinie in der Datei nginx.conf an. Öffnen Sie die Nginx -Fehlerseite und sehen Sie sich den Seitentitel an.

So konfigurieren Sie den Namen des Cloud -Server -Domänennamens in Nginx So konfigurieren Sie den Namen des Cloud -Server -Domänennamens in Nginx Apr 14, 2025 pm 12:18 PM

So konfigurieren Sie einen Nginx -Domänennamen auf einem Cloud -Server: Erstellen Sie einen Datensatz, der auf die öffentliche IP -Adresse des Cloud -Servers zeigt. Fügen Sie virtuelle Hostblöcke in die NGINX -Konfigurationsdatei hinzu, wobei der Hörport, Domänenname und das Root -Verzeichnis der Website angegeben werden. Starten Sie Nginx neu, um die Änderungen anzuwenden. Greifen Sie auf die Konfiguration des Domänennamens zu. Weitere Hinweise: Installieren Sie das SSL -Zertifikat, um HTTPS zu aktivieren, sicherzustellen, dass die Firewall den Verkehr von Port 80 ermöglicht, und warten Sie, bis die DNS -Auflösung wirksam wird.

So überprüfen Sie, ob Nginx gestartet wird So überprüfen Sie, ob Nginx gestartet wird Apr 14, 2025 pm 01:03 PM

So bestätigen Sie, ob Nginx gestartet wird: 1. Verwenden Sie die Befehlszeile: SystemCTL Status Nginx (Linux/Unix), Netstat -ano | FindStr 80 (Windows); 2. Überprüfen Sie, ob Port 80 geöffnet ist; 3. Überprüfen Sie die Nginx -Startmeldung im Systemprotokoll. 4. Verwenden Sie Tools von Drittanbietern wie Nagios, Zabbix und Icinga.

So überprüfen Sie den Namen des Docker -Containers So überprüfen Sie den Namen des Docker -Containers Apr 15, 2025 pm 12:21 PM

Sie können den Namen des Docker -Containers abfragen, indem Sie den Schritten folgen: Alle Container auflisten (Docker PS). Filtern Sie die Containerliste (unter Verwendung des GREP -Befehls). Ruft den Containernamen ab (befindet sich in der Spalte "Namen").

So konfigurieren Sie Nginx in Windows So konfigurieren Sie Nginx in Windows Apr 14, 2025 pm 12:57 PM

Wie konfiguriere ich Nginx in Windows? Installieren Sie NGINX und erstellen Sie eine virtuelle Hostkonfiguration. Ändern Sie die Hauptkonfigurationsdatei und geben Sie die Konfiguration der virtuellen Host ein. Starten oder laden Nginx neu. Testen Sie die Konfiguration und sehen Sie sich die Website an. Aktivieren Sie selektiv SSL und konfigurieren Sie SSL -Zertifikate. Stellen Sie die Firewall selektiv fest, damit Port 80 und 443 Verkehr.

So starten Sie den Nginx -Server So starten Sie den Nginx -Server Apr 14, 2025 pm 12:27 PM

Das Starten eines Nginx-Servers erfordert unterschiedliche Schritte gemäß verschiedenen Betriebssystemen: Linux/UNIX-System: Installieren Sie das NGINX-Paket (z. B. mit APT-Get oder Yum). Verwenden Sie SystemCTL, um einen Nginx -Dienst zu starten (z. B. sudo systemctl start nginx). Windows -System: Laden Sie Windows -Binärdateien herunter und installieren Sie sie. Starten Sie Nginx mit der ausführbaren Datei nginx.exe (z. B. nginx.exe -c conf \ nginx.conf). Unabhängig davon, welches Betriebssystem Sie verwenden, können Sie auf die Server -IP zugreifen

So erstellen Sie Container für Docker So erstellen Sie Container für Docker Apr 15, 2025 pm 12:18 PM

Erstellen Sie einen Container in Docker: 1. Ziehen Sie das Bild: Docker Pull [Spiegelname] 2. Erstellen Sie einen Container: Docker Ausführen [Optionen] [Spiegelname] [Befehl] 3. Starten Sie den Container: Docker Start [Containername]

So starten Sie einen Container von Docker So starten Sie einen Container von Docker Apr 15, 2025 pm 12:27 PM

Startschritte des Docker -Containers: Ziehen Sie das Containerbild: Führen Sie "Docker Pull [Mirror Name]" aus. Erstellen eines Containers: Verwenden Sie "Docker erstellen [Optionen] [Spiegelname] [Befehle und Parameter]". Starten Sie den Container: Führen Sie "Docker Start [Container Name oder ID]" aus. Containerstatus überprüfen: Stellen Sie sicher, dass der Container mit "Docker PS" ausgeführt wird.

See all articles