카테고리 없음

레디스. 우리 어떻게 쓰고있을까?

혜룐 2018. 2. 12. 10:44


사내위키에 적어놓은거 옮긴다.... 
  • 레디스. 우리 어떻게 쓰고있을까?

    • 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 2.2.2.2:36054 asks for synchronization
         
        [144623] 02 Feb 05:18:03.306 * Full resync requested by slave 2.2.2.2:36054
         
        [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@a4:~$ ps -eLf | grep redis | grep 36054
         
        d    71802  71396  71802  0    1 05:15 pts/0    00:00:00 tail -f /redis/log/redis-36054.log
         
        d    72674 144623  72674 69    1 05:18 ?        00:00:03 redis-rdb-bgsave *:36054   .
         
        d   144623   1190 144623  0    3  2015 ?        06:16:12 /usr/local/bin/redis-server *:36054
         
        d   144623   1190 144630  0    3  2015 ?        00:00:00 /usr/local/bin/redis-server *:36054 
        d   144623   1190 144631  0    3  2015 ?        00:09:35 /usr/local/bin/redis-server *:36054
    • AOF

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

    • 레디스의 리플리케이션

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