Bindet ein mehrfach ausgeführter Redis-Server mehrere Abhör-Sockets an denselben Port?

Bindet ein mehrfach ausgeführter Redis-Server mehrere Abhör-Sockets an denselben Port?

Unter Windows Server 2019 habe ich es unter WSL aus Versehen redis-serverein zweites Mal ausgeführt und es wurde kein Fehler beim Binden des Listening-Sockets gemeldet. Hier ist die Ausgabe von netstat:

C:\Users\Administrator>netstat -ano | grep 6379 | grep LISTEN
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       11080
  TCP    127.0.0.1:6379         0.0.0.0:0              LISTENING       13292
  TCP    [::]:6379              [::]:0                 LISTENING       11080
  TCP    [::1]:6379             [::]:0                 LISTENING       13292

Zwei Fragen:

  1. Wie ist das überhaupt möglich?
  2. Wie kann ich auswählen, mit welcher Instanz eine Verbindung hergestellt werden soll redis-cli?

Danke.

BEARBEITEN

Ich habe es zur Kontrolle ein drittes Mal ausgeführt und hier ist die netstatAusgabe:

C:\Users\Administrator>netstat -ano | grep 6379 | grep LISTEN
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       13916
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       11080
  TCP    127.0.0.1:6379         0.0.0.0:0              LISTENING       13292
  TCP    [::]:6379              [::]:0                 LISTENING       11080
  TCP    [::]:6379              [::]:0                 LISTENING       13916
  TCP    [::1]:6379             [::]:0                 LISTENING       13292

Dies sind die Prozesseinträge aus dem Taskmanager: Bildbeschreibung hier eingeben

Antwort1

Wenn die Buchse dieSO_REUSEADDRFlag gesetzt ist, können mehrere Prozesse an einen bestimmten Port gebunden werden.

"Verwenden SO_REUSEADDRundSO_EXCLUSIVEADDRUSE"

Verwenden vonSO_REUSEADDR

Mit der SO_REUSEADDRSocket-Option kann ein Socket zwangsweise an einen Port gebunden werden, der von einem anderen Socket verwendet wird. Der zweite Socket ruft setsockopt mit dem Parameter optname SO_REUSEADDRund dem Parameter optval auf den booleschen Wert TRUE auf, bevor er bind auf demselben Port wie der ursprüngliche Socket aufruft.

Dies soll es Diensten ermöglichen, die Last auf mehrere unabhängige Prozesse aufzuteilen, und sollte nur verwendet werden, wenn der Dienst dies korrekt handhaben kann … Redis gehört möglicherweise zu den Diensten, die dies unterstützen (und standardmäßig aktivieren).

Sehennet.c:

static int redisSetReuseAddr(redisContext *c) {
    int on = 1;
    if (setsockopt(c->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
        __redisSetErrorFromErrno(c,REDIS_ERR_IO,NULL);
        redisNetClose(c);
        return REDIS_ERR;
    }
    return REDIS_OK;
}

static int redisCreateSocket(redisContext *c, int type) {
    redisFD s;
    if ((s = socket(type, SOCK_STREAM, 0)) == REDIS_INVALID_FD) {
        __redisSetErrorFromErrno(c,REDIS_ERR_IO,NULL);
        return REDIS_ERR;
    }
    c->fd = s;
    if (type == AF_INET) {
        if (redisSetReuseAddr(c) == REDIS_ERR) {
            return REDIS_ERR;
        }
    }
    return REDIS_OK;
}

Wenn Sie herausfinden möchten, mit welchem ​​Server Sie verbunden sind, können Sie den Redis-Befehl verwenden.INFO server, und suchen Sie nach dem process_idFeld.

Alternativ können Sie netstat -anounter Windows ( netstat -tnpunter Linux) verwenden, um die PID des Servers für einen bestimmten Client-Port zu bestimmen (allerdings nicht die Client-PID).

Ich glaube nicht, dass es eine einfache Methode auf Betriebssystemebene gibt, um diese Beziehung zu bestimmen.


Wenn Sie mehrere Serverinstanzen mit unterschiedlicher Konfiguration und/oder Daten haben, liegt ein Konfigurationsfehler vor, derDusollte behoben werden – d. h.: Führen Sie nicht mehrere Dienste gleichzeitig aus oder verwenden Sie für jeden einen anderen Port.

Dies liegt nicht in der Verantwortung von Redis, ebenso wie die Auswahl des Abhörports nicht in den Zuständigkeitsbereich von Redis fällt.

verwandte Informationen