2012-04-07 38 views
5

Với sharding, làm thế nào bạn có thể duy trì một giao dịch đáng tin cậy trên nhiều máy chủ cơ sở dữ liệu? Ví dụ, nếu tôi có một bảng tên là AccountLedger trên một máy chủ cơ sở dữ liệu (MySQL instance) và một bảng có tên User trên máy chủ cơ sở dữ liệu khác, có thể chạy một giao dịch trên cả hai trường hợp cơ sở dữ liệu. rollback về thất bại?Sharding and Transactions với MySQL

Ví dụ giao dịch:

máy chủ cơ sở dữ liệu AccountLedger:

START TRANSACTION; 
INSERT INTO AccountLedger SET 
    UserID = @UserID, 
    Date = @Date, 
    Debit = @Debit, 
    Balance = @Balance; 

máy chủ cơ sở dữ liệu tài khoản: máy chủ cơ sở dữ liệu

START TRANSACTION; 
UPDATE User SET 
    Balance = @Balance 
WHERE UserID = @UserID; 

AccountLedger:

COMMIT; 

tài máy chủ cơ sở dữ liệu:

COMMIT; -- What happens if the COMMIT fails here (power goes out or whatever) 

Tôi đã đọc rất nhiều về sharding, nhưng tôi dường như không tìm thấy bất kỳ thông tin nào về việc sử dụng giao dịch với sharding. Ai đó có thể chỉ cho tôi đi đúng hướng?

Trả lời

8

Có thể thực hiện việc này với các giao dịch được phân phối. Chúng được hỗ trợ bởi bộ lưu trữ InnoDB. Bạn sẽ tìm thấy thêm thông tin về chúng và về cú pháp của các lệnh trong tài liệu MySQL: XA Transactions

Tôi khuyên không nên sử dụng chúng trực tiếp. Nếu tính nhất quán là yêu cầu nhiều nhất đối với ứng dụng ypur, thì hãy sử dụng trình theo dõi giao dịch có thể xử lý nó. Java EE thực hiện điều đó cho bạn.

Tuy nhiên, nếu tính sẵn có quan trọng hơn tính nhất quán, bạn nên tránh các giao dịch được phân phối. Định lý CAP giải thích tại sao.

0

Disclaimer: Tôi làm việc cho ScaleBase (http://www.scalebase.com), nhà cung cấp một giải pháp hoàn chỉnh cho sharding

Hiện tại ScaleBase cung cấp cho các sự lựa chọn để sử dụng việc sử dụng các giao dịch XA trong InnoDB, mặc dù chúng tôi phát hiện ra rằng chúng có thể có hiệu suất tốn kém ... Và chính xác ở những nơi bạn cần cơ sở dữ liệu của bạn là nhanh nhất (chèn lớn vv). Vì vậy, chúng tôi cũng cho phép "phiên bản 2 pha cam kết" của chúng tôi nhanh hơn và có thể được xem là rất gần với XA về tính nhất quán và có thể chỉ đủ cho việc giao dịch ... "Phiên bản của chúng tôi" bao gồm nhanh chóng "bạn có sẵn" truy vấn như phiên bản SELECT() cho tất cả các cơ sở dữ liệu tham gia, và sau đó cam kết chúng. Đây là các cơ chế khác mà chúng tôi có trong bộ điều khiển lưu lượng cơ sở dữ liệu ScaleBase của chúng tôi là đủ cho hầu hết khách hàng của chúng tôi (và những người không - vẫn có thể chọn XA đầy đủ).

3

Bạn có thể thực hiện giao dịch có thể tuần tự chéo trên phía máy khách nếu mỗi phân đoạn hỗ trợ cho mỗi tuyến tính chính và so sánh và đặt (điều này đúng với MySQL). Cách tiếp cận này được sử dụng trong Google's Percolator và trong các CockroachDB nhưng không có gì ngăn cản bạn sử dụng nó với MySQL.

Tôi đã tạo một step-by-step visualization các giao dịch như vậy. Tôi hy vọng nó sẽ giúp bạn hiểu chúng.

Nếu bạn ổn với mức độ cách ly đã đọc cam kết thì bạn có thể xem RAMP transactions bởi Peter Bailis.Chúng cũng có thể được thực hiện trong môi trường MySQL bị phân mảnh.