다음과 같이 직접 샤딩 전략을 세우려고합니다. BOXES 및 ITEMS 테이블이 있다고 가정 해 보겠습니다. 각 상자에는 여러 항목이있을 수 있습니다. 동일한 BOX와 관련된 항목을 하나의 시스템에 넣습니다. + total_amount_of_boxes_per_user
Amazon RDS와 함께 작동하는 DIY 샤딩 전략
total_amount_of_boxes_per_user
server_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'를 쿼리하면 거기에서 데이터를 찾을 수 없습니다. 위로 이동하고 데이터를 찾을 때까지 다른 샤드들을 질의하십시오.
나는 이것이 좋은 샤딩 전략으로 이어질 수 있다고 생각하는데, 한계가있다. 그러나 트래픽이 많은 웹 사이트 (나는 생각한다)에서 꽤 잘 작동 할 수있다.