본문 바로가기
데이터베이스

[데이터베이스] 주키퍼 (zookeeper)란?

by xangmin 2022. 4. 20.
반응형

 분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트로 직접 어플리케이션 작업을 조율하는 것을 쉽게 개발할 수 있도록 도와주는 도구이다. API를 이용해 동기화나 마스터 선출 등의 작업을 쉽게 구현할 수 있게 해준다.

 

기본적으로 복수 개의 주키퍼 서버의 집합인 Ensemble로 구성된다. Ensemble은 leader-follower 구조를 사용하며, Leader가 Follower에게 동기화를 위한 명령을 내리게 된다.

 

 각 어플리케이션의 정보를 중앙 집중화하고 구성관리, 그룹 관리 네이밍, 동기화 등의 서비스를 제공한다. 주키퍼의 데이터는 메모리에 저장되고, 영구 저장소에 스냅샷을 저장한다.

 

분산 코디네이션 서비스란?

 - 분산 시스템에서 시스템 간의 정보 공유, 상태 체크, 서버들 간의 동기화를 위한 락 등을 처리해주는 서비스

출처: https://ssup2.github.io/theory_analysis/ZooKeeper/

 주키퍼는 분산 시스템의 일부분이기 때문에 동작을 멈춘다면 분산 시스템이 멈출수도 있다. 그래서 안정성을 확보하기 위해 클러스터로 구축한다. 클러스터는 홀수로 구축한다. 어떤 서버에 문제가 생겼을 경우 과반수 이상의 데이터를 기준으로 일관성을 맞추기 때문이다. 살아있는 노드가 과반수 이상이라면 지속적인 서비스를 제공한다. (위의 그림에서 Server는 주키퍼, Client는 카프카가 된다.) 서버 여러 대를 앙상블(클러스터)로 구성하고, 분산 어플리케이션들이 각각 클라이언트가 되어 주키퍼 서버들과 커넥션을 맺은 후 상태 정보 등을 주고 받는다.

 

 상태 정보들은 주키퍼의 지노드(znode)라고 불리는 곳에 Key-Value 형태로 저장하며, 지노드에 저장된 것을 이용하여 분산 어플리케이션들은 서로 데이터를 주고받게 된다. (znode를 일반 컴퓨터의 파일이나 폴더 개념으로 생각하면 쉬움)
지노드(znode)는 우리가 알고 있는 일반적인 디렉토리와 비슷한 형태로서 자식노드를 가지고 있는 계층형 구조로 구성되어 있다.

 

구성

 1. Request Processor : Write 요청 처리

 2. Zab (Zookeeper Atomic Broadcast Protocol) : Request Processor에서 처리한 요청을 트랜잭션을 생성하여 모든 서버에게 전파한다. [Leader-Propose] -> [Follower-Accept] -> [Leader-Commit] 단계로 구성된다.

 3. In-memory DB : Znode의 정보가 저장되며, 로컬 파일시스템에 Replication을 구성할 수 있다.

 

Znode란?

출처: https://ssup2.github.io/theory_analysis/ZooKeeper/

주키퍼가 상태 성보를 저장하는 곳

 

분류

- Persistent Node : 영구 저장소

- Ephermeral Node : Client가 종료되면 사라진다.

- Sequence Node: 생성 시 뒤에 숫자가 붙는다.

 

Quorum

Leader가 새로운 트랜잭션을 수행하기 위해서는 자신을 포함하여 과반수 이상의 서버의 합의를 얻어야 한다. 과반수의 합의를 위해 필요한 서버들을 Quorum이라고 한다. Ensemble을 구성하는 서버의 수가 5개라면, Quorum은 3개의 서버로 구성이 된다.

 

트랜잭션 처리

1. Leader에게 Request 전달

새로운 트랜잭션 요청이 Follower에게 도착하였을 경우, Follower는 Leader에게 요청을 전달한다.

 

2. Propose

Propose는 Leader가 Quorum을 구성하는 서버들에게 트랙잭션을 수행해도 되는지 여부를 요청하는 과정을 의미한다.

 

3. Ack

Quorum을 구성하는 서버들은 Leader로 부터 Propose 요청을 받으면, 트랙잭션을 수행해도 된다는 Ack 응답을 Leader에게 전송한다.

 

4. Commit

모든 Quorum으로 부터 Ack를 받으면, Leader는 트랙잭션을 처리하라는 Commit 명령을 broadcast 형태로 모든 Follower에 전파한다. ZooKeeper에서는 Commit 명령을 전달할 때, ZAB(ZooKeeper Atomic Broadcast) 알고리즘을 사용한다. Atomic Broadcast는 broacast 방식 중 하나로, 멀티 프로세스 시스템에서 모든 프로세스에게 동일한 순서로 메시지가 전달된다는 것을 의미한다.

 

