2008-10-05 23 views
49

Tôi đang nghiên cứu cách cam kết hai pha hoạt động trên một giao dịch phân tán. Đó là sự hiểu biết của tôi rằng trong phần cuối của giai đoạn, điều phối viên giao dịch yêu cầu mỗi nút cho dù nó đã sẵn sàng để cam kết hay chưa. Nếu mọi người đồng ý, thì nó bảo họ hãy tiếp tục và cam kết.Cam kết hai pha ngăn chặn lỗi thứ hai như thế nào?

Điều gì ngăn cản lỗi sau?

  1. Tất cả các nút trả lời rằng họ sẵn sàng cam kết
  2. Giao dịch điều phối viên nói với họ để "đi trước và cam kết", nhưng một trong các nút tai nạn trước khi nhận thông điệp này
  3. Tất cả khác các nút cam kết thành công, nhưng bây giờ giao dịch phân phối bị hỏng
  4. Đó là sự hiểu biết của tôi rằng khi nút bị hỏng quay trở lại, giao dịch của nó sẽ được khôi phục (vì nó không bao giờ nhận được thông báo cam kết)

Tôi giả sử mỗi nút đang chạy một cơ sở dữ liệu bình thường không biết gì về giao dịch được phân phối. Tôi đã bỏ lỡ cái gì?

+0

Giả định của bạn về cơ sở dữ liệu thông thường là không chính xác. Bất kỳ tài nguyên (hàng đợi tin nhắn, cơ sở dữ liệu, vv) hỗ trợ giao dịch phân phối (bằng cách hỗ trợ một điều phối viên giao dịch) hoặc nó không. Nếu không, kludges để bao gồm nó trong một giao dịch phân phối sẽ làm giảm độ tin cậy. – erickson

+0

Erickson, nếu bạn gấp câu trả lời của người khác bằng bình luận của bạn, tôi sẽ đánh dấu nó là câu trả lời chính thức. – Gili

Trả lời

15

Tổng kết của tất cả mọi người câu trả lời:

  1. Người ta không thể sử dụng cơ sở dữ liệu bình thường với các giao dịch phân tán. Cơ sở dữ liệu phải hỗ trợ rõ ràng một điều phối viên giao dịch.

  2. Các nút không được hướng dẫn để quay lại vì một số nút đã cam kết. Điều gì xảy ra là khi nút bị hỏng quay trở lại, điều phối viên giao dịch yêu cầu nó thực hiện lại.

+1

Điều gì sẽ xảy ra nếu điều phối viên bị treo khi nút bị ngắt và nút đánh thức khi điều phối viên vẫn đang hoạt động? Nút này làm gì? –

+2

Tôi đề nghị mở một câu hỏi riêng cho vấn đề này. Tôi không biết câu trả lời bản thân mình nhưng tôi đoán rằng các nút chờ đợi cho các điều phối viên để trở lại trước khi chấp nhận kết nối khách hàng. – Gili

+0

Nếu không có điều phối viên, tất cả mọi thứ xay để ngăn chặn tất nhiên. –

16

No. Điểm 4 không chính xác. Mỗi nút ghi trong lưu trữ ổn định mà nó đã có thể cam kết hoặc khôi phục giao dịch, do đó nó sẽ có thể thực hiện theo lệnh ngay cả trên các sự cố. Khi nút bị hỏng quay trở lại, nó phải nhận ra rằng nó có một giao dịch trong trạng thái trước cam kết, phục hồi bất kỳ khóa liên quan hoặc điều khiển khác, và sau đó cố gắng liên hệ với trang điều phối để thu thập trạng thái giao dịch.

Sự cố chỉ xảy ra nếu nút bị lỗi không bao giờ quay lại (sau đó mọi thứ khác cho rằng giao dịch là OK hoặc sẽ xảy ra khi nút bị lỗi quay lại).

+0

Điều này không giả định rằng cơ sở dữ liệu nhận thức được các giao dịch phân tán? Tôi nghĩ rằng bạn có nghĩa vụ phải có thể phù hợp với các giao dịch phân tán trên cơ sở dữ liệu thông thường mà không biết gì về nó ... – Gili

+5

Không; DBMS phải nhận thức được trách nhiệm của mình trong giao thức 2PC, và trách nhiệm chính là giữ lại một giao dịch trong trạng thái Go/No-Go cho đến khi điều phối viên đưa ra lệnh. Bạn bị mất (quyền tự chủ) tại thời điểm đó. Informix thực hiện rollback heuristic để đối phó với các hệ thống biến mất. –

9

