aof_loading
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을 로드한다.
-
참고로 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() 내부 흐름을 설명한다.
- fopen(aof_filename); AOF 파일 오픈
- 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); AOF 클라이언트를 제거한다.
- 몇 가지 변수 등을 설정해서 로딩이 완료되었음을 표시한다.
server.loading = 0;
aofUpdateCurrentSize();
server.aof_rewrite_base_size = server.aof_current_size;
AOF Disk I/O Error 실무(교훈)
redis.conf 'data-dir'은 "redisGate Enterprise Edition"에 추가된 것입니다.
'data-dir'을 제외하면 Redis CE(Community Edition)도 비슷하게 적용할 수 있습니다.
-MISCONF Errors writing to the AOF file
redis.log에 위 제목(또는 아래 로그)과 같은 로그가 있으면
"-MISCONF Errors writing to the AOF file: %s"
strerror(server.aof_last_write_errno) -> "Structure needs cleaning"
"after processing the command 'set' from"
로그 발생 소스 위치: server.c processCommand()
✅ 위 에러가 발생하면(LOG:redis.log) AOF 파일이 제대로 쓰여지지 않은 것이다.
이것은 redis-check-aof --fix 를 실행해도 고쳐지지 않을 수도 있다.
즉시, 다음 2가지 중 하나를 선택해서 실행한다.
- 1. redis.conf 'data-dir'의 디스크 I/O가 제대로 되도록 서버/스토리지 팀에 요청한다.
이 경우 AOF를 즉시 off 한다: > config set appendonly no.
디스크 문제가 해결되면 AOF를 on 한다: > config set appendonly yes -> 이 경우 AOF rewrite 가 먼저 실행된다.
- 2. 'data-dir'을 다른 곳으로 지정한다.
① 레디스 서버를 중지(stop.sh)한다.
② redis.conf 에서 'data-dir'를 변경한다.
③ 레디스 서버를 시작(start.sh)한다.
Bad file format reading the append only file
레디스 서버 시작 후 AOF Loading 중 에러 발생
로그 발생 소스 위치: aof.c loadAppendOnlyFile()
fmterr:
serverLog(LL_WARNING,"Bad file format reading the append only file: make a backup of your AOF file,
then use ./redis-check-aof --fix <filename>");
exit(1);
위 에러가 발생하면 AOF 로딩이 중단되고 서버도 중단된다.
조치 방법: redis-check-aof --fix 실행
$ redis-check-aof --fix appendonly.aof -> 실행
🚫 실행 후 아무키도 치지말고 기다려야 한다.
관련 소스: redis-check-aof.c redis_check_aof_main()
'redis-check-aof'는 printf()로 화면에 바로 보여준다.
off_t pos = process(fp) -> AOF 파일 format 확인
printf("AOF analyzed: size=%lld, ok_up_to=%lld, ok_up_to_line=%lld, diff=%lld\n",...) -> 관련 메시지
printf("This will shrink the AOF from %lld bytes, with %lld bytes, to %lld bytes\n",...) -> 관련 메시지
printf("Continue? [y/N]:") 여기서 'y'를 해야한다. 실수로 이전에 먼저 [Enter]를 쳤으면 'N'이 실행된다.
• 'N' 인 경우: "Aborting..." -> exit(1) -> truncate 하지 않고 종료.
• 'y' 인 경우: ftruncate(fileno(fp), pos) -> truncate 실행
truncate 성공 메시지 -> "Successfully truncated AOF"
truncate 실패 메시지 -> "Failed to truncate AOF"
✅ 여기서 'y'를 했으면 aof 파일을 truncate(수정) 했고 다음 LOAD가 제대로 될 수도 있다.
관련 용어
- 디스크 공유 볼륨/클러스터 공유 볼륨(CSV)
- MCCS: MenTech Solution
- VCS 이중화: Veritas Cluster Server는 Symantec사의 HA(high-availability) 솔루션.
<< AOF Rewrite | AOF Loading | AOF fsync is taking too long >> |
---|