2013-04-17 1 views
7

저는 왜 ZooKeeper가 앙상블에서 대다수의 기계를 필요로하는지 궁금해했습니다. 우리가 A, B, C의 3 가지 기계로 구성된 매우 간단한 앙상블을 가지고 있다고 가정 해 보겠습니다.ZooKeeper를 실행할 필요가있는 이유는 무엇입니까?

A가 실패하면 새로운 리더가 선출됩니다. 모든 것이 작동합니다. 다른 사람이 죽으면 B라고 말하면 서비스를 이용할 수 없습니다. 그것은 의미가 있습니까? A와 B가 다시 가동 될 때까지는 기계 C가 모든 것을 혼자 처리 할 수없는 이유는 무엇입니까? 하나 개의 시스템 이후

는 사육사가이 방법으로 설계 왜 특별한 이유가 있나요 (예 : 단일 기계 앙상블 잘 작동) 모든 일을하기에 충분? ZooKeeper를 구성하는 방법이 있습니까? 예를 들어 앙상블은 N 중 적어도 하나가 작동 중일 때 항상 사용할 수 있습니까?

편집 : 아마도 리더 선택의 맞춤 알고리즘을 적용 할 수있는 방법이 있습니까? 또는 쿼럼의 크기를 정의합니까? 사전에

감사합니다.

+0

리더 선택의 현재 알고리즘을 변경하는 방법을 찾았습니까? 나는 또한 기본적으로 동일한 위치에있는 자신을 찾기 위해 단일 실패의 위험을 제거하기로되어있는 3 대의 기계에 대해 200K를 지불하는 것을 좌절시키는 것으로 나타났습니다. – dcg

+0

@dcg 아니, 시도조차하지 않았습니다. 해결 방법을 찾으려면 내 질문에 대한 대답을 읽은 후에 나는 ZooKeeper의 접근법을 이해했기 때문에 매우 논리적 인 것처럼 보입니다. –

답변

7

사육사는 사물을 안정적으로 배포하기위한 것입니다. 시스템 네트워크가 세그먼트 화되면 두 개의 반쪽이 독립적으로 작동하고 잠재적으로 동기화되지 않게되기를 원하지 않습니다. 왜냐하면 장애가 해결되면이를 수행 할 수 없기 때문입니다. 과반수가 넘었을 때 운영을 거절하면 장애가 해결되면 더 이상의 개입없이 모든 것이 즉시 백업 될 것입니다.

+1

예를 들어, 나는 시스템의 세분화가 없다 - 3 개의 노드 중 2 개만 작동하지 않는다. 어떤 노드를 죽이면 시스템이 2/3/n으로 한 번 더 작게 분할된다는 것을 의미하지는 않습니다. 노드가 적은 동일한 시스템입니다. 모든 노드가있는 경우에만 시스템이 종료되어야합니다. 단일 노드조차도 클라이언트의 읽기/쓰기 요청을 처리 할 수 ​​있어야합니다 (백그라운드 일 경우 다른 노드에 다시 연결을 시도해야합니다). 작업 노드의 50 %를 가진 ZooKeeper 서비스가 중단 될 것입니다. 100 대의 기계가 있다면 모든 것을 처리 할 수있는 노드가 여전히 50 개가되지만 시스템을 사용할 수는 없습니다. –

+1

"kill"이라는 단어를 "isolate"로 바꾸면 네트워크에 장애가 발생하더라도 (컴퓨터는 계속 실행 중임) 대다수의 일부가 아닌 것으로 판단되는 노드는 논리적으로 오프라인 상태입니다. 네트워크 장애는 머신 셧다운과 비교할 때보다 현실적인 시나리오입니다. – slebetman

+3

@ MichałSzkudlarek - 실종 된 노드가 완전히 망가 졌거나 네트워크 장애로 인해 액세스 할 수 없다면 사육사 노드는 알지 못합니다. 그래서 그들은 무엇이 잘못 되었든 문제가 생기지 않도록 네트워크 장애가있는 것처럼 행동합니다. –

6

대다수 표를 얻는 이유는 "split-brain"이라는 문제를 피하기 위해서입니다.

기본적으로 네트워크 오류가 발생하면 시스템의 두 부분을 평상시처럼 계속 사용하지 마십시오. 하나는 계속하고 다른 하나는 클러스터의 일부가 아니라는 것을 이해해야합니다.

공유 자원을 보유하는 것이 주된 두 가지 방법입니다 (예 : 리더가 잠금을 보유한 공유 디스크). 클러스터의 일부인 잠금 장치를 볼 수있는 경우 다시 나가. 당신이 자물쇠를 잡고 있다면 당신은 리더이고 그렇지 않다면 당신은 리더가 아닙니다. 이 방법의 문제점은 공유 리소스가 필요하다는 것입니다.

분할 뇌를 방지하는 다른 방법은 다수 카운트입니다. 충분한 투표 수를 얻으면 리더가됩니다. 이것은 여전히 ​​지도자가 지도자라고 말하고 "증인"역할을하는 다른 노드도 동의하는 두 노드 (3의 정족수)와 함께 작동합니다. 이 방법은 shared nothing 아키텍쳐에서 작동 할 수 있고 사육사가 사용하는 것이기 때문에 바람직합니다.

마이클이 언급했듯이, 노드는 클러스터의 다른 노드를 볼 수없는 이유를 알 수 없습니다. 네트워크 문제가 있습니다. 확실한 방법은 쿼럼이 없다는 것입니다.

0

쿼럼 (실행중인 서버의 대부분)이 너무 작은 경우 상황이 어떻게 잘못 될 수 있는지 보여주는 예제를 살펴 보겠습니다.

다섯 개의 서버가 있고 쿼럼은 두 개의 서버로 구성 될 수 있습니다. 이제 서버 s1과 s2가 znode/z를 생성하라는 요청을 복제했다는 것을 확인했다고 가정 해보십시오. 서비스는 znode가 작성되었다는 클라이언트에 리턴합니다. 이제 새로운 서버를 다른 서버에 복제 할 수있는 기회를 갖기 전에 서버 s1과 s2가 다른 서버 및 클라이언트에서 임의로 분할되어 있다고 가정합니다. 이 상태의 서비스는 사용할 수있는 서버가 세 개인 것으로 가정하기 때문에 실제로는 두 개만 필요하지만이 세 서버는 새로운 znode/z를 본 적이 없기 때문에이 상태의 서비스를 진행할 수 있습니다.따라서/z 생성 요청은 내구성이 없습니다.

이것은 두뇌 시나리오의 예입니다. 이 문제를 피하려면이 예제에서 쿼럼의 크기는 적어도 3 개 여야합니다.이 크기는 앙상블에있는 5 개의 서버 중 대다수입니다. 진행을 위해 앙상블에는 적어도 세 대의 서버가 필요합니다. 상태 업데이트 요청이 성공적으로 완료되었음을 확인하기 위해이 앙상블에서는 적어도 세 대의 서버가 복제를 승인했음을 확인해야합니다.