Windows Server 2019의 WSL에서 실수로 redis-server
두 번째 실행했는데 수신 소켓 바인딩 실패가 보고되지 않았습니다. 출력은 다음과 같습니다 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
두 가지 질문:
- 그게 어떻게 가능합니까?
- 를 사용하여 연결할 인스턴스를 어떻게 선택할 수 있습니까
redis-cli
?
감사해요.
편집하다
확인하기 위해 세 번째 실행했는데 netstat
결과는 다음과 같습니다.
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
답변1
소켓에SO_REUSEADDR플래그가 설정되면 여러 프로세스가 특정 포트에 바인딩될 수 있습니다.
"사용 SO_REUSEADDR
및SO_EXCLUSIVEADDRUSE
"
사용
SO_REUSEADDR
소켓
SO_REUSEADDR
옵션을 사용하면 소켓이 다른 소켓에서 사용 중인 포트에 강제로 바인딩될 수 있습니다. 두 번째 소켓은SO_REUSEADDR
원래 소켓과 동일한 포트에서 바인드를 호출하기 전에 optname 매개변수를 로 설정하고 optval 매개변수를 부울 값 TRUE로 설정하여 setockopt를 호출합니다 .
이는 서비스가 여러 독립 프로세스 간에 로드를 공유할 수 있도록 하기 위한 것이며 서비스가 이를 올바르게 처리할 수 있는 경우에만 사용해야 합니다. Redis는 이를 지원하는 서비스 중 하나일 수 있습니다(기본적으로 활성화합니다). ).
보다net.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;
}
연결된 서버를 확인해야 하는 경우 Redis 명령을 사용할 수 있습니다.INFO server
을 클릭하고 process_id
필드를 찾으세요.
또는 netstat -ano
Windows( netstat -tnp
Linux)에서 사용하여 특정 클라이언트 포트(클라이언트 PID는 아님)에 대한 서버의 PID를 확인할 수 있습니다.
나는 이 관계를 결정하는 간단한 OS 수준 방법이 있다고 믿지 않습니다.
서로 다른 구성 및/또는 데이터를 사용하는 여러 서버 인스턴스가 있는 경우 다음과 같은 구성 오류가 발생합니다.너수정해야 합니다. 즉, 여러 서비스를 동시에 실행하지 않거나 각각에 대해 다른 포트를 사용하지 마십시오.
수신 포트 선택이 Redis의 책임이 아닌 것처럼 이는 Redis의 책임도 아닙니다.