AOF Loading

Redis Server Course Redis Technical Support Redis Enterprise Server

AOF Loading

Start AOF Loading

AOF Loading은 main()에서 시작한다.   Sentinel 모드이면 AOF나 RDB 로딩을 하지 않는다.   Sentinel 모드가 아니면, loadDataFromDisk()를 실행한다.
loadDataFromDisk()에서 AOF가 ON이면 loadAppendOnlyFile()를 실행해서 AppendOnlyFile을 DB로 로드한다.   AOF가 OFF이면 rdbLoad()를 수행해서 RDB File을 로드한다.

aof loading
    그림 1-1   aof loading
    참고로 main()에서는 AOF를 로드하기 전에 다음과 같은 일을 한다.   주요한 것만 간추려 보았다.
  • initServerConfig(): server struct에 기본 값을 할당한다.
  • loadServerConfig(): redis.conf 파일을 읽어서 값을 할당한다.
  • initServer(): 다음과 같이 서버에 필요한 data structure를 생성하고, 이벤트루프를 생성하고, DB를 생성(메모리 할당)하고, 변수에 값을 할당한다.
    • server.clients = listCreate();   클라이언트를 저장하기 위한 리스트 생성
    • server.slaves = listCreate();   슬레이브를 저장하기 위한 리스트 생성
    • createSharedObjects();   클라이언트에 보내는 공통 메시지 등을 생성
    • server.el = aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);   서버 이벤트루프 생성
    • server.db = zmalloc(sizeof(redisDb)*server.dbnum);   redisDB 구조체를 DB 개수만큼 메모리를 할당한다.
    • server.db[j].dict = dictCreate(&dbDictType,NULL);   DB 개수만큼 dictionary(Hash table)를 생성
    • server.aof_child_pid = -1;   기본값 저장, AOF 자식 프로세스가 시작하면 프로세스 ID를 저장한다.
    • server.rdb_child_pid = -1; 기본값 저장, RDB 자식 프로세스가 시작하면 프로세스 ID를 저장한다.
    • server.dirty = 0;   쓰기 명령 수행으로 데이터가 변경되면 증가시키고, fsync()로 디스크에 저장하면 다시 0으로 만든다.   AOF Commands에 관련 내용이 있으니 참고하세요.
  • 그 다음 센티널 모드가 아닌지를 확인해서 loadDataFromDisk()를 실행한다.

AOF Loading flow

여기서는 loadAppendOnlyFile() 내부 흐름을 설명한다.

aof loading_flow
    그림 1-1   aof loading flow
  • fopen(aof_filename); AOF 파일 오픈
  • 모조 클라이언트(fakeClient)를 만든다.   AOF file에서 읽어들이는 것도 클라이언트에서 실행하는 것과 같은 방식으로 처리한다.
  • 몇 가지 변수 등을 설정해서 로딩 시작을 표시한다.
    server.loading = 1;
    server.loading_start_time = time();
  • 버전 4.0 부터 rdb preamble이 추가되어 AOF 파일에 rdb가 포함되어 있으면 rdb 파일을 읽는다.
  • 이제 while loop를 돌면서 AOF file을 읽어서, 일반 클라이언트에서 받은 것처럼 argc, argv를 만들어 명령을 실행(데이터 저장)한다.
    cmd->proc(fakeClient);
  • fclose(fp); AOF 파일 닫기
  • freeFakeClient(fakeClient); 모조 클라이언트를 제거한다.
  • 몇 가지 변수 등을 설정해서 로딩이 완료되었음을 표시한다.
    server.loading = 0;
    aofUpdateCurrentSize();
    server.aof_rewrite_base_size = server.aof_current_size;

마치며

AOF Loading은 AOF Internal이나 Rewrite에 비해서 간단해서 이해하기 어렵지 않다.

여기까지 읽어 주셔서 고맙습니다.


<< AOF Rewrite AOF Loading AOF fsync is taking too long >>

조회수 :

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