문제

Rails에서 샤딩된 데이터베이스를 처리하는 가장 좋은 방법은 무엇입니까?샤딩을 애플리케이션 계층, 활성 레코드 계층, 데이터베이스 드라이버 계층, 프록시 계층 또는 기타 다른 계층에서 처리해야 합니까?각각의 장단점은 무엇입니까?

도움이 되었습니까?

해결책

FiveRuns에는 이름이 지정된 보석이 있습니다. DataFabric 이는 애플리케이션 수준 샤딩 및 마스터/슬레이브 복제를 수행합니다.확인해 볼 가치가 있을 수도 있습니다.

다른 팁

나는 샤드에 대해 수직 분할이 아닌 수평 분할에 대해 이야기하고 있다고 가정합니다(Wikipedia의 차이점은 다음과 같습니다.).

우선, 수직 분할 확장 수평 파티셔닝을 고려하기 전에 최대한 활용하세요.Rails에서는 서로 다른 모델이 서로 다른 머신을 가리키는 것이 쉬우며 대부분의 Rails 사이트에서는 이것으로 충분합니다.

수평 분할의 경우 이상적인 경우에는 다음 단계에서 처리됩니다. 애플리케이션 레이어 레일즈에서.하지만 어렵지는 않지만 Rails에서는 사소한 일도 아니며 필요할 때쯤에는 일반적으로 ActiveRecord 호출이 여기저기에 뿌려져 있기 때문에 애플리케이션이 이것이 가능한 수준 이상으로 성장합니다.그리고 개발자나 경영진 중 어느 누구도 필요하기 전에 작업하는 것을 좋아하지 않습니다. 트래픽이 폭증한 후 몇 년 동안 작동하지 않을 수 있는 파티셔닝보다는 사용자가 지금 사용할 기능에 대해 작업하는 것을 선호하기 때문입니다.

ActiveRecord 레이어...내가 보기엔 쉽지 않다.Rails 내부에 많은 원숭이 패치가 필요합니다.

~에 스팍 우리는 결국 이 문제를 다음을 사용하여 처리했습니다. 사용자 정의 MySQL 프록시 SourceForge에서 다음과 같이 오픈소스로 공개했습니다. 스팍 프록시.ActiveRecord는 실제로 프록시와 통신할 때 하나의 MySQL 데이터베이스 시스템과 통신하고 있다고 생각합니다. 프록시는 하나 이상의 MySQL 데이터베이스와 통신하고 결과를 병합/정렬하여 ActiveRecord에 반환합니다.Rails 코드를 몇 가지만 변경하면 됩니다.자세한 내용과 이 경로를 선택한 이유는 Spock Proxy SourceForge 페이지를 참조하세요.

나처럼 샤딩에 대해 들어본 적이 없는 분들을 위해:

http://highscalability.com/unorthodox-approach-database-design-coming-shard

Rails를 여러 데이터베이스에 연결하는 것은 큰 문제가 아닙니다. 연결 속성을 재정의하는 각 샤드에 대해 ActiveRecord 하위 클래스를 갖기만 하면 됩니다.샤드 간 호출이 필요한 경우 매우 간단해집니다.그런 다음 샤드 간에 호출이 필요할 때 약간의 코드를 작성하기만 하면 됩니다.

나는 큰 공유 라이브러리가 없으면 인스턴스 간에 코드를 호출하는 것이 어려워 보이기 때문에 레일 인스턴스를 분할하려는 Hank의 아이디어를 좋아하지 않습니다.

또한 당신은 다음과 같은 일을보아야합니다 마조히즘 샤딩을 시작하기 전에.

레일이 복제된 환경에서 작동하려면 런타임 시 데이터베이스 연결을 슬레이브 중 하나로 전환하는 데 도움이 되는 my_replication 플러그인을 사용하는 것이 좋습니다.

https://github.com/minhnghivn/my_replication

내 생각에 가장 간단한 방법은 레일 인스턴스와 DB 샤드 간에 1:1을 유지하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top