Redis 는 클라이언트 연결을 어떻게 처리합니까
참고: 이 문서에 설명된 내용은 Redis2.6 이상을 기반으로 합니다.
연결 설정
Redis 는 TCP 포트 또는 UNIX 소켓을 수신하여 클라이언트로부터 연결을 수신합니다. 연결이 설정되면 Redis 내에서 다음과 같은 작업을 수행합니다.
먼저 클라이언트 소켓은 redid 때문에 비차단 모드로 설정됩니다
그런 다음 이 소켓에 대한 TCP_NODELAY 속성을 설정하고 Nagle 알고리즘
을 비활성화한 다음 이 클라이언트 소켓에서 데이터 전송을 수신하는 readable 파일 이벤트를 만듭니다.
클라이언트 연결이 초기화되면 Redis 는 현재 연결 수를 보고 비교합니다 현재 연결 수가 최대 연결 수 maxclients 에 도달한 경우 이 연결을 더 이상 수신할 수 없습니다. Redis 는 클라이언트에 연결 오류를 직접 반환하고 즉시 연결을 닫습니다.
서버측 처리 순서
Redis 에 연결된 클라이언트가 여러 개 있고 모두 Redis 에 명령을 보내는 경우 Redis 서버는 먼저 어떤 클라이언트의 요청을 처리합니까? 대답은 확실하지 않습니다. 주로 두 가지 요인에 관한 것입니다. 하나는 클라이언트에 해당하는 소켓의 숫자 크기이고, 다른 하나는 kernal 이 각 클라이언트 이벤트의 우선순위를 보고하는 것입니다.
Redis 는 클라이언트에서 들어오는 데이터를 처리하는 단계는 다음과 같습니다.
이벤트를 트리거하는 소켓에서 read () 를 한 번 호출하고, 이 소켓의 메시지를 다 읽을 때까지 한 번 (이 소켓에서 메시지를 다 읽을 때까지) 한 번 읽지는 않습니다 < P > 물론 이 read () 호출이 완료되면 포함된 명령 수에 관계없이 한 번에 순차적으로 실행됩니다. 이렇게 하면 각 클라이언트 명령에 대한 공정한 대우가 보장됩니다.
최대 접속 정보 maxclients
Redis2.4 에서는 최대 접속 수가 코드에 직접 하드 코딩되어 있으며 버전 2.6 에서는 구성 가능합니다. Maxclients 의 기본값은 1 입니다. redis.conf 에서 이 값을 수정할 수도 있습니다. < P > 물론 이 값은 Redis 가 원하는 값일 뿐이며 Redis 는 시스템 자체에서 프로세스에서 사용하는 파일 설명자 수에 대한 제한을 고려합니다. 시작 시 Redis 는 시스템의 soft limit 를 검사하여 최대 열린 파일 설명자 수를 확인합니다. 시스템 설정 숫자가 원하는 최대 연결 수에 32 를 더한 값보다 작으면 maxclients 설정이 작동하지 않고 Redis 가 시스템 요구 사항에 따라 이 값을 설정합니다. (더하기 32 는 Redis 내에서 최대 32 개의 파일 설명자를 사용하기 때문에 연결에 사용할 수 있는 모든 설명자에서 32 를 뺀 것과 같습니다.)
위에서 설명한 상황이 발생하면 (maxclients 설정 후 작동하지 않는 경우) Redis 시작 중 해당 로깅이 발생합니다. 예를 들어, 다음 명령은 최대 클라이언트 수를 1 으로 설정하려고 합니다. 따라서 Redis 에는 1+32 개의 파일 설명자가 필요하고 시스템의 최대 파일 설명자는 1144 로 설정되므로 Redis 는 maxclients 를 1144 로만 설정할 수 있습니다. 32 = 1112 입니다.
$./redis-server-maxclients 1
[41422] 23 Jan 11: 28: 33.179 # unable to set the Setting the maxclients configuration to 1112.
따라서 maxclients 값을 설정하려면 시스템 설정을 수정하는 것이 좋습니다. 물론 로그를 보는 좋은 습관을 길러도 이 문제를 발견할 수 있습니다. < P > 구체적인 설정 방법은 개인의 요구에 따라 달라집니다. 이번 세션의 제한만 수정하거나 sysctl 을 통해 시스템의 기본 설정을 직접 수정할 수 있습니다. 예:
ulimit-sn 1 # this will only work if hard limit is big enough.
sysctl-w fs.file-max = 또한 실행 명령이 너무 많아 클라이언트에 전송되는 것보다 더 많은 반환 데이터 속도가 생성될 수 있으며, 이로 인해 메시지 스택이 발생하여 출력 버퍼가 커지고 메모리가 너무 많이 사용되거나 시스템 충돌이 발생할 수 있습니다.
그래서 Redis 는 두 가지 방법으로 다양한 종류의 클라이언트에서 작동하는 보호 메커니즘을 설정했습니다.
는 한 클라이언트의 버퍼가 특정 크기를 초과할 때 클라이언트 연결을 직접 끄는 크기 제한입니다.
다른 하나는 클라이언트 연결 직접 끄기 < P > 다른 클라이언트에 대한 정책은 다음과 같습니다. < P > 일반 클라이언트의 경우 제한이 , 즉 제한이 없습니다. 일반 클라이언트는 일반적으로 요청 전송, 반환 대기, 요청 재발송, 반환 대기 등의 차단 메시지 응답 모드를 사용하기 때문입니다. 이 모드는 일반적으로 출력 버퍼의 누적 팽창을 일으키지 않습니다.
Pub/Sub 클라이언트의 경우 크기 제한은 32m 이며 출력 버퍼가 32m 를 초과하면 연결이 닫힙니다. 지속성 제한 사항은 클라이언트 버퍼 크기가 6 초 이상 8m 를 초과하면 연결이 끊길 수 있다는 것입니다.
Slave 클라이언트의 경우 크기 제한은 256m 이고 지속 시간 제한은 클라이언트 버퍼 크기가 6 초 이상 64m 를 초과할 때 연결을 닫는 것입니다.
위의 세 가지 규칙은 모두 구성 가능합니다. CONFIG SET 명령을 사용하거나 redis.conf 파일을 수정하여 구성할 수 있습니다.
입력 버퍼 크기 제한
Redis 는 입력 버퍼 크기 제한에 대해 비교적 폭력적이며 클라이언트가 1G 이상의 요청 크기를 전송할 때 서버가 직접 연결을 종료합니다. 이 방법을 사용하면 일부 클라이언트나 서버측 버그로 인한 입력 버퍼가 너무 큰 문제를 효과적으로 방지할 수 있습니다.
Client 시간 초과
현재 Redis 버전의 경우 서버측은 기본적으로 장기 유휴 클라이언트를 종료하지 않습니다. 그러나 기본 구성을 수정하여 원하는 시간 초과 시간을 설정할 수 있습니다. 예를 들어, 클라이언트가 상호 작용이 없는 기간이 지나면 바로 종료됩니다. 마찬가지로 CONFIG SET 명령을 사용하거나 redis.conf 파일을 수정하여 이 기능을 구성할 수 있습니다. < P > 시간 초과 설정은 일반 클라이언트에서만 작동하며 Pub/Sub 클라이언트에서는 장기 유휴 상태가 정상입니다. < P > 또한 Redis 는 타이머 또는 라운드 트립 방법을 사용하여 클라이언트 시간 초과를 감지하는 대신 점진적으로 진행되어 매번 일부를 검사하므로 실제 시간 초과 시간이 설정만큼 정확하지 않을 수 있습니다. 그 결과, 시간 초과를 1s 로 설정했을 수도 있지만, 실제 실행 시간은 시간 초과인 12s 가 되어야 클라이언트가 종료됩니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 시간명언)
CLIENT 명령
Redis 의 CLIENT 명령은 연결 상태 확인, 연결 살해, 연결 이름 설정 등 세 가지 기능을 제공합니다.
CLIENT LIST 명령은 다음과 같이 현재 모든 클라이언트의 상태를 가져옵니다.
redis 127...1:6379> Clientlist
addr = 127...1: 52555 FD = 5 name = age = 855 idle = flags = n db = sub =; = client
addr = 127...1: 52787 FD = 6 name = age = 6 idle = 5 flags = n db = sub = PSS 명령의 출력에 따르면 현재 이 Redis 에는 두 개의 클라이언트 연결이 있으며 각 행은 하나의 연결에 대한 다양한 정보를 나타냅니다.
addr: IP 및 포트 포함 클라이언트의 TCP 주소
fd: 클라이언트 연결 소켓에 해당하는 파일 설명자 핸들 번호
name: CLIENT SETNAME 을 통해
age: 클라이언트가 유지되는 시간 (초)
idle: 클라이언트가 유휴 시간 (초)
flags: 클라이언트 유형을 설정할 수 있습니다 (n 은 일반 클라이언트를 나타내고 mands/client-ls 참조) < P > 위 명령을 통해 클라이언트 목록을 얻으면 CLIENT KILL 명령을 통해 지정된 연결을 죽일 수 있습니다. CLIENT KILL 의 매개 변수는 위의 addr 값입니다.
위에서 언급한 CLIENT SETNAME 과 CLIENT GETNAME 은 연결의 이름을 설정하는 데 사용할 수 있습니다.
참고 출처: 클라우드 호스트, 창업한 당신에게 팔아요. 자세한 내용을 보려면 여기를 클릭하십시오
warning: call _ user _ func _ array () expects parameter 1 to be a valid callback, Function' embed _ RSS footer' not found or invalid function name in/home/b55/htdocs/blog.nosqlfan.com