2012-10-20 2 views
1

다음과 같이 직접 샤딩 전략을 세우려고합니다. BOXES 및 ITEMS 테이블이 있다고 가정 해 보겠습니다. 각 상자에는 여러 항목이있을 수 있습니다. 동일한 BOX와 관련된 항목을 하나의 시스템에 넣습니다. + total_amount_of_boxes_per_userAmazon RDS와 함께 작동하는 DIY 샤딩 전략

total_amount_of_boxes_per_userserver_type. (예 : 100) + shard_id 각 사용자에 대한 사용자의 데이터베이스에 저장되고 내가 하나를 사용하여 사용자가 새 상자를 삽입 할 때마다 그것을 증가 :

box_id 기본 키는 포함 .

서버 유형 100은 상자 + 항목 데이터를 저장하는 서버 목록과 일치합니다. 이 server_type-> shard 관계 목록은 중앙 위치에 있어야하며 DynamoDB에 문서로 저장하는 것이 좋습니다.

DynamoDB의의 구성 문서 : I 조인 할 필요가 없습니다 있도록

boxitems_servers[ 
{shard_id: 1, is_locked: false, hostname: 127.0.0.1} 
{shard_id: 2, is_locked: false, hostname: 127.0.0.2} 
{shard_id: 3, is_locked: false, hostname: 127.0.0.3} 
{shard_id: 4, is_locked: false, hostname: 127.0.0.4} 
] 

나는 내 데이터베이스 내 응용 프로그램 계층을 모델링. 기껏해야 DB에 대해 몇 가지 쿼리를 작성하지만 서버 및 클라이언트 측에서 캐싱됩니다. MySQL을 사용하고 ASP.NET 4.5에서 내 응용 프로그램을 개발하고 있습니다. 사용자가 페이지 명중

: 나는 그 데이터를 읽을 수

http://domain.com/1000014294967295 

그것을 분할하고 다음 얻을 :

  • SERVER_TYPE = 100
  • shard_id = 001
  • total_amount_of_boxes_per_user을 = 4294967295 (당연히 그럴 수 있지만 정수 값입니다)

DynamitDB에서 boxitems_servers 문서를 가져오고 server_type의 문서 만 가져옵니다. 그래서 server type 100 = boxitems_servers.

호스트 이름 (자격 증명은 web.config에 있음)을 기반으로 샤드에 연결하고 기본 키 1000014294967295을 기반으로 데이터를 쿼리합니다.

is_locked: true을 구성 문서에 넣어 특정 샤드를 잠그기로 결정할 수 있습니다. 따라서 데이터를 쓸 때 (업데이트하지 않음) 잠금 해제 된 샤드에만 쓸 것입니다.

shard_id % number_of_active_shard에서 MODULU를 사용하여 데이터를 작성하여 여러 샤드에 걸쳐 데이터를 고르게 분배합니다.

이제 수평 확장을 위해 다른 Amazon RDS 데이터베이스를 추가하려면 이전에 만든 Amazon AMI를 통해 동일한 스키마로 데이터베이스를 만들고 샤드 목록에 서버를 추가하십시오.

boxitems_servers[ 
{shard_id: 1, is_locked: false, hostname: 127.0.0.1} 
{shard_id: 2, is_locked: false, hostname: 127.0.0.2} 
{shard_id: 3, is_locked: false, hostname: 127.0.0.3} 
{shard_id: 4, is_locked: false, hostname: 127.0.0.4} 
{shard_id: 4, is_locked: false, hostname: 127.0.0.5} <- NEW ONE 
] 

Amazon RDS에는 이미 복제가 있으므로 걱정할 필요가 없습니다. 뒤로/복원도 쉽습니다.

내 유일한 관심은 다음과 같습니다 내가 원하는 :

  • 읽기 데이터가 균등
  • 내가 무엇이 필요 정렬 된 데이터

를 검색하는 분산되지 않은 점을 감안, 다른 파편의 데이터를 페이징 그 전략에 대한 당신의 의견. 좀 더 많은 기계를 추가하고 설정 파일을 업데이트하면 Amazon RDS를 사용할 수 있고 쉽게 확장 할 수있는 일종의 플러그 앤 플레이 아키텍처를 만들고 싶습니다. 이는 가동 중지없이 즉시 작동해야합니다.

저는 값 비싼 솔루션에 수천 달러를 지불하고 싶지 않습니다. 몇 가지 테이블과 조인을 방지하기 위해 이미 표준화되지 않은 애플리케이션 요구 사항에 맞는 좋은 샤딩 솔루션을 구축 할 수 있다고 생각합니다. Amazon RDS는 이미 필요한 복제를 제공합니다.

Logan Shard를 만들 수 있으며 각 Shard_id를 다른 DB 시스템 (IP Addres)을 가리 키도록 변경할 수 있습니다. 그러나 'leaf'를 쿼리하면 거기에서 데이터를 찾을 수 없습니다. 위로 이동하고 데이터를 찾을 때까지 다른 샤드들을 질의하십시오.

나는 이것이 좋은 샤딩 전략으로 이어질 수 있다고 생각하는데, 한계가있다. 그러나 트래픽이 많은 웹 사이트 (나는 생각한다)에서 꽤 잘 작동 할 수있다.

답변

0

노드를 추가하면 모든 단일 레코드를 다른 데이터베이스로 옮겨야하기 때문에 MOD 전략이 최선이라고 생각하지 않습니다 (잘못된 옵션이라고 생각합니다).

더 나은 옵션 (예 : Cassandra)은 키를 해시하고 전체 키 스페이스를 여러 조각으로 나눕니다. 일례로서

해시 헥스에서 FFFF 0 사이 응답 노드 4FFF 1000에서 노드 1

  • 에 0FFF 0 내지

    • (이 전체 MD5 또는 SHA1이어야한다)을 제공하는 경우 노드 FFFF까지 D000에서 노드 4
    • 에서 노드 3 9000 CFFF에
    • 8FFF 5000 년 2
    • 5

    이것은 단일 레지스터를 찾고 그 노드에서만 요청하므로 더 많은 레지스터가 필요하면 결국 모든 노드를 요청할 수 있습니다. 데이터를 찾기 위해 키로 선택한 항목에 따라 다릅니다 (PK와 일치 할 필요는 없습니다)

    노드를 추가해야하는 경우 노드 3과 예 2에서와 같이 노드를 분할하면됩니다. 위의 경우 5000에서 6FFF까지 노드 3에 남아 있고 7000에서 8FFF는 새로운 노드 6으로 이동합니다.

  • 관련 문제