¿La ejecución del servidor Redis varias veces vincula varios sockets de escucha en el mismo puerto?

¿La ejecución del servidor Redis varias veces vincula varios sockets de escucha en el mismo puerto?

En Windows Server 2019, bajo WSL ejecuté por error redis-serveruna segunda vez y no informó una falla al vincular el socket de escucha. Aquí está el resultado de 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

Dos preguntas:

  1. ¿Cómo es eso posible?
  2. ¿Cómo puedo seleccionar a qué instancia conectarme redis-cli?

Gracias.

EDITAR

Lo ejecuté por tercera vez solo para comprobarlo y aquí está el netstatresultado:

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

Estas son las entradas de proceso del administrador de tareas: ingrese la descripción de la imagen aquí

Respuesta1

Si el enchufe tiene elSO_REUSEADDRestablecido, entonces múltiples procesos podrán vincularse a un puerto determinado.

"Usando SO_REUSEADDRySO_EXCLUSIVEADDRUSE"

UsandoSO_REUSEADDR

La SO_REUSEADDRopción socket permite que un socket se vincule por la fuerza a un puerto utilizado por otro socket. El segundo socket llama a setsockopt con el parámetro optname establecido en SO_REUSEADDRy el parámetro optval establecido en un valor booleano TRUE antes de llamar a bind en el mismo puerto que el socket original.

Esto tiene como objetivo permitir que los servicios compartan la carga entre una serie de procesos independientes, y solo debe usarse si el servicio es capaz de manejar esto correctamente... Redis bien puede estar entre los servicios que admiten esto (y lo habilitan de forma predeterminada). ).

Vernet.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;
}

Si necesita determinar a qué servidor se ha conectado, puede usar el comando RedisINFO server, y busca el process_idcampo.

Alternativamente, puede usarlo netstat -anoen Windows ( netstat -tnpen Linux) para determinar el PID del servidor para un puerto de cliente determinado (aunque no el PID del cliente).

No creo que exista un método simple a nivel de sistema operativo para determinar esta relación.


Si tiene varias instancias de servidor que utilizan diferentes configuraciones y/o datos para cada una, entonces tiene un error de configuración quedebería rectificar, es decir, no ejecutar varios servicios a la vez ni utilizar un puerto diferente para cada uno.

Esto no es algo de lo que Redis sea responsable, al igual que elegir el puerto de escucha no es algo de lo que Redis sea responsable.

información relacionada