레디스 클러스터는 어떻게 동작하는가
- master - slave 구조로 master 장애시 slave로 failover 되게끔 구성한다.
추가) 레디스는 단일 스레드인데 레디스를 scale out하려면 어떻게 해야하는가?
- 슬롯 구조를 이용한다.
- 마스터 노드에 0~16383번까지 슬롯을 할당하고 n개의 redis 노드가 슬롯을 n등분해서 담당하는 구조
- get {key} 하면 레디스 클라이언트가 알아서 레디스 노드들 사이에서 moved 신호를 주고받으면서 키 값을 찾아준다.
- 레디스 클라이언트는 이런 작업을 하기 위해서 redis 노드들이 모여있는 클러스터 정보를 미리 저장해둔다.
그럼 scalue out하여 레디스 노드가 늘어나는 경우 어떻게 되지?
- 레디스는 단일 스레드로 동작해서 더 많은 요청량을 받기위해서는 노드를 늘려야한다.
- 근데 할당받은 슬롯들이 있는데 어케하냐.. -> 슬롯들을 알잘딱 migrate 해주나보다.
- migrate 해주면 레디스 클라이언트가 또 moved 신호를 클러스터랑 주고받으면서 키값을 찾아준다.
레디스 클러스터 사용시 클라이언트 관점에서 유의할 점
- mget 같이 한번에 여러 키를 처리하는 과정을 사용하면
- 클러스터 모드가 아닌 경우 키를 한번에 가져오지만
- 클러스터 모드인 경우 여러 키가 한 슬롯에 있지 않는 이상 get이 실제로는 여러번 나간다.
- 각 slot 마다 mget을 치는 구조라서 한번의 요청으로 끝나지 않는다.
Gzip
- redis를 사용할 때 key-value 사이즈가 크면 gzip 압축을 권장한다.
- 압축을 안하면
- 네트워크 대역폭을 많이 먹게 되고, (500kb 짜리를 1초에 1000번 요청이면 4gbps 정도를 쓰게된다.)
- 레디스 용량도 많이쓰게된다.
- 근데 무조건 gzip 한다고 좋은건 아니다 (825->294, 413->270으로 압축됨, 클수록 효율이 생기나보다.)