Redis SENTINEL PENDING-SCRIPTS

Redis Sentinel Course Redis Technical Support Redis Enterprise Server

Redis SENTINEL PENDING-SCRIPTS

센티널은 경고(warning) 이벤트가 발생하면 notification_script에 지정된 파일을 실행해서 관리자에게 알린다.   발생한 이벤트를 스크립트 잡 큐(Script job queue)에 넣고 실행하는데, 실행 시간이 좀 걸린다면 현재 실행중이거나 대기 중인 스크립트가 남아있다.   이 명령은 현재 실행중이거나 대기 중인 스크립트와 이벤트 정보를 보여준다.

사용법

명령: SENTINEL PENDING-SCRIPTS
일반적으로 스크립트는 매우 빠르게 실행되기 때문에 조회가 되지 않는 경우가 대부분이다.   여기서는 데스트 목적으로 쉘 스크립트 안에 5초 대기(sleep 5)를 넣고 실행한 것이다.
명령 실행 예)

127.0.0.1:7111> sentinel pending-scripts
1) 1) "argv"
   2) 1) "/root/redis-3.2.2/notify/redis-notify.sh"
      2) "+promoted-slave"
      3) "slave 127.0.0.1:7121 127.0.0.1 7121 @ Xmaster 127.0.0.1 7124"
  3) "flags"
  4) "running"
  5) "pid"
  6) "23783"
  7) "run-time"
  8) "4189"
  9) "retry-num"
 10) "1"
2) 1) "argv"
   2) 1) "/root/redis-3.2.2/notify/redis-notify.sh"
      2) "+failover-state-reconf-slaves"
      3) "master Xmaster 127.0.0.1 7124"
  3) "flags"
  4) "running"
  5) "pid"
  6) "23784"
  7) "run-time"
  8) "4189"
  9) "retry-num"
 10) "1"

현재 실행중이거나 대기 중인 스크립트는 info sentinel 명령으로 개수를 확인할 수 있다.   sentinel_running_scripts는 현재 실행중인 스크립트 수이고, sentinel_scripts_queue_length는 큐에 남아있는 스크립트 수이다.

127.0.0.1:7111> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:2
sentinel_scripts_queue_length:2
sentinel_simulate_failure_flags:0
master0:name=Xmaster,status=ok,address=127.0.0.1:7124,slaves=4,sentinels=5,quorum=3

센티널은 큐에 있는 스크립트를 비동기로 실행한다.   그러므로 스크립트 실행후 끝나기를 기다리지 않고 바로 다음 스크립트를 실행한다.   스크립트 실행은 자식 프로세스(child process)을 fork하고 그 자식 프로세스가 execve()로 스크립트를 실행한다.   execve()는 다른 프로그램을 실행하고 자신은 종료하는 함수이다.   일반적인 상황에서는 큐(sentinel_scripts_queue_length) 개수와 실행중인(sentinel_running_scripts) 개수가 같다.

센티널이 스크립트를 비동기로 실행하기는 하지만 동시에 16개까지만 실행할 수 있다.   스크립트 1개의 최대 실행 시간은 60초이다.   시간초과가 발생하면 "-script-timeout" 이벤트가 발생하고 스크립트를 종료(kill) 시킨다.   만약 자식 프로세스 fork 할때 실패하면 "-script-error" 이벤트를 발생하고 로그에 남긴다.   성공하지 못한 스크립트는 10번까지 재 시도하는데, 공백 시간을 둔 다음 재 시도한다.   공백 시간은 처음 실패하면 30초 후에 재 시도하고,   두 번째 실행하면 60초, 세 번째는 2분, 4분, 8분, 16분, 32분, 64분, 마지막에 열 번째는 128분 후에 시도한다.   열번째까지 실패하면 더 이상 시도하지 않는다.

여기 언급한 숫자(동시 실행 16, 스크립트 최대 실행 시간 60초, 재 시도 횟수 10번, 공백 시간)는 모두 소스에 정의되어 있어 파라미터나 SET 명령으로 변경할 수 없다.

항목

조회되는 항목

  • argv 1 : script file
  • argv 2 : 이벤트 타입
  • argv 3 : 이벤트 내용
  • flags : 스크립트가 실행중일 경우는 "running", 대기 중일 경우는 "scheduled"로 표시된다.   실행중일 경우 "ps -ef|grep redis" 명령으로 해당 프로세스 ID를 볼 수 있다.
  • pid : 23784, 실행중일 경우 자식 프로세스 ID가 표시된다. 대기 중일 경우는 "0"이다.
  • run-time : 4189, 실행중일 경우 "run-time"이 표시되고, 대기 중일 경우 "run-delay"가 표시된다.   run-time은 실행 시작 부터 현재까지 시간이다.   이 시간이 60초가 넘으면 시간초과가 되어 센티널은 자식 프로세스를 종료시킨다.
    시간초과가 된 스크립트는 flags가 "scheduled"로 바뀐다.   재 시도할 경우 공백시간을 더해서 다음 시작 시각(start_time) 세팅한다.   공백시간은 위에서 설명한 것처럼 30초, 60초, 이런 식으로 2배씩 늘어난다.   "run-delay" 시간은 start_time에서 현재 시각을 뺀 시간이다.   "run-delay"가 0이 되면 센티널은 시크립트를 실행시킨다.
  • retry-num : 1, 재 시도 횟수를 나타낸다.

명령문

SENTINEL PENDING-SCRIPTS

  • 이 명령은 version 2.8.0 부터 사용할 수 있다.
  • 이 문서는 버전 3.2.2을 기준으로 만들었다.

Clients for Java Jedis, Lettuce
Clients for C Hiredis

<< INFO-CACHE PENDING-SCRIPTS DOWN-AFTER-MILLISECONDS >>

조회수 :

Email 답글이 올라오면 이메일로 알려드리겠습니다.