2009-04-29 25 views
9

Đối với dự án hiện tại của chúng tôi, chúng tôi đang nghĩ đến việc thiết lập cấu trúc liên kết nhân bản kép cho thiết lập được phân tách theo địa lý; một db trên bờ biển phía đông và db khác ở Nhật Bản. Tôi tò mò nếu có ai đó đã thử điều này và những gì có kinh nghiệm đã được.MySQL dual master

Ngoài ra, tôi tò mò về các tùy chọn khác của tôi để giải quyết vấn đề này; chúng tôi đang xem xét hàng đợi tin nhắn.

Cảm ơn!

Trả lời

8

Chỉ cần lưu ý về các khía cạnh kỹ thuật của kế hoạch của bạn: Bạn phải biết rằng sao chép đa nhân MySQL does not officially support (chỉ MySQL Cluster cung cấp hỗ trợ sao chép đồng bộ).

Nhưng có ít nhất một "hack" làm cho việc sao chép đa chủ có thể ngay cả với thiết lập sao chép MySQL bình thường. Vui lòng xem số "MySQL Multi-Master Replication" của Patrick Galbraith để biết giải pháp có thể. Tôi không có bất kỳ kinh nghiệm với thiết lập này, vì vậy tôi không dám đánh giá về cách khả thi cách tiếp cận này sẽ được.

+0

thnx cho liên kết – Edmhs

2

Có một số điều cần xem xét khi nhân rộng cơ sở dữ liệu về mặt địa lý. Nếu bạn làm điều này vì lý do hiệu suất, hãy đảm bảo mô hình sao chép của bạn hỗ trợ dữ liệu của bạn "cuối cùng nhất quán" vì có thể mất thời gian để mang lại bản sao hiện tại ở cả hai hoặc nhiều vị trí. Nếu thông lượng của bạn hoặc thời gian phản hồi giữa các vị trí không tốt, nhân rộng hoạt động có thể không phải là lựa chọn tốt nhất.

1

Do kiến ​​trúc một-nhiều của bản sao MySQL, bạn phải có vòng lặp nhân bản với nhiều bản gốc: tức là mỗi bản sao lặp lại từ vòng lặp tiếp theo. Đối với hai, họ lặp lại lẫn nhau. Điều này đã được hỗ trợ từ xa như v3.23.

Ở nơi trước đây tôi đã làm việc, chúng tôi đã làm điều đó với v3.23 với khá nhiều khách hàng như một cách để cung cấp chính xác những gì bạn đang yêu cầu. Chúng tôi đã sử dụng đường hầm SSH qua Internet để thực hiện sao chép. Chúng tôi mất một thời gian để làm cho nó đáng tin cậy và nhiều lần chúng tôi phải làm một bản sao nhị phân của một cơ sở dữ liệu khác (may mắn thay, không ai trong số họ vượt quá 2Gb cũng không cần truy cập 24 giờ). Ngoài ra bản sao trong v3 đã không gần như ổn định như trong v4 nhưng ngay cả trong v5, nó sẽ chỉ dừng lại nếu nó phát hiện bất kỳ loại lỗi nào.

Để phù hợp với độ trễ nhân rộng không thể tránh khỏi, chúng tôi đã cấu trúc lại ứng dụng để nó không dựa trên các trường AUTOINCREMENT (và loại bỏ thuộc tính đó khỏi bảng). Điều này là hợp lý đơn giản do lớp truy cập dữ liệu mà chúng tôi đã phát triển; thay vì sử dụng mysql_insert_id() cho các đối tượng mới, trước tiên nó tạo ID mới và chèn nó cùng với phần còn lại của hàng. Chúng tôi cũng đã triển khai ID trang web mà chúng tôi lưu trữ ở nửa trên cùng của ID, vì chúng là BIGINT s. Điều này cũng có nghĩa là chúng tôi không phải thay đổi ứng dụng khi chúng tôi có một khách hàng muốn cơ sở dữ liệu ở ba địa điểm. :-)

