1

내가 2 개 차 인덱스가있는 "메시지"테이블이 말해봐. 그 방법은 특정 수신자에게 보낸 모든 메시지를 검색하기 위해 하나의 샤드 만 쿼리하면됩니다.데이터베이스 샤딩에서 비정규 화/보조 인덱스를 어떻게 처리합니까? </ul> <p></li> 내가 "recipient_id"에 의해 "메시지"테이블을 샤딩 할</p> <ul> <li>"recipient_id"</li> <li>"SENDER_ID"

그러나 동시에 특정 발신자가 보낸 모든 메시지를 요청하는 쿼리를 만들 수 있기를 원합니다. 이제 "메시지"테이블의 모든 단일 샤드에 해당 쿼리를 보내지 않습니다. 이를 수행하는 한 가지 방법은 데이터를 복제하고 "sender_id"에 의해 "message_by_sender"표를 분할하는 것입니다.

이 방법의 문제점은 메시지를 보낼 때마다 "message"및 "message_by_sender"테이블에 메시지를 삽입해야한다는 것입니다.

그러나 "message"에 삽입 한 후 "message_by_sender"에 삽입하지 못하면 어떻게 될까요? 이 경우 메시지는 "message"에 있지만 "message_by_sender"에는 없습니다.

"message"에 메시지가있는 경우 2 단계 커밋을 사용하지 않고 "message_by_sender"에도 있는지 확인하려면 어떻게해야합니까?

데이터베이스를 파기하는 사람에게는 매우 일반적인 문제 여야합니다. 너는 그것을 어떻게 처리 할까?

답변

1

이 문제에 "은색 총알"이 없습니다. 일부 옵션 :

  1. 변경 사항을 게시하려면 메시지 대기열을 사용하십시오. 결국 변경으로 인해 다른 파티션으로 변경됩니다.
  2. 테이블에 "인덱스 항목 필요"행을 만드는 메시지 테이블 파티션에 트리거가 있습니다. 다른 것은 주기적으로 이것을 스캔하여 색인을 생성합니다.

Google App Engine에서 분산 트랜잭션을 수행하는 방법에 대한 블로그 항목 (http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine)을 읽어 볼 수 있습니다. 기본적으로 2 단계 커밋이나 Paxos 또는 이와 비슷한 것을 원하지 않는다면 결국 일관성있는 일종의 모델로 살아야합니다.

-dave