2014-12-17 2 views
2

작은 값, < 100 바이트가 포함 된 매우 큰 키 집합, 200M 키가 있으며 Redis를 사용하려고합니다. 문제는 내가 10 개의 Redis DB를 사용하여 키를 분할하는 것이지만, 현재는 10 개의 Redis DB가있는 단일 서버에 있습니다. Redis DB는 평균적으로 SELECT을 사용합니다.
내 계산에서 보면 메모리를 날려 버릴 것 같습니다. 나는이 경우 4TB 이상의 메모리가 필요하다고 생각한다. 내 옵션은 무엇입니까? 첫째, 나의 계산은 100MB의 값을 가진 10000 개의 키를 기반으로합니다. 220 바이트의 RAM을 사용합니다 (이것은 내가 발견 한 테이블에서 나온 것입니다).
간단하게 (2*10^8/10^4) * 220MB = 4.4TB을 입력하십시오.Redis : 큰 키 집합을위한 서버의 효율적인 클러스터

계산이 정확하면 내 옵션은 무엇입니까? Redis VM이 더 이상 옵션이 아닌 다른 게시물을 읽었습니다. Redis 클러스터를 사용할 수 있습니까? 여전히 실용적으로 사용하려면 너무 많은 서버가 필요합니다.
다른 DB로 전환 할 수 있음을 알고 있지만 최후의 수단으로 사용하겠습니다.

+0

당신이 하나의 해시에 여러 개의 키를 사용하려고 있나요? 이렇게하면 메모리 사용량을 10 번 줄일 수 있습니다. – antirez

+0

해싱/압축 전략을 검토 중입니다. 아마이 주제에 대해서 질문을 게시해야할까요? 문제에 대한 세부 사항을 말하지는 않았지만 흥미 롭습니다. 우리는 S3 엔드 포인트를 수행하고 있으므로 키는 사용자가 지정한 "경로"이고 값은 내부 객체 "경로"입니다. 키는 256 자 내의 아무 것이나 될 수 있습니다.실제 파일 경로로 바꿔야하지만 우리가 완전히 통제 할 수있는 가치입니다. 즉, 포인터를 사용하면 파일을 가져와야합니다. 그래서 압축이나 해싱 기술을 사용하여 데이터베이스를 줄일 수 있습니다. 다음 단계입니다. – tradetree

+0

깔끔한 프로젝트처럼 들리지만 통찰력을 얻거나 아이디어를 해시 (:)하려는 경우 [redis-db 메일 링리스트] (https://groups.google.com/forum/#)로 공유하십시오. ! forum/redis-db)도 있습니다. –

답변

4

먼저 공유 데이터베이스 (예 : SELECT 명령)를 사용하면 이러한 데이터베이스가 모두 동일한 Redis 프로세스에 의해 관리되기 때문에 권장되지 않습니다. 경합을 피하기 위해 (동일한 서버에서도) 10 개의 별도 Redis 프로세스가있는 것이 더 좋습니다 (more info here).

다음으로 데이터베이스의 메모리 사용 공간을 줄이는 방법이 있습니다. 예를 들어 클라이언트 측 압축 (here 참조)을 수행하거나 해시를 사용하여 여러 값 (예 : here)을 유지하는 것과 같은 다른 최적화를 고려할 수 있습니다.

즉, Redis 서버는 궁극적으로 호스트가 제공하는 RAM의 양에 의해 제한됩니다. 일단 제한에 도달하면 데이터베이스를 분할하고 Redis 클러스터를 사용해야합니다. 이미 여러 데이터베이스를 사용하고 있으므로 코드가 이미 어느 정도 호환 될 수 있으므로 큰 문제는 아닙니다. 샤딩은 클라이언트, 프록시 또는 Redis Cluster의 세 가지 방법 중 하나로 수행 할 수 있습니다. 클라이언트 측 샤딩은 코드 또는 사용중인 Redis 클라이언트 (사용중인 클라이언트 라이브러리가 지원하는 경우)로 구현할 수 있습니다. Redis Cluster (v3)은 가까운 장래에 릴리스 될 것으로 예상되며 이미 안정적인 릴리스 후보를 보유하고 있습니다. 프록시 기반 샤딩에 관해서는 Twitter's twemproxy, Netflix's dynomitecodis을 비롯한 몇 가지 오픈 소스 솔루션이 있습니다. 샤딩 및 파티셔닝에 대한 추가 정보는 here입니다.

면책 조항 : Redis Labs에서 근무하고 있습니다. 마지막으로, AFAIK에는 이미 Redis 클러스터링에 대한 내장 지원 기능을 제공하는 유일한 Redis-as-a-Service 제공 업체가 있습니다. Redis Labs의 Redis Cloud은 모든 필수 용량에 완벽하게 확장 할 수있는 완벽하게 관리되는 서비스입니다. 우리 클러스터는 RegEx에 의한 '{}'해시 태그 표준과 샤딩 표준을 모두 지원합니다. 자세한 내용은 here을 참조하십시오.

0

Dynomite와 함께 LMDB를 사용하여 메모리 용량을 초과하는 데이터를 저장할 수 있습니다. LMDB는 디스크와 메모리를 모두 사용하여 데이터를 저장합니다. Dynomite는 LMDB를 배포합니다.

우리는이 콤보로 POC를 수행했으며 함께 잘 작동합니다.

자세한 내용을 보려면 여기를 오픈 문제를 확인하시기 바랍니다 : https://github.com/Netflix/dynomite/issues/254