2012-03-05 27 views
5

Tôi hiện đang thiết lập một ứng dụng tổng thể-nô lệ bằng Ruby on Rails. Tôi đang có kế hoạch sử dụng đá quý dữ liệu hoặc bạch tuộc để xử lý các kết nối đọc/ghi.Nhân rộng Postgresql trong đường ray bằng đá quý dữ liệu vải

Đây là lần đầu tiên tôi thiết lập DB chính-phụ. Tôi đang bối rối về các công cụ nguồn mở khác nhau có sẵn để thực hiện sao chép postgresql, ví dụ: pgpool II, pgcluster, Bucardo và Hot Standby/Truyền Replication (được xây dựng trong tính năng trong postgresql 9,1)

yêu cầu của tôi là

  • khả năng chịu lỗi (tính sẵn sàng cao và không mất dữ liệu trên failover)
  • cân bằng tải

Cảm ơn trước

Lưu ý: tôi đã đi qua bưu điện stackoverflow về sao chép postgresql nhưng y là khá cũ và không giúp đỡ để kết luận về công cụ mà tôi nên đi với.

Trả lời

5

Trong trường hợp của bạn, sao chép luồng là nơi bắt đầu. Nó không phải là rất linh hoạt nhưng nó làm những gì bạn cần liên quan đến cơ sở dữ liệu đọc miễn là bạn không cần phải sao chép giữa các phiên bản chính.

Database Replication 101

Cơ sở dữ liệu sao chép là một cách để đảm bảo rằng dữ liệu được lưu vào một máy chủ cụ thể trở nên lưu trữ trong một số máy chủ khác. Điều này thường được thực hiện để sử dụng tốt hơn các kết nối mạng hạn chế hơn, đảm bảo khả năng chịu lỗi (vì vậy về cơ bản có bản sao nóng), đảm bảo rằng các truy vấn chỉ đọc có thể được phân phối trên một số lượng lớn cơ sở dữ liệu, v.v. mà không hy sinh các bảo đảm cơ bản của ACID.

Có một số cách chồng chéo khác nhau để phân loại các giải pháp sao chép. Chúng bao gồm:

  • trang hoặc tập tin cấp vs row-level vs tuyên bố cấp

  • Synchronous vs Asynchronous

  • Master-slave vs Multi-Thạc sĩ

Nói chung sự hiểu biết nhân rộng và sự cân bằng giữa các giải pháp đòi hỏi sự hiểu biết tương đối mạnh mẽ về cơ sở dữ liệu và bảo đảm ACID. Tôi sẽ cho rằng bạn tương đối quen thuộc với cơ chế lưu trữ, và các hoạt động xác định và không xác định và tương tự.

Nhân bản là gì? Thay đổi tệp (Vật lý) so với Thay đổi hàng (lôgic) so với báo cáo

Cách tiếp cận đơn giản nhất là sao chép thay đổi khối vào tệp, ví dụ như được lưu trữ trong nhật ký ghi trước PostgreSQL. Điều này sao chép các thay đổi ở cấp trang và nó yêu cầu định dạng tệp giống nhau. Điều này có nghĩa là bạn không thể sao chép qua các phiên bản chính, kiến ​​trúc CPU hoặc hệ điều hành. Bất cứ điều gì có thể ảnh hưởng đến sự liên kết của các bộ dữ liệu, ví dụ, sẽ gây ra sự sao chép hoặc thất bại hoặc, tệ hơn, làm hỏng cơ sở dữ liệu của nô lệ. Đây là cách tiếp cận trực tuyến nhân rộng sử dụng.Nó rất đơn giản để thiết lập và nó luôn sao chép mọi thứ trong cụm cơ sở dữ liệu.

Ngoài ra phương pháp này có nghĩa là bạn có thể dễ dàng đảm bảo rằng cơ sở dữ liệu chủ và nô lệ giống hệt với cấp tệp. Bởi vì thực tế là PostgreSQL WAL là cluster-global, không chắc rằng cách tiếp cận này sẽ lặp lại bất cứ thứ gì ngắn của toàn bộ cụm cơ sở dữ liệu.

Là một mô tả về cách làm việc này, giả sử tôi:

UPDATE my_table SET rand_value = random() WHERE id > 10000; 

Trong trường hợp này, điều này thay đổi một loạt các trang dữ liệu và các hoạt động tập tin được sao chép vào bản sao. Các tập tin vẫn giống hệt nhau giữa chủ và nô lệ.

