redis-server를 여러 번 실행하면 동일한 포트에 여러 수신 소켓이 바인딩됩니까?

redis-server를 여러 번 실행하면 동일한 포트에 여러 수신 소켓이 바인딩됩니까?

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

두 가지 질문:

  1. 그게 어떻게 가능합니까?
  2. 를 사용하여 연결할 인스턴스를 어떻게 선택할 수 있습니까 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_REUSEADDRSO_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 -anoWindows( netstat -tnpLinux)에서 사용하여 특정 클라이언트 포트(클라이언트 PID는 아님)에 대한 서버의 PID를 확인할 수 있습니다.

나는 이 관계를 결정하는 간단한 OS 수준 방법이 있다고 믿지 않습니다.


서로 다른 구성 및/또는 데이터를 사용하는 여러 서버 인스턴스가 있는 경우 다음과 같은 구성 오류가 발생합니다.수정해야 합니다. 즉, 여러 서비스를 동시에 실행하지 않거나 각각에 대해 다른 포트를 사용하지 마십시오.

수신 포트 선택이 Redis의 책임이 아닌 것처럼 이는 Redis의 책임도 아닙니다.

관련 정보