En Windows Server 2019, bajo WSL ejecuté por error redis-server
una 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:
- ¿Cómo es eso posible?
- ¿Cómo puedo seleccionar a qué instancia conectarme
redis-cli
?
Gracias.
EDITAR
Lo ejecuté por tercera vez solo para comprobarlo y aquí está el netstat
resultado:
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:
Respuesta1
Si el enchufe tiene elSO_REUSEADDRestablecido, entonces múltiples procesos podrán vincularse a un puerto determinado.
"Usando SO_REUSEADDR
ySO_EXCLUSIVEADDRUSE
"
Usando
SO_REUSEADDR
La
SO_REUSEADDR
opció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 enSO_REUSEADDR
y 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_id
campo.
Alternativamente, puede usarlo netstat -ano
en Windows ( netstat -tnp
en 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 quetúdeberí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.