Một cách tiếp cận khác, được thực hiện bởi Slony, Bucardo và những người khác là sao chép các hàng theo cách hợp lý. Trong phương pháp này, các hàng đã thay đổi được gắn cờ và ghi lại, và các thay đổi được gửi đến các bản sao. Các bản sao chạy lại hoạt động hàng từ cơ sở dữ liệu chính. Bởi vì đây là những công cụ bổ trợ mà không sao chép các hoạt động của tệp mà là các hoạt động của cơ sở dữ liệu logic, chúng có thể tái tạo trên các kiến ​​trúc CPU, hệ điều hành, vv Ngoài ra chúng thường được thiết kế sao cho bạn có thể sao chép một số chứ không phải tất cả các bảng trong cơ sở dữ liệu, cho phép rất nhiều tính linh hoạt. Mặt khác điều này dẫn đến rất nhiều tiềm năng cho các lỗi. "Rất tiếc, bảng đó không được sao chép" là một vấn đề thực sự.

Trong trường hợp này khi tôi chạy câu lệnh cập nhật ở trên, trình kích hoạt được kích hoạt chụp các hàng thực tế được chèn và xóa và các hàng này được ghi lại, nhân rộng và chạy lại hàng. Bởi vì điều này xảy ra sau khi rand() được chạy, các cơ sở dữ liệu là hợp lý, nhưng không nhất thiết phải giống hệt nhau về mặt vật lý.

Cách tiếp cận cuối cùng là sao chép câu lệnh. Trong trường hợp này, chúng ta sao chép các câu lệnh và chạy lại các câu lệnh trên các bản sao. Một số cấu hình của PgPool sẽ làm điều này. Trong trường hợp này, bạn không thể đảm bảo rằng cơ sở dữ liệu tương đương về mặt logic với bản sao của nó nếu bất kỳ hàm không xác định nào được chạy. Trong tuyên bố ở trên, bản thân câu lệnh sẽ chạy trên mỗi bản sao, đảm bảo số số giả ngẫu nhiên khác nhau trong cột có liên quan.

Synchronous vs Asynchronous

Sự khác biệt này là quan trọng để hiểu về failover đảm bảo. Trong một hệ thống sao chép không đồng bộ, các bản cập nhật được xếp hàng đợi và chuyển khi có thể cho các bản sao và chạy lại ở đó. Trong một hệ thống sao chép đồng bộ, cơ sở dữ liệu chấp nhận việc viết sẽ không trả về một cam kết thành công cho đến khi ít nhất một số cơ sở dữ liệu bản sao nhất định báo cáo một cam kết thành công.

Sao chép không đồng bộ thường mạnh mẽ hơn và tạo ra sự sẵn có tốt hơn so với sao chép đồng bộ. Điều này là do sao chép đồng bộ giới thiệu thêm các điểm thất bại. Nếu bạn có một máy chủ và một nô lệ, thì nếu hệ thống hoặc bị hỏng, cơ sở dữ liệu của bạn sẽ không khả dụng cho hoạt động ghi.

Sự cân bằng là sao chép đồng bộ đảm bảo rằng dữ liệu được cam kết trên thực tế có sẵn trên bản sao trong trường hợp chủ nhân bị lỗi phần cứng thảm khốc ngay sau khi cam kết. Đây là một sự kiện xác suất rất thấp, nhưng trong một số trường hợp, điều quan trọng là bạn biết dữ liệu vẫn có sẵn. Trong ngắn hạn này cung cấp bảo đảm độ bền bổ sung không có mặt trong nhân rộng async.

Multi-Thạc sĩ vs Master-Slave

Hầu hết các hệ thống sao chép là master-slave. Trong trường hợp này, tất cả các ghi bắt đầu từ một nút và được nhân rộng đến các nút khác. Viết chỉ có thể bắt đầu tại một nút. Chúng có thể không bắt đầu ở các nút khác. Điều này làm cho nhân rộng thẳng về phía trước bởi vì chúng ta biết rằng các nô lệ đại diện cho một trạng thái quá khứ của chủ.

Sao chép nhiều bản sao cho phép ghi xảy ra với nhiều nút. Trong một hệ thống sao chép không đồng bộ, điều này dẫn đến vấn đề giải quyết xung đột. Những vấn đề này thực sự tồi tệ hơn hầu hết các giả định khi bạn thêm các câu lệnh DDL. Giả sử hai người dùng khác nhau chạy câu lệnh cập nhật ở trên trên hai thạc sĩ khác nhau. Bây giờ chúng ta sẽ có một tập hợp các bản ghi phải được sao chép lại nhưng chúng sẽ xung đột.

Nhân rộng đa chủ thường yêu cầu mọi người nghĩ qua quy trình giải quyết xung đột này khá cẩn thận. Nó không bao giờ là một quá trình mà chỉ hoạt động ra khỏi hộp. Thông thường, bạn viết các thói quen giải quyết xung đột của riêng bạn. Vì lý do này tôi thường khuyên bạn nên tránh sao chép đa chủ, trừ khi bạn thực sự cần nó.

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