사용 가능한 옵션에 대해 많이 읽고 있습니다. 저는 또한 제가 강력히 추천하는 고성능 MySQL 2 판을 손에 넣었습니다.
이것이 내가 함께 모을 수 있었던 것입니다.
클러스터링
일반적인 의미에서 클러스터링은 외부 응용 프로그램에 하나의 서버로 보이는 여러 서버에 부하를 분산하는 것입니다.
MySQL NDB 클러스터
MySQL NDB 클러스터는 동기식 복제 및 자동 데이터 분할 기능이있는 분산 형 인 메모리, 비공유 스토리지 엔진입니다 (실례합니다. 저는 고성능 책에서 문자 그대로 빌 렸지만 거기에 아주 멋지게 배치했습니다). 일부 애플리케이션에서는 고성능 솔루션이 될 수 있지만 웹 애플리케이션은 일반적으로 제대로 작동하지 않습니다.
가장 큰 문제는 매우 단순한 쿼리 (하나의 테이블 만 터치)를 넘어 클러스터가 일반적으로 여러 노드에서 데이터를 검색해야하므로 네트워크 대기 시간이 증가하고 쿼리 완료 시간이 상당히 느려진다는 것입니다. 응용 프로그램은 클러스터를 하나의 컴퓨터로 취급하기 때문에 데이터를 가져올 노드를 알 수 없습니다.
또한 많은 대형 데이터베이스에 대해 메모리 내 요구 사항을 실행할 수 없습니다.
계속되는 세쿼이아
이것은 MySQL 서버에서 미들웨어 역할을하는 또 다른 MySQL 용 클러스터링 솔루션입니다. 동기식 복제, 부하 분산 및 장애 조치를 제공합니다. 또한 요청이 항상 최신 사본에서 데이터를 가져 와서 새로운 데이터가있는 노드를 자동으로 선택하도록합니다.
나는 그것에 대해 좋은 것을 읽었고 전반적으로 꽤 유망한 것처럼 들립니다.
연합
페더레이션은 클러스터링과 비슷하므로 여기에서도 사용했습니다. MySQL은 연합 스토리지 엔진을 통해 연합을 제공합니다. NDB 클러스터 솔루션과 유사하게 단순한 쿼리에서만 잘 작동하지만 복잡한 쿼리의 경우에는 더 나쁩니다 (네트워크 지연 시간이 훨씬 더 높기 때문에).
복제 및 부하 분산
MySQL에는 다른 서버에서 데이터베이스 복제를 생성 할 수있는 기능이 내장되어 있습니다. 이는 서버 간 부하 분할, 핫 백업, 테스트 서버 생성 및 장애 조치와 같은 많은 작업에 사용될 수 있습니다.
복제의 기본 설정에는 대부분 쓰기를 처리하는 하나의 마스터 서버와 읽기 전용을 처리하는 하나 이상의 슬레이브가 포함됩니다. 더 발전된 변형은 마스터-마스터 구성 의 변형으로 , 동시에 여러 서버를 작성함으로써 쓰기를 확장 할 수 있습니다.
각 구성에는 장단점이 있지만 모두가 공유하는 한 가지 문제는 복제 지연입니다. MySQL 복제는 비동기식이므로 모든 노드에 항상 최신 데이터가있는 것은 아닙니다. 이를 위해서는 애플리케이션이 복제를 인식하고 예상대로 작동하도록 복제 인식 쿼리를 통합해야합니다. 일부 응용 프로그램의 경우 이것은 문제가되지 않을 수 있지만 항상 최신 데이터가 필요하면 상황이 다소 복잡해집니다.
복제에는 노드간에로드를 분할하기 위해 일부로드 균형 조정이 필요합니다. 이는 애플리케이션 코드를 일부 수정하거나 전용 소프트웨어 및 하드웨어 솔루션을 사용하는 것처럼 간단 할 수 있습니다.
샤딩 및 파티셔닝
샤딩은 데이터베이스 솔루션을 확장하기 위해 일반적으로 사용되는 접근 방식입니다. 데이터를 더 작은 샤드로 분할하고 다른 서버 노드에 분산합니다. 이를 위해서는 애플리케이션이 필요한 정보를 찾을 수있는 위치를 알아야하므로 효율적으로 작동하기 위해 데이터 저장소의 수정 사항을 인식해야합니다.
Hibernate ORM의 확장 인 Hibernate Shards (안타깝게도 Java에 있습니다. 저는 PHP를 사용하고 있습니다) 와 같이 데이터 샤딩을 처리하는 데 도움이되는 추상화 프레임 워크가 있습니다 . HiveDB 는 샤드 재조정을 지원하는 또 다른 솔루션입니다.
기타
스핑크스
Sphinx 는 전체 텍스트 검색 엔진으로, 테스트 검색보다 훨씬 더 많이 사용할 수 있습니다. 많은 쿼리의 경우 MySQL (특히 그룹화 및 정렬)보다 훨씬 빠르며 원격 시스템을 병렬로 쿼리하고 결과를 집계 할 수 있으므로 샤딩과 함께 사용할 때 매우 유용합니다.
일반적으로 사용 가능한 하드웨어 및 인프라를 더 많이 확보하려면 다른 확장 솔루션과 함께 스핑크스를 사용해야합니다. 단점은 스핑크스를 현명하게 사용하려면 애플리케이션 코드가 필요하다는 것입니다.
요약
확장 솔루션은이를 필요로하는 애플리케이션의 요구 사항에 따라 다릅니다. 우리와 대부분의 웹 애플리케이션의 경우 복제 (아마 다중 마스터)가로드 밸런서를 사용하여로드를 분산하는 방법이라고 생각합니다. 특정 문제 영역 (거대한 테이블)의 분할도 수평으로 확장 할 수있는 필수 요소입니다.
또한 Continuent Sequoia에 대한 기회를 제공하고 애플리케이션 코드에 최소한의 변경을 포함 할 것이기 때문에 약속 한 것을 실제로 수행 할 수 있는지 살펴볼 것입니다.