본문 바로가기

좋아하는 것_매직IT/9.redis

33.Redis, 레디스의 스냅샷에 대해서 알아보자구요! ^^

반응형

Redis 스냅샷 이란?

  • 데이터의 영구 저장을 위하여 메모리에 저장된 모든 데이터를 디스크로 저장하는 기능이 있는데 이를 스냅샷이라고 함.
    • 그럼, 스냅샷이라 불리우는 이유는 몰까요?
      • 특정 시점의 메모리를 사진을 찍듯이 그대로 디스크에 저장하기 때문이라고 하네요.
      • 간단하게 말해서, 특정 시점의 Redis 백업기능이라고 보면 됨.
    • 스냅샷 결과
      • dump.rdb  파일 생성.
      • 위의 파일을 통해서 해당 시점의 데이터로 Redis 를 복원할 수 있게됨.

그럼, Redis 스냅샷의 동작은 내부적으로 어떻게 진행될까요?

  • 리눅스의 fork() 함수에 의해서 동작 한다고 하네요.
    • fork() 함수는 보통 자식 프로세스를 생성하는 함수이죠..멀티프로세스 기반의 프로그래밍을 할때 사용됨.
      • 제경험을 잠깐 풀자면, 예전 SKT BP 회사에 재직 할 때, SKT WAPGW 프로그램을 담당했었었는데요.. 그때 WAPGW 서비스를 하는 프로세스 구조가 멀티프로세스/멀티스레드 구조 였습니다. 
        • 그때, 멀티프로세스를 생성하기 위해서 fork() 를 호출했었어요..^^!
      • 지금 담당하고 있는 네이트온 데몬 프로세스도 fork() 를 사용해서 멀티프로세스로 기동하는 것이 있긴합니다. 
    • 암튼 결론적으로 말씀드리고 싶은것은,  C/C++ 개발을 본업(?)으로 하는 제게는 친숙하고 반가운 함수입니다. ^^
  • 다시 레디스로 넘어 올께요 ㅋ
    • 하나, 스냅샷이 시작되면, 리눅스 시스템 함수인 fork() 함수롤 호출하여 자식 프로세스를 생성함.
    • 둘, 생성된 자식 프로세스가 메모리의 내용을 디스크로 저장함.
      • 물론, 스냅샷이 동작하여 데이터가 디스크로 저장되는 동안에도 Redis 는 정상적으로 클라이언트의 데이터 처리 명령을 수행한다고 하네요.
      • but, Redis 스냅샷이 동작하는 동안에는 클라이언트의 응답시간이 증가할 수 도 있다고함.
  •  Redis 스냅샷 파일인 dump.rdb 파일은 Redis 버전업이 될때마다, 구조가 계속 바뀌어 왔다고 합니다.

스냅샷의 메모리는?

  • 리눅스의 fork() 함수를 사용하면 메모리가 2배가 필요할까요?
    • 반은 맞고 반은 틀리다고 하네요.
    • 이부분은 잠깐 기존에 언급 했었던 COW(Copy On Write)를 살펴봐야 될것 같습니다.
      • COW 란 ?
        • 동일한 메모리의 영역을 공유하는 2개의 프로세스 중에서 어느 하나가 메모리의 특정 영역을 변경하면 변경된 내용만을 다른 메모리 영역에 복사하는 것을 말합니다.
      • 잠깐 그림을 통해 설명해 볼께요.
      • 하나, fork 함수 수행 직후의 메모리 상태
          • 별도의 프로세스가 동일한 메모리 공간을 공유하고 있네요..
        • 그럼 이상태에서 부모 프로세스에 의하여 데이터가 변경되면 어떻게 될까요?
          • 둘, 부모 프로세스가 메모리를 변경한 상태
            • 부모프로세스는 Redis 클라이언트로부터 수신된 레디스 명령을 처리하기 때문에 메모리 데이터가 변경됨.
            • 즉, 리눅스 시스템은 메모리를 페이지 단위로 관리하기 때문에 변경된 메모리 페이지를 복사하여 부모 프로세스가 가지게 되며, 자식 프로세스는 변경된 내용을 알지 못하게됨.
            • 즉, 변경 이전의 메모리 영역을 참조하게됨을 의미함.
            • 대부분의 시스템에서 메모리 페이지 크기는 4KB로 구성됨.
            • fork 동작중인 시점에서 사용되는 메모리 계산
              • 전체 메모리 = 자식프로세스메모리 + 부모프로세스가 변경한 페이지 개수 * 4KB
            • fork 함수가 호출되어 자식 프로세스가 종료되기 전에 모든 페이지가 변경된다면, 레디스는 메모리를 최대 2배 만큼 사용하게 됨.
              • 해당 상황은 쓰기 연산이 매우 많은 시스템에서 발생가능함.
              • 그러므로, 스냅샷을 사용할 때는 자신의 서비스가 쓰기 위주의 서비스인지 반드시 먼저 확인하여 메모리 사용 정책을 정의하자.

결론

  • Redis 스냅샷은 데이터의 영구 저장을 위하여 메모리에 저장된 모든 데이터를 디스크로 저장하는 기능임.
  • COW(Copy On Write)는 동일한 메모리의 영역을 공유하는 2개의 프로세스 중에서 어느 하나가 메모리의 특정 영역을 변경하면 변경된 내용만을 다른 메모리 영역에 복사하는 것을 말함.
  • 오늘도 Redis 관련 스냅샷 기능에 대해서 마술(?) 한가지 획득완료! 감사합니다. ^^

  • 오늘의 명언 한마디
    • 괴테가 말했다, "우리의 소망이란 우리안에 잠재하는 여러가지 능력에 대한 예감이다. 그것은 우리가 앞으로 할 수 있을 것들에 대한 전조이다." -카렌 크리스티네 앙어마이어지음, "펜으로 유혹하라" 중에서..

  • 오늘의 영어 한마디
    • 질문) Hey, I'd like to get involved in that.
      • 야, 이거 흥미 있는데
    • 응답) I think it's worth pursuing.
      • 하는 보람이 있을 것 같아.
    • 해설
      • "get involved in" 은 ~에 열중하다. 라는 의미
        • 단순히 흥미 있다기보다는 진지하게 "몰두하고 싶다." 라고 할 때 쓰이는 표현.
      • "worth pursuing" 은 헤볼 만한(수행할) 가치가 있다라는 의미임.
728x90
300x250