카테고리 없음

redis E북을 읽고..

혜룐 2017. 7. 27. 14:01


예전글 다시 올리기..



  • persistent Layer

    • AOF: 현재까지의 업데이트 관련 명령을 저장 ( Append Only File )
    • RDB: 현재 메모리 상태를 스냅샷으로 디스크로 저장할수있는기능으로 이렇게 덤프한 내용은 다시 메모리에 올려 사용한다.
    • 레디스 인스턴스를 이전할때 이와 같은 방법을 사용하고 있으며 아래에 자세히 기술한다.
  • replication

    • M<->S 노드에서 해당 내용을 복제할수 있는 구조
  • 컬렉션 지원
    • 분산 서버 환경에서 처리할수 있음
  • jemalloc
    • 메모리 할당자를 사용하고 있으며,  
    • 레디스 2.8버전 / mem_allocator:jemalloc-3.6.0

      • 매번 malloc and free를  통해서 메모리 할당이이뤄진다. 그래서 memory fragementaion이 발생하고, 메모리를 다시 할당하는 비용때문에 응답속도가 느려진다.
      • 멤캐시는 slab 메모리 할당자를 사용해 내부적으로 메모리 할당을 다시 하지 않는다.
  • 싱글스레드 & 메모리에 대한 내용

    • 그래서 persistent 작업이 있는 경우에는 fork를 통해 자식프로세스를 생성하기 떄문에 현재 메모리 상태가 복제되기 때문에 이를 기반으로 데이터를 저장하고 있다.( copy on write )
    • 여기에서.. 운영중인 메모리의 2배정도는 되야 persistent 작업이 가능하고, 부족한 경우 swap이 발생할수 있다. 
    • 패스의 경우, vm.overcommit =1 로 변경하고 인스턴스를 이전하기 위해 선작업으로 해주었다.
  • RDB  저장하는 명령은 2 가지. SAVE / BGSAVE
    • SAVE:모든 작업을 멈추고 현재 메모리 상태에 대한 RDB파일을 생성 그래서 해당 시간 동안에는 아무런 작업을 할수없다.
    • BGSAVE : 실제로 자식 프로세스를 생성하는 fork를 통해 저장하는 것으로 아래 내용을 보면

    • 레디스인스턴스 이전작업을 위해 운영중인 레디스를 마스터 / 복제될 레디스르 슬레이브라 칭한다.

      마스터로그는 아래와 같다.
       
      [144623] 02 Feb 05:18:03.306 * Slave 23.13.18.17:34 asks for synchronization
       
      [144623] 02 Feb 05:18:03.306 * Full resync requested by slave 23.13.18.17:34
       
      [144623] 02 Feb 05:18:03.306 * Starting BGSAVE for SYNC with target: disk
       
      [144623] 02 Feb 05:18:03.977 * Background saving started by pid 72674
        
      BGsave로 실행했으니 스레드를 볼까?
      => 부모PID로 부터 fork된것을 알수있다.
      d@a004:~$ ps -eLf | grep redis | grep 34
       
      d    71802  71396  71802  0    1 05:15 pts/0    00:00:00 tail -f /o/log/redis-34.log
       
      d    72674 144623  72674 69    1 05:18 ?        00:00:03 redis-rdb-bgsave *:34   .
       
      d   144623   1190 144623  0    3  2015 ?        06:16:12 /o/bin/redis-server *:34
       
      d   144623   1190 144630  0    3  2015 ?        00:00:00 /o/bin/redis-server *:34
       
      d   144623   1190 144631  0    3  2015 ?        00:09:35 /o/bin/redis-server *:34
  • AOF

    • 데이터를 저장하기 전에 AOF파일에 현재 수행해야할 명령을 미리저장해두고, 장애가발생했을때 AOF를 기반으로 복구하는데 활용된다.
    • 클라이언트가 레디스에 업데이트관련 명령요청 -> 레디스는 AOF에 저장 > (매작업마다 디스크에 기록을 남김) 파일쓰기저장완료되면 실제로 해당명령을 실행해서 메모리의 내용을 변경
    • 매작업마다 디스크에 기록을 남기기 떄문에 appendfsync 옵션설정이 중요하고, 당연히 no >  everysec > always순이 성능이 좋을수밖에..

  • 레디스의 리플리케이션

    • slaveof no one
      • 마스터에 데이터가 하나도 없는 경우 emptyDb 를 호출해 슬레이브에 있는 데이터도 날아갈수 있다.
      • 그리하여.. 마스터에 장애가 난경우, 슬레이브 레디스에서  slaveof no one으로 슬레이브로 더이상 동작 하지 않도록 해준다.