Hai giai đoạn cam kết không phải là dễ dàng và chỉ được thiết kế để hoạt động trong 99% các trường hợp thời gian.

"Giao thức giả định rằng có bộ nhớ ổn định ở mỗi nút có nhật ký ghi trước, không có nút nào bị treo vĩnh viễn, dữ liệu trong nhật ký ghi trước không bao giờ bị mất hoặc bị hỏng trong sự cố và bất kỳ hai nút có thể giao tiếp với nhau. "

http://en.wikipedia.org/wiki/Two-phase_commit_protocol

+0

Ngay cả khi các giả định bạn đã đề cập được đáp ứng, tôi không thấy cách nút được cho là biết để phát lại giao dịch (thay vì quay lại) khi nó trở lại từ một sự cố. Theo như tôi hiểu, cơ sở dữ liệu không nhận thức được giao dịch được phân phối; một cái gì đó trên đầu trang của nó. – Gili

+0

@Gili: cơ sở dữ liệu phải biết về giao dịch phân phối để hỗ trợ 2PC chính xác. Nếu bạn xây dựng một cái gì đó trên đầu trang, sau đó bạn không có một thực hiện 2PC đáng tin cậy. –

31

Không, họ không được hướng dẫn để quay trở lại vì trong kịch bản poster ban đầu, một số các nút đã cam kết. Điều gì xảy ra là khi nút bị rơi trở nên có sẵn, điều phối viên giao dịch yêu cầu nó thực hiện lại.

Vì nút phản hồi tích cực trong giai đoạn "chuẩn bị", cần phải có khả năng "cam kết", ngay cả khi nó trở lại sau sự cố.

+0

Tôi không hiểu làm thế nào các nút bị rơi là vụ phải có khả năng phát lại giao dịch lên đến vị trí mà nó rời đi. Nếu bạn đang lắp thư viện giao dịch phân tán trên cơ sở dữ liệu thông thường, điều gì ngăn DB quay trở lại khi gặp sự cố? – Gili

+6

Gili: Bởi vì nó hứa rằng nó sẽ có thể, trong giai đoạn chuẩn bị của 2PC. – Thomas

+1

@Gili DB bị lỗi không phải phát lại giao dịch. Cách các giao dịch DB truyền thống hoạt động là họ đang tích cực thực hiện những thay đổi đó trong nhật ký giao dịch, điều này chỉ xảy ra nếu nó có thể nhận được các khóa hàng/bảng/trang cần thiết. Về cơ bản sau giai đoạn đầu tiên, giao dịch đã sửa đổi DB, nhưng các truy vấn khác không thể thấy những thay đổi đó cho đến khi chúng được đánh dấu là đã cam kết. Tất cả những gì còn lại để làm là đánh dấu chúng là đã cam kết. – AaronLS

6

Có nhiều cách để tấn công các vấn đề với cam kết hai pha. Hầu như tất cả chúng đều biến thành một biến thể của thuật toán cam kết ba pha Paxos. Mike Burrows, người đã thiết kế dịch vụ khóa Chubby tại Google dựa trên Paxos, nói rằng có hai loại thuật toán cam kết được phân phối - "Paxos và những thuật toán không chính xác" - trong bài giảng tôi đã thấy.

Một điều mà nút bị lỗi có thể thực hiện, khi nó làm lại, được gọi là "Tôi chưa bao giờ nghe nói về giao dịch này, nó có nên được cam kết không?" với điều phối viên, điều này sẽ cho biết phiếu bầu là gì.

Hãy nhớ rằng đây là một ví dụ về vấn đề tổng quát hơn: nút bị lỗi có thể bỏ lỡ nhiều giao dịch trước khi khôi phục. Vì vậy, điều cực kỳ quan trọng là khi phục hồi nó nên nói chuyện với điều phối viên hoặc một bản sao khác trước khi tự cung cấp. Nếu bản thân nút không thể biết được nó có bị hỏng hay không, thì mọi thứ trở nên liên quan nhiều hơn nhưng vẫn có thể xử lý được.

Nếu bạn sử dụng hệ thống đại biểu để đọc cơ sở dữ liệu, tính không thống nhất sẽ được che dấu (và được biết đến chính cơ sở dữ liệu).

+0

Làm thế nào để nút phát lại giao dịch khi nó reawakens? Theo như tôi hiểu nó, cơ sở dữ liệu bình thường * luôn luôn * cuộn trở lại trên một vụ tai nạn và họ không nhận thức được giao dịch phân phối (bạn phù hợp với một số thư viện trên đầu trang của họ). Như vậy, tôi không thấy làm thế nào bạn có thể thực hiện công việc này. – Gili

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