카테고리 없음
레디스. 우리 어떻게 쓰고있을까?
혜룐
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를 통해 저장하는 것으로 아래 내용을 보면
레디스인스턴스 이전작업을 위해 운영중인 레디스를 마스터 / 복제될 레디스르 슬레이브라 칭한다.
AOF
- 데이터를 저장하기 전에 AOF파일에 현재 수행해야할 명령을 미리저장해두고, 장애가발생했을때 AOF를 기반으로 복구하는데 활용된다.
- 클라이언트가 레디스에 업데이트관련 명령요청 -> 레디스는 AOF에 저장 > (매작업마다 디스크에 기록을 남김) 파일쓰기저장완료되면 실제로 해당명령을 실행해서 메모리의 내용을 변경
매작업마다 디스크에 기록을 남기기 떄문에 appendfsync 옵션설정이 중요하고, 당연히 no > everysec > always순이 성능이 좋을수밖에..
레디스의 리플리케이션
- slaveof no one
- 마스터에 데이터가 하나도 없는 경우 emptyDb 를 호출해 슬레이브에 있는 데이터도 날아갈수 있다.
- 그리하여.. 마스터에 장애가 난경우, 슬레이브 레디스에서 slaveof no one으로 슬레이브로 더이상 동작 하지 않도록 해준다.
- slaveof no one
- RDB 저장하는 명령은 2 가지. SAVE / BGSAVE