Ignite의 기본 TCP / IP Discovery는 클러스터 노드를 장점과 단점이있는 링 토폴로지로 구성합니다. 예를 들어, 수백 개의 클러스터 노드가있는 토폴로지에서 시스템 메시지가 모든 노드를 통과하는 데 몇 초가 걸릴 수 있습니다. 결과적으로 새 노드 결합 또는 실패한 노드 감지와 같은 이벤트의 기본 처리는 전체 클러스터 응답 및 성능에 영향을 미칠 수 있습니다.
ZooKeeper Discovery는 확장 성과 선형 성능을 유지해야하는 대규모 배포를 위해 설계되었습니다. 그러나 Ignite와 ZooKeeper를 모두 사용하려면 두 개의 분산 시스템을 구성하고 관리해야하므로 어려울 수 있습니다. 따라서 100 초 또는 1000 초 노드로 확장하려는 경우에만 ZooKeeper Discovery를 사용하는 것이 좋습니다. 그렇지 않으면 TCP / IP Discovery 를 사용하는 것이 가장 좋습니다 .
ZooKeeper Discovery는 ZooKeeper를 단일 동기화 지점으로 사용하고 ZooKeeper 클러스터가 중앙에 있고 Ignite 노드가이를 통해 검색 이벤트를 교환하는 별 모양의 토폴로지로 클러스터를 구성합니다.
ZooKeeper Discovery는 Discovery SPI의 대체 구현이며 통신 SPI에 영향을 미치지 않는다는 점을 언급 할 가치가 있습니다. 노드가 ZooKeeper Discovery를 통해 서로를 발견하면 P2P 통신을 위해 통신 SPI를 사용합니다.
구성
ZooKeeper Discovery를 활성화하려면 다음 ZookeeperDiscoverySpi과 유사한 방식 으로 구성해야합니다 .
다음 매개 변수가 필요합니다 (다른 매개 변수는 선택 사항).
-
zkConnectionString -ZooKeeper 서버의 주소 목록을 유지합니다.
-
sessionTimeout -Discovery SPI를 통해 교환 된 이벤트에 반응하지 않는 경우 Ignite 노드가 연결 해제 된 것으로 간주되는 시간을 지정합니다.
실패 및 분할 브레인 처리
네트워크 파티셔닝의 경우 일부 노드는 분리 된 네트워크 세그먼트에 있기 때문에 서로 통신 할 수 없습니다. 이로 인해 사용자 요청을 처리하지 못하거나 데이터 수정이 일관되지 않을 수 있습니다.
ZooKeeper Discovery는 다음과 같은 방식으로 개별 노드 간의 네트워크 파티셔닝 (일명 분할 브레인) 및 통신 실패에 접근합니다.
ZooKeeper 클러스터는 항상 클러스터의 모든 노드에서 볼 수 있다고 가정합니다. 실제로 노드가 ZooKeeper에서 연결이 끊어지면 종료되고 다른 노드는 실패하거나 연결이 끊어진 것으로 간주합니다. |
노드가 클러스터의 다른 노드 중 일부에 연결할 수 없음을 발견 할 때마다 ZooKeeper 클러스터에 특별 요청을 게시하여 통신 실패 해결 프로세스를 시작합니다. 프로세스가 시작되면 모든 노드가 서로 연결을 시도하고 연결 시도 결과를 프로세스를 조정하는 노드 ( 코디네이터 노드 )로 보냅니다 . 이 정보를 기반으로 코디네이터 노드는 클러스터의 네트워크 상황을 나타내는 연결 그래프를 생성합니다. 추가 조치는 네트워크 분할 유형에 따라 다릅니다. 다음 섹션에서는 가능한 시나리오에 대해 설명합니다.
클러스터는 여러 개의 분리 된 구성 요소로 분할됩니다.
클러스터가 여러 개의 독립적 인 구성 요소로 분할 된 경우 각 구성 요소 (클러스터)는 자신을 마스터 클러스터로 인식하고 계속해서 사용자 요청을 처리하여 데이터 불일치를 초래할 수 있습니다. 이를 방지하기 위해 노드 수가 가장 많은 구성 요소 만 활성 상태로 유지됩니다. 다른 구성 요소의 노드가 다운됩니다.
가장 큰 구성 요소가 여러 개있는 경우 클라이언트 수가 가장 많은 구성 요소는 활성 상태로 유지되고 다른 구성 요소는 종료됩니다.
노드 간의 여러 링크가 누락되었습니다.
일부 노드는 일부 다른 노드에 연결할 수 없습니다. 즉, 노드가 클러스터에서 완전히 분리되지는 않았지만 일부 노드와 데이터를 교환 할 수 없으므로 클러스터의 일부가 될 수 없습니다. 아래 이미지에서 한 노드는 다른 두 노드에 연결할 수 없습니다.
이 경우 작업은 모든 노드가 다른 모든 노드에 연결할 수있는 가장 큰 구성 요소를 찾는 것입니다. 일반적으로 어려운 문제이며 허용 가능한 시간 내에 해결할 수 없습니다. 코디네이터 노드는 휴리스틱 알고리즘을 사용하여 최적의 근사 솔루션을 찾습니다. 솔루션에서 제외 된 노드는 종료됩니다.
ZooKeeper 클러스터 분할
ZooKeeper 클러스터가 여러 데이터 센터 및 지리적으로 다양한 위치에 걸쳐있을 수있는 대규모 배포에서는 네트워크 세분화로 인해 여러 세그먼트로 분할 될 수 있습니다. 이 경우 ZooKeeper는 모든 ZooKeeper 노드의 절반 이상을 포함하는 세그먼트가 있는지 확인하고 (ZooKeeper는 작업을 계속하려면이 많은 노드가 필요함), 발견되면이 세그먼트가 Ignite 클러스터를 관리하고 다른 세그먼트 종료됩니다. 그러한 세그먼트가 없으면 ZooKeeper는 모든 노드를 종료합니다.
ZooKeeper 클러스터 분할의 경우 Ignite 클러스터가 분할되거나 분할되지 않을 수 있습니다. 어쨌든 ZooKeeper 노드가 종료되면 해당 Ignite 노드는 사용 가능한 ZooKeeper 노드에 연결을 시도하고 연결이 불가능하면 종료합니다.
다음 이미지는 Ignite 클러스터와 ZooKeeper 클러스터를 두 세그먼트로 분할하는 네트워크 분할의 예입니다. 이는 클러스터가 두 개의 데이터 센터에 배포 된 경우 발생할 수 있습니다. 이 경우 데이터 센터 B에있는 ZooKeeper 노드가 자동으로 종료됩니다. 데이터 센터 B에있는 Ignite 노드는 나머지 ZooKeeper 노드에 연결할 수 없으며 스스로 종료 할 수도 없습니다.