본문 바로가기
IT/Database

[Redis] Partitioning

by 물통꿀꿀이 2018. 12. 10.

*https://redis.io/topics/partitioning

해당 포스트는 위의 URL을 번역(의역)한 것입니다.


파티셔닝(Partitioning)은 여러 개의 Redis 인스턴스에 데이터를 나누는 과정이다. 그래서 모든 인스턴스는 키의 여느 부분(subset) 정도*는 가지고 있다.

이 문서에서는 파티셔닝에 대한 개념을 설명하고, Redis 파티셔닝 방법을 소개할 것이다.

*사용자의 데이터를 각 인스턴스에 나누기 때문에, 각 인스턴스는 전체 데이터의 키의 부분을 어느 정도 가지고 있다는 의미


왜 파티셔닝이 유용한 것일까?

Redis의 파티셔닝은 2가지 주요한 목적이 있다.

- 파티셔닝은 다른 인스턴스들의 메모리를 사용하기 때문에 더 많은 데이터를 저장 할 수 있다. 

## 파티셔닝이 없으면 단일 인스턴스로는 메모리 한계 때문에 많은 양의 데이터를 저장할 수 없다.

- 파티셔닝은 더 많은 코어(core)와 더 많은 인스턴스, 네트워크 어댑터 등을 사용하여 컴퓨팅 파워, 네트워크 대역등을 확장할 수 있다.


파티셔닝 기초

4개의 Redis 인스턴스(R0, R1, R2, R3)과 사용자를 나타내는 키 user:1, user:2 등등이 있다고 가정하자. 

어느 인스턴스에 주어진 키를 저장할지에 대해 다양한 방법을 있을 수 있다. (즉, 주어진 키를 주어진 Redis 서버에 매핑할 수 있는 여러 방법이 있을 수 있다.)

파티셔닝의 가장 단순한 방법은 범위 파티셔닝(range partitioning)이다. 예를 들어 ID 0부터 10,000까지는 R0에 저장하고 ID 10,001부터 20,000까지는 R1에 저장하는 것이다. 이 방법은 실전에서 유용하다. 그러나 매핑 테이블이 필요하다는 단점이 있다. 매번 관리해주어야 하기 때문에 비효율적일 수 있다.

또 다른 방법은 해시 파티셔닝(hash partitioning)이다. 이 방법은 object_name:<id> 형식의 키가 필요 없으며 모든 키에서 사용 할 수 있다.

이 외에도 파티셔닝을 수행하는 방법은 많다. 하지만 해시 파티셔닝의 고급 형태인 일관성 해싱(consistent hasing)이 Redis에서 사용된다.


데이터 저장소인지, 캐시인지?

Redis 파티셔닝은 데이터 저장소인지 캐시인지 의미는 비슷하다. 하지만 데이터 저장소로 정의를 하면 조금 다르다. 

Redis가 데이터 저장소로 사용되면, 주어진 키는 항상 동일한 Redis 인스턴스에만 매핑이 된다. 반면 캐시로 사용되면 주어진 노드가 사용 할 수 없을 때라도 키와 인스턴스 맵을 변경하여 다른 노드를 사용하면 되기 때문에 큰 문제가 아니다.

(즉, 가용성을 바탕으로 쿼리에 대해 응답이 가능하다.)


또한 일관성 해싱(Consistent hashing)은 주어진 키에 매핑되어 있는 노드가 이용가능하지 않을 때, 다른 노드로 노드를 바꾸는 것을 가능하게 한다. 이와 비슷하게 새로운 노드가 추가되면 새로운 키의 몇몇이 새로운 노드로 저장될 것이다.

그럼 주요 개념을 정리해보면 아래와 같다.

- Redis가 캐시로서 사용되면, 일관성 해싱을 통해 확장/축소가 쉽다.

- Redis가 데이터 저장소로 사용되면, 키와 노드간의 매핑이 고정된다. 

## 키와 노드간의 매핑이 고정되지 않으면 노드를 추가 및 삭제할 때, 노드간에 키를 재조정해야 한다.


Presharding

Redis를 캐시로 사용하지 않으면, 노드를 추가 및 삭제하는 것이 까다롭기 때문에 고정된 키-인스턴스 매핑을 사용하는 것이 보다 간편하다.

그러나 데이터 저장소 요구사항은 시간에 따라 달라질 수 있다. (오늘은 10개의 Redis 인스턴스가 필요 할 수 있겠지만 내일은 50개가 필요 할 수 있다.)


이 문제*를 해결하기 위한 방법은 시작 시점에 많은 인스턴스를 시작시키는 것이다. 그리고 파티셔닝을 활용하면 Redis의 여러 개의 인스턴스를 실행시킬 수 있다.

* 키-인스턴스 매핑은 편하지만 인스턴스 추가/삭제와 같은 동적인 상황에서는 복잡해진다.

또한 인스턴스의 수를 크게 할 수 있다. (예를 들어 32, 64개의 인스턴스는 충분한 공간을 제공한다.)


이런 방식으로 데이터 저장소가 커져서 더 많은 Redis 서버가 필요하게 되면, 새로운 서버를 추가하고 데이터의 절반 정도를 새로운 서버에게 넘겨준다.

물론 Redis replication을 사용한다면 서버를 중지하는 것을 최소화 할 수 있다. 


Redis 파티셔닝 구현

- Redis Cluster

Redis Cluster는 자동 샤딩(automatic sharding)과 높은 가용성을 위한 방법이다. (사실상 표준)

'IT > Database' 카테고리의 다른 글

MCC (Multiversion Concurrency Control)  (0) 2019.02.19
[Redis] Cluster Redirection  (0) 2019.01.06
[Redis] Cluster Overview  (1) 2019.01.06
Redis 성능에 영향을 끼치는 것  (0) 2018.07.16

댓글