2008-09-04 64 views
10

Cách tốt nhất để giải quyết một cơ sở dữ liệu bị phân loại trong Rails là gì? Nếu sharding được xử lý ở lớp ứng dụng, lớp bản ghi hoạt động, lớp trình điều khiển cơ sở dữ liệu, một lớp proxy, hoặc cái gì khác hoàn toàn? Những ưu và nhược điểm của mỗi cái là gì?Cơ sở dữ liệu sharding and Rails

Trả lời

13

FiveRuns có một viên ngọc tên DataFabric mà không sharding cấp ứng dụng và nhân rộng master/slave. Nó có thể là giá trị kiểm tra ra.

+3

https://github.com/mperham/ data_fabric là URL mới –

+2

"Bob hiện đang phụ trách": https://github.com/bpot/data_fabric –

1

Để suy nghĩ của tôi, cách đơn giản nhất là duy trì 1: 1 giữa các phiên bản đường ray và phân đoạn DB.

9

Tôi giả sử với phân đoạn, chúng tôi đang nói về phân vùng nằm ngang và không phân vùng theo chiều dọc (here are the differences on Wikipedia).

Trước hết, phân đoạn theo chiều dọc dọc theo như bạn có thể thực hiện trước khi bạn xem xét phân vùng theo chiều ngang. Thật dễ dàng trong Rails để có các mô hình khác nhau trỏ đến các máy khác nhau và đối với hầu hết các trang Rails, điều này sẽ mang lại cho bạn đủ xa.

Để phân vùng theo chiều ngang, trong một thế giới lý tưởng, điều này sẽ được xử lý ở lớp ứng dụng trong Rails. Nhưng trong khi nó không khó, nó không tầm thường trong Rails, và vào thời điểm bạn cần nó, thường ứng dụng của bạn đã phát triển vượt ra ngoài điểm mà điều này là khả thi vì bạn có các cuộc gọi ActiveRecord rắc khắp nơi. Và không ai, nhà phát triển hoặc quản lý, thích làm việc trên nó trước khi bạn cần vì mọi người sẽ thích làm việc với các tính năng mà người dùng sẽ sử dụng ngay bây giờ thay vì phân vùng có thể không hoạt động trong nhiều năm sau khi lưu lượng truy cập của bạn phát nổ.

ActiveRecord layer ... không dễ dàng từ những gì tôi có thể thấy. Sẽ đòi hỏi rất nhiều khỉ vá vào Rails internals.

Tại Spock, chúng tôi đã xử lý việc này bằng cách sử dụng proxy MySQL tùy chỉnh và mở nguồn trên SourceForge là Spock Proxy. ActiveRecord nghĩ rằng nó đang nói chuyện với một máy cơ sở dữ liệu MySQL khi thực tế nó nói chuyện với proxy, sau đó nói chuyện với một hoặc nhiều cơ sở dữ liệu MySQL, hợp nhất/sắp xếp kết quả và trả về ActiveRecord. Chỉ yêu cầu một vài thay đổi đối với mã Rails của bạn. Hãy xem trang Spock Proxy SourceForge để biết thêm chi tiết và vì lý do của chúng tôi để đi tuyến đường này.

+0

+1 để kéo dài phân đoạn theo chiều dọc ở cấp bảng. Với ActiveRecord, việc chia các bảng thành nhiều bảng có ít cột hơn để phân lập dữ liệu "nóng" với dữ liệu khác là khá dễ dàng. Điều này tạo nên sự khác biệt lớn nếu bạn đang sử dụng MySQL. – casey

2

Kết nối Rails với nhiều cơ sở dữ liệu không phải là vấn đề lớn - bạn chỉ cần có một lớp con ActiveRecord cho mỗi phân đoạn ghi đè thuộc tính kết nối. Điều đó làm cho nó khá đơn giản nếu bạn cần phải thực hiện các cuộc gọi cross-shard. Sau đó bạn chỉ cần viết một đoạn mã nhỏ khi bạn cần thực hiện cuộc gọi giữa các mảnh.

Tôi không thích ý tưởng của Hank về việc tách các trường hợp đường ray, bởi vì có vẻ khó khăn khi gọi mã giữa các trường hợp trừ khi bạn có một thư viện được chia sẻ lớn.

Ngoài ra, bạn nên xem xét việc thực hiện một cái gì đó như Masochism trước khi bạn bắt đầu sharding.

1

Đối với đường ray để làm việc với môi trường được sao, tôi sẽ đề nghị sử dụng my_replication Plugin giúp kết nối cơ sở dữ liệu chuyển sang một trong những nô lệ tại thời gian chạy

https://github.com/minhnghivn/my_replication

Các vấn đề liên quan