2008-09-22 4 views
7

현재 테라코타가 RAM에 묶여있는 응용 프로그램을 확장 할 수 있도록 평가하고 있습니다. 협업 필터이며 사용자 당 약 2 킬로바이트의 데이터를 저장합니다. 아마존의 EC2를 사용하고 싶습니다. 즉, 14GB의 RAM으로 제한되어 있기 때문에 약 700 만 명의 사용자가 서버 당 상한선을 효과적으로 사용할 수 있습니다. 나는 이것을 넘어서 확장 할 수 있어야합니다.테라코타를 사용하여 RAM을 많이 사용하는 응용 프로그램을 확장 할 수 있습니까?

테라코타가 각 서버의 사용 가능한 RAM보다 큰 클러스터 된 힙을 가질 수 있다는 것을 읽은 지금까지의 내용을 토대로합니다. 각 서버가 14GB 만 지원하는 30GB 이상의 클러스터 된 힙을 효과적으로 사용할 수 있습니까?

사용자 별 데이터 (대량의 플로트 배열)는 매우 자주 변경되며 잠재적으로 분당 수십만 회가됩니다. 이러한 변경 사항 하나 하나가 클러스터의 다른 노드와 동기화 될 필요는 없습니다. 주기적으로 일부 개체 필드 만 동기화 할 수 있습니까?

+0

sharded redis 클러스터가이 시나리오에서 효과가 있었습니까? – cobbzilla

답변

4

저는 대답이 자격이 있다고 대답합니다. Terracotta는 단일 JVM의 크기보다 큰 클러스터 된 힙으로 작업 할 수 있도록 허용하지만 가장 일반적인 사용 사례는 아닙니다.

a) 작업 세트 크기 및 b) 데이터 트래픽 양을 기억해야합니다. a)의 경우, 주어진 시간에 작업을 수행하기 위해 메모리에 있어야하는 일부 데이터 세트가 있으며 작업 세트 크기> 힙 크기 인 경우 성능이 명백하게 저하됩니다. b)의 경우, 클러스터 된 힙에 추가/갱신 된 각 데이터는 서버로 송신되어야합니다. 테라코타는 pojo 그래프에서 세분화 된 필드를 변경할 때 가장 좋습니다. 큰 배열 작업은 테라코타 기능을 최대한 활용하지 못합니다 (사람들이 때때로 그런 식으로 사용하지 않는다는 말은 아닙니다).

쓰레기를 많이 생성하는 경우 테라코타 메모리 관리자와 분산 가비지 수집기는이를 따라 잡을 수 있어야합니다. 데이터 볼륨이 사용 가능한 대역폭을 초과하는지 여부를 확인하지 않고 말하기는 어렵습니다.

여러 서버를 실행하고 서버별로 데이터를 분할하거나 일부 지역 참조가있는 경우 응용 프로그램에 큰 도움이됩니다. 이 경우 한 서버의 힙에있는 데이터 만 필요하고 나머지는 메모리에 폴트 할 필요가 없습니다. 물론 다른 서버가 다운되면 페일 오버/가용성을 위해 필요한 경우 오류가 발생합니다. 이것이 의미하는 바는 파티션 된 데이터의 경우 모든 노드로 브로드 캐스팅하지 않고 서버로만 트랜잭션을 전송한다는 것입니다.

숫자 관점에서 볼 때 30GB의 데이터를 인덱싱 할 수 있으므로 하드 한도에 근접하지 않습니다.

+0

빠른 추적 : 테라코타가있는 HashMap을 사용하면 값을 분산시킬 수 있지만 키가 어디서나 미러링된다는 이야기를 들었습니다. 사실입니까? 다른지도 컬렉션이 다르게 동작합니까? – sanity

+0

수정하십시오. HashMap, ConcurrentHashMap 등은 모든 노드에서 전체 키 세트를 유지합니다. 이렇게하지 않으면 키가없는 것이 비 로컬 키 또는 누락 된 키 때문인지 여부를 알기가 어렵습니다. 일반적인 대안 중 하나는지도의지도를 작성하여 더 많은 데이터를 페이지 아웃 할 수있게하는 것입니다. –

+0

그 시점에서 구현 세부 사항을 지적해야합니다. Alex는이 방법을 사용하는 것이 더 쉽지만 가상 세트를 가상으로 만드는 것은 불가능한 일이 아닙니다. –