2013-04-17 26 views
7

Tôi đã tự hỏi tại sao ZooKeeper lại cần phần lớn các máy trong bộ quần áo để làm việc. Cho phép nói rằng chúng tôi có một bộ quần áo rất đơn giản của 3 máy - A, B, C.Tại sao ZooKeeper cần đa số để chạy?

Khi thất bại, người lãnh đạo mới được bầu - tốt, mọi thứ đều hoạt động. Khi một người khác chết, hãy nói B, dịch vụ không có sẵn. Nó có ý nghĩa không? Tại sao máy C không thể xử lý mọi thứ một mình, cho đến khi A và B lại hoạt động trở lại?

Kể từ khi một máy là đủ để làm tất cả những công việc (ví dụ máy đơn quần thể hoạt động tốt) ...

Có bất kỳ lý do cụ thể tại sao Zookeeper được thiết kế theo cách này? Có cách nào để cấu hình ZooKeeper đó, ví dụ bộ quần áo có sẵn luôn luôn khi ít nhất một trong N là lên?

Chỉnh sửa: Có thể có cách áp dụng thuật toán tùy chỉnh lựa chọn nhà lãnh đạo? Hoặc xác định kích thước đại biểu?

Xin cảm ơn trước.

+0

Bạn đã tìm thấy một cách để thay đổi thuật toán hiện tại của lựa chọn nhà lãnh đạo? Tôi cũng thấy hơi bực bội khi trả 200K cho 3 máy được cho là sẽ loại bỏ nguy cơ bị lỗi một điểm - không thể tìm thấy bản thân mình về cơ bản ở cùng một vị trí ... – dcg

+0

@dcg Không, tôi thậm chí không thử để tìm cách giải quyết, bởi vì sau khi đọc câu trả lời cho câu hỏi của tôi, tôi đã hiểu cách tiếp cận của ZooKeeper và nó có vẻ rất hợp lý. –

Trả lời

7

Sở thú được dự định phân phối mọi thứ một cách đáng tin cậy. Nếu mạng của hệ thống bị phân đoạn, thì bạn không muốn hai nửa hoạt động độc lập và có khả năng không đồng bộ, bởi vì khi lỗi được giải quyết, nó sẽ không biết phải làm gì. Nếu bạn có nó từ chối hoạt động khi nó có ít hơn một đa số, sau đó bạn có thể yên tâm rằng khi một thất bại được giải quyết, mọi thứ sẽ trở lại ngay lập tức mà không can thiệp thêm.

+1

Trong ví dụ của tôi, tôi không có phân đoạn nào của hệ thống - chỉ có hai trong số 3 nút bị hỏng. Nếu bạn giết bất kỳ nút nào, điều đó không có nghĩa là hệ thống được chia nhỏ hơn 2/3/n một lần - nó vẫn là hệ thống tương tự với ít nút hơn. Hệ thống sẽ bị hỏng, chỉ khi tất cả các nút là. Ngay cả một nút duy nhất cũng có thể xử lý các yêu cầu đọc/ghi của các máy khách (và nó là nền tảng, nó sẽ tiếp tục cố gắng kết nối lại với các nút khác). Dịch vụ ZooKeeper với 50% các nút làm việc, sẽ bị hỏng, có hợp lý không? Nếu chúng ta có 100 máy, chúng ta vẫn sẽ có 50 nút để xử lý mọi thứ ... nhưng hệ thống không có sẵn. –

+1

Thay thế từ "kill" bằng "isolate" và bạn sẽ thấy rằng trong trường hợp lỗi mạng (nhưng máy vẫn đang chạy), một nút mà chính nó không phải là một phần của phần lớn là ngoại tuyến hợp lý. Lỗi mạng là một kịch bản thế giới thực phổ biến hơn so với tắt máy. – slebetman

+3

@ MichałSzkudlarek - Điều bạn không nhận ra là các nút Zookeeper KHÔNG BIẾT nếu các nút bị mất hoàn toàn xuống, hoặc không thể truy cập được do lỗi mạng. Vì vậy, họ hành xử như thể đó là sự thất bại mạng để tránh các vấn đề khi bất cứ điều gì là sai được cố định. –

6

Lý do để có được đa số phiếu bầu là tránh một vấn đề được gọi là "phân chia bộ não".

Về cơ bản, bạn không muốn hai phần của hệ thống tiếp tục như bình thường. bạn muốn một người tiếp tục và người kia hiểu rằng nó không phải là một phần của cụm. Có hai cách chính để đạt được điều đó là giữ một tài nguyên được chia sẻ, ví dụ một đĩa được chia sẻ nơi người lãnh đạo nắm giữ một khóa, nếu bạn có thể thấy khóa bạn là một phần của cụm nếu bạn không phải là bạn 'ra ngoài. Nếu bạn đang giữ khóa bạn là người lãnh đạo và nếu bạn không phải của bạn. Vấn đề với phương pháp này là bạn cần tài nguyên được chia sẻ đó.

Cách khác để ngăn chặn bộ não bị chia rẽ là đa số, nếu bạn có đủ số phiếu bầu bạn là người lãnh đạo. Điều này vẫn hoạt động với hai nút (cho một số đại biểu là 3), nơi người lãnh đạo nói rằng đó là người lãnh đạo và nút còn lại hoạt động như một "nhân chứng" cũng đồng ý. Phương pháp này là thích hợp hơn vì nó có thể làm việc trong một kiến ​​trúc không chia sẻ và thực sự đó là những gì Zookeeper sử dụng

Như Michael đã đề cập, một nút không thể biết lý do nó không nhìn thấy các nút khác trong cụm là vì các nút này đang xuống hoặc có vấn đề về mạng - đặt cược an toàn là nói không có số đại biểu.

0

Hãy xem ví dụ cho thấy mọi thứ có thể xảy ra như thế nào nếu nhóm đại biểu (phần lớn các máy chủ đang chạy) quá nhỏ.

Giả sử chúng tôi có năm máy chủ và số đại biểu có thể là bất kỳ bộ nào của hai máy chủ. Bây giờ nói rằng các máy chủ s1 và s2 thừa nhận rằng chúng đã sao chép một yêu cầu để tạo ra một znode/z. Dịch vụ trả về cho máy khách nói rằng znode đã được tạo. Bây giờ giả sử các máy chủ s1 và s2 được phân tách ra khỏi các máy chủ khác và từ máy khách trong một thời gian dài tùy ý, trước khi chúng có cơ hội tái tạo mã znode mới cho các máy chủ khác. Dịch vụ ở trạng thái này có thể tiến bộ vì có ba máy chủ sẵn có và nó thực sự chỉ cần hai máy chủ theo các giả định của chúng tôi, nhưng ba máy chủ này chưa bao giờ thấy znode/z mới.Do đó, yêu cầu tạo/z không bền.

Đây là ví dụ về kịch bản bộ não phân tách. Để tránh vấn đề này, trong ví dụ này kích thước của nhóm túc số phải ít nhất là ba, đó là phần lớn trong số năm máy chủ trong bộ quần áo. Để tiến bộ, bộ quần áo cần ít nhất ba máy chủ có sẵn. Để xác nhận rằng yêu cầu cập nhật trạng thái đã hoàn tất thành công, bộ quần áo này cũng yêu cầu ít nhất ba máy chủ thừa nhận rằng họ đã sao chép nó.