Watcher

ZooKeeper는 znode에 변화를 감지할 수 있는 Watcher를 클라이언트가 설정할 수 있도록 한다. Watcher는 자신이 감시하고 있는 znode에 수정이 발생하였을 때, 클라이언트로 callback 호출을 전송하는 알림 기능을 제공한다.

  1. 주키퍼를 사용하는 클라이언트 A가 ZooKeeper에게 Watcher 등록을 요청한다.
  2. 주키퍼를 사용하는 클라이언트 B가 ZooKeeper에게 Znode를 수정한다고 말한다.
  3. 클라이언트 A에게 변경 이벤트를 전달한다.

 

주키퍼를 짝수로 구성한 경우 생기는 문제점?

크게 문제는 없으나, 짝수로 구성한 경우 쿼럼을 형성할 때 비례적으로 노드 수가 더 필요하므로 잘 사용되지 않는다.

 

4대로 구성한 경우

- 쿼럼을 형성하는데에 3대가 필요하다.

 

5대로 구성한 경우

- 쿼럼을 형성하는데에 3대가 필요하다.

 

------

 

6대로 구성한 경우

  1. 두 서버에 문제가 생겼으면 4대가 동작하는데 과반수 이상이기 때문에 지속적으로 동작한다.
  2. 세 서버에 문제가 생겼으면 3대가 동작하는데 과반수 이상이 아니므로 동작을 멈춘다.

5대로 구성한 경우

  1. 두 서버에 문제가 생겼으면 3대가 동작하는데 과반수 이상이기 때문에 지속적으로 동작한다.
  2. 세 서버에 문제가 생겼으면 2대가 동작하는데 과반수 이상이 아니므로 동작을 멈춘다.

 

쿼럼(Quorum)

단어 뜻

- 합의체가 의사를 진행시키거나 의결을 하는 데 필요한 최소한도의 인원수

 

주키퍼에서의 뜻

- 주키퍼 앙상블을 이루고 있는 모든 서버 중 과반수 서버로 이루어진 그룹을 말한다. 

- 5대의 앙상블일 때 정상적인 서버 3대를 쿼럼이라고 한다.

- 쿼럼은 한 서버에서 일어난 변경이 앙상블 내의 다른 서버로 전파되어 복제될 때, 복제가 이용가능한 수준까지 이루어졌다는 최소 기준이다.

 

스플릿브레인(Split-brain)

- 시스템의 두 부분 이상이 일관되지 않게 동작하는 것

 

쿼럼이 5개 중 2개일 때 시나리오

  1. 사용자가 주키퍼에게 쓰기 작업을 요청한다. 주키퍼가 쿼럼에게 쓰기 작업을 복제한다.
  2. 1번과 2번 서버가 znode의 쓰기 작업을 완료했다고 리더에게 응답한다.
  3. 주키퍼 서비스가 클라이언트에게 알린다.
  4. 1번과 2번 서버에 문제가 발생했다고 가정한다. 1번과 2번 서버에 적용된 내용이 사라진다. 문제가 발생하더라도 과반수 이상이 살아있기 때문에 계속 동작한다.
  5. 아직 살아있는 서버 2개로 새로운 쿼럼을 구성한다.
  6. 주키퍼 서비스는 정상적으로 동작하지만 일관성이 깨진다.

쿼럼이 5개 중 3개일 때 시나리오

  1. 사용자가 주키퍼에게 쓰기 작업을 요청한다. 주키퍼가 쿼럼에게 쓰기 작업을 복제한다.
  2. 쓰기 작업을 3대로 복제한다.
  3. 3대에 장애가 발생한 경우 서비스를 중단하고, 2대에 장애가 발생한 경우 지속한다.
  4. 쿼럼으로 구성되었던 서버 1대와 쿼럼에 포함되지 않았던 2대로 새로운 쿼럼을 구성한다.
  5. 쿼럼으로 구성되었던 서버 1대의 작업을 다른 서버들에게 복제한다.
  6. 쓰기 요청을 유실하지 않고 계속 사용할 수 있다.

 

카프카에서 주키퍼는?

- 서버의 상태를 감지하기 위해 사용되며 새로운 토픽이 생성되었을 때, 토픽의 생성과 소비에 대한 상태를 저장한다.

주키퍼와 카프카는대규모 환경에서는 다른 서버에 두는 편이 좋다. 주키퍼 앙상블은 홀수로 구성되어 과반수 이상이 장애가 발생하면 중단되고, 카프카는 그렇지 않아도 되기 때문에 다른 서버에 두는 것을 권장한다.



출처: https://data-engineer-tech.tistory.com/4 

출처 : https://velog.io/@koo8624/%EB%B6%84%EC%82%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C-Apache-Zookeeper

반응형

댓글