Nó không phải là 100% mạnh mẽ. InnoDB chỉ đạt được một số khả năng hiển thị để chúng tôi không thể dễ dàng sử dụng các giao dịch, mặc dù chúng tôi đã xem xét nó. Vì vậy, đôi khi có điều kiện chủng tộc khi hai đối tượng cố gắng được tạo với cùng một ID. Điều này có nghĩa là một thất bại và chúng tôi đã cố gắng để báo cáo rằng trong ứng dụng. Nhưng nó vẫn là một phần quan trọng trong công việc của một ai đó để theo dõi sự sao chép và sửa chữa mọi thứ khi nó bị phá vỡ. Quan trọng hơn, để khắc phục nó trước khi chúng ta quá xa đồng bộ, bởi vì trong một vài trường hợp, cơ sở dữ liệu đã được sử dụng trong cả hai trang web và sẽ nhanh chóng trở nên khó tích hợp lại nếu chúng ta phải xây dựng lại.

Đó là một bài tập tốt để trở thành một phần của, nhưng tôi sẽ không làm điều đó một lần nữa. Không phải trong MySQL.

2

Thiết lập mysql là dual master thực sự hoạt động tốt trong đúng kịch bản được thực hiện chính xác. Nhưng tôi không chắc nó phù hợp với kịch bản của bạn hay không.

Trước hết, thiết lập tổng thể kép trong mysql thực sự là thiết lập vòng. Server A được định nghĩa là master của B, trong khi B là cùng một lúc được định nghĩa là master của A, vì vậy cả hai máy chủ hoạt động như cả master và slave. Bản sao hoạt động bằng cách vận chuyển một bản ghi nhị phân có chứa các câu lệnh sql mà các nô lệ chèn khi nó thấy phù hợp, mà thường là ngay lập tức. Nhưng nếu bạn đang búa nó với chèn địa phương, nó sẽ mất một lúc để bắt kịp. Các chèn phụ là tuần tự bằng cách này, vì vậy bạn sẽ không nhận được bất kỳ lợi ích của nhiều lõi vv.

Việc sử dụng chính mysql kép là để có dự phòng ở cấp máy chủ với tự động thất bại (thường sử dụng hearbeat trên Linux). Không bao gồm mysql-cluster (vì nhiều lý do khác nhau), đây chỉ là failover tự động có thể sử dụng được cho mysql. Thiết lập cho bậc thầy kép cơ bản có thể dễ dàng tìm thấy trên google. Các công cụ nhịp tim là một công việc nhiều hơn một chút. Nhưng điều này không thực sự là những gì bạn đã hỏi, vì điều này thực sự hoạt động như một máy chủ cơ sở dữ liệu duy nhất.

Nếu bạn muốn thiết lập tổng thể kép vì bạn luôn muốn ghi vào cơ sở dữ liệu cục bộ (viết cho cả hai cơ sở dữ liệu cùng một lúc), bạn sẽ cần viết ứng dụng của mình với điều này. Bạn không bao giờ có thể tự động tăng giá trị trong cơ sở dữ liệu và khi bạn có các giá trị duy nhất, bạn phải đảm bảo rằng hai vị trí không bao giờ viết cùng một giá trị. Ví dụ, vị trí A có thể viết các số duy nhất lẻ và vị trí B có thể viết ngay cả các số duy nhất. Lý do là bạn không được đảm bảo rằng các máy chủ được đồng bộ tại bất kỳ thời điểm nào, vì vậy nếu bạn đã chèn một hàng duy nhất trong A và sau đó là hàng duy nhất chồng chéo trong B trước khi máy chủ thứ hai bắt kịp, bạn sẽ có một hệ thống bị hỏng. Và nếu một cái gì đó đầu tiên phá vỡ, toàn bộ hệ thống dừng lại.

Để tổng hợp: có thể, nhưng bạn sẽ cần phải tip-toe rất cẩn thận nếu bạn đang xây dựng phần mềm kinh doanh trên đầu trang này.

+1

Tự động tăng trên nhiều bậc thầy có thể đạt được bằng cách sử dụng tùy chọn --auto-increment-increment và --auto-increment-offset. Mỗi tổng thể có tỷ lệ tự động gia tăng bù trừ duy nhất và chúng chia sẻ cùng một gia số tăng tự động, đó là> = số lượng các bậc thầy. – dpnsan

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