mySQL 마스터-마스터 복제

mySQL 마스터-마스터 복제

저는 3개의 서버 mySQL/PHP/Apache 클러스터를 가지고 있습니다(최대 복원력을 위해 각각 다른 대륙에 위치). 나는 모두가 이렇게 말하는 많은 조언을 읽었습니다. 이렇게 하지 마십시오!

본질적으로 내가 이 일을 하려는 이유는 다음과 같습니다.

  1. 복원력 - 서버 3개 중 2개가 다운될 수 있으며 사용자는 계속 로그인하여 데이터를 확인하고 작업을 수행할 수 있습니다.
  2. 백업 - 위와 같은 종류
  3. 로드 공유 - 프런트엔드 로드와 백엔드 서버 프로세스를 여러 시스템에 분산할 수 있습니다.

Percona galera를 포함한 다양한 옵션을 살펴보았는데 모두 단점이 있는 것 같습니다. 가장 중요한 점은 투명성입니다. 어느 시점에서 링크나 서버가 다운되고 모호한 BINLOG 오류가 발생하면 모두 엄청난 문제가 됩니다.

그래서 대신 이것을 직접 구현했습니다. 각 테이블에 INSERT/UPDATE/DELETE 트리거를 작성하는 스크립트 세트가 있습니다. 모든 변경 사항은 복제 테이블에 기록됩니다. 매분마다 이러한 변경 사항이 다른 2개의 서버에 푸시됩니다. 또한 CHECKSUM을 확인하고 불일치를 경고하는 프로세스도 있습니다.

그것은 훌륭하게 작동합니다. 쉽지는 않습니다! 다음을 포함한 여러 가지 이상한 것들:

  • 부동 열 유형을 사용하지 않음(0.3434는 0.3434와 같지 않음...)
  • 자동 증가 키 방지(동시에 2개의 다른 서버에 데이터가 삽입되면 둘 다 다음 값을 사용할 수 있으며 상호 삽입은 실패합니다).
  • 테이블 구조를 변경하면 트리거 생성 스크립트를 다시 실행해야 합니다.

그래서 제 질문은... 무엇이 잘못될 수 있나요? 이것이 어디로/왜 실패하게 될까요? 내가 뭘 몰라??

답변1

위와 반대로 이것은 훌륭한 질문이라고 생각합니다. 그들은 자신들이 한 일에 대한 분석을 요구하는 것이 아니라 알려지지 않은 미지의 일반적인 "4번째 창"을 요구합니다.

데이터 집약적인 애플리케이션은훌륭한 책 그들은 이를 마스터-마스터가 아닌 다중 리더 복제라고 부르며 이것이 왜 함정이 있는지에 대해 좋은 논의를 하고 있습니다. 보시다시피 Galera와 Percona의 서비스는 그렇게 하지 않습니다. 따라서 그럴 만한 이유가 있을 것입니다(저는 아직 Blackhole을 사용해 본 적이 없습니다).

핵심 메시지는 테이블 구조가 다중 리드 복제에 대처할 수 있는지 확인해야 한다는 것입니다. 따라서 별도의 서버에 2개의 새 항목이 추가되면 자동 증가 키를 원하지 않을 것입니다. 필드 - 사용자 ID와 타임스탬프 등을 사용하도록 테이블과 애플리케이션을 디자인해야 합니다. (그래서 수동 작업이 고통스럽습니다.)

또한 데이터베이스 전체를 신속하게 비교하고 표를 작성하여 불일치를 찾아낼 수 있는 적절한 도구가 필요할 수도 있습니다.

관련 정보