개발자의 오르막

Zookeeper 와 분산시스템 본문

Server/Zookeeper

Zookeeper 와 분산시스템

계단 2022. 9. 16. 16:21

Keyword


zookeeper , 분산시스템

 

https://d2.naver.com/helloworld/206816

 

 

Overview


모든 서비스의 기능에는 부하가 골고루 분배되지 않고, 특정 기능에 집중되기 마련이다. 대용량의 부하에 대비하기 위해서는 서비스의 기능을 작업 단위로 분배하여 서버로 나눈다. 그 중 집중되는 기능은 여러 컴퓨터가 일을 같이하는 방법이 있는데, 이를 분산 시스템이라 한다.

하나의 일을 여러 컴퓨터가 나눠서 작업을 하여, 마치 하나의 컴퓨터가 작업한 것처럼 이루어지려면 해당 일에 대한 분배와 상태 공유가 원활히 이루어져야 할 것이다.

이를 알기 위해 먼저 분산 시스템에 대해 알아보자.

 

 

 

분산 시스템


 

💡 분산 시스템이란, 네트워크로 연결된 여러 대의 컴퓨터에 하나의 프로그램이 분산되어 실행되면서, 마치 하나의 프로그램처럼 움직이는 시스템

 

 

  • 분산 시스템에서의 쟁점
    • 분산된 서비스를 어떻게 공유할 것인지
    • 클러스터에 있는 서버들의 상태를 체크할 필요가 있음
    • 분산된 서비스들간에 동기화를 위한 락(lock)을 처리하는 것
  • 위의 쟁점을 해결하는 시스템을 코디네이션 서비스 시스템이라 하며 ZooKeeper 가 대표적이다.
  • 코디네이션 서비스 시스템은 분산 시스템 내의 중요한 상태 정보나 설정 정보 등을 유지하기 때문에, 코디네이션 서비스의 장애는 전체 시스템의 장애를 유발한다.
  • 따라서 코디네이션 서비스는 이중화를 통하여 고가용성을 제공해야 한다.
  • 또한 데이터 엑세스가 빨라야 하며, 자체적으로 장애에 대한 대응성을 가져야 한다.

 

 

Zookeeper 는 Apache 재단의 프로젝트이다. Apache 재단은 프로젝트에 관례적으로 동물 이름을 사용하는데, Zookeeper 는 사육사의 의미이다. 즉, 어떤 분산된 시스템이 일을 하고 있는지, 상태에 대한 공유와 분산된 서비스들간의 일의 충돌이 일어나지 않도록 방지하는 관리의 일을 맡고 있다고 볼 수 있다.

 

 

https://ko.wikipedia.org/wiki/아파치_주키퍼

 

 

Zookeeper


 

https://junb51.tistory.com/5?category=911463

 

 

주키퍼는 서버 여러 대를 앙상블(클러스터) 로 구성하고, 분산 애플리케이션들이 각각 클라이언트가 되어 주키퍼 서버들과 커넥션을 맺은 후 상태 정보 등을 주고 받는다.

 

 

  • 분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트로 직접 어플리케이션 작업을 조율하는 것을 쉽게 개발할 수 있도록 도와주는 도구
  • API 를 이용해 동기화나 마스터 선출 등의 작업을 쉽게 구현할 수 있게 해준다.
  • 기본적으로 복수 개의 주키퍼 서버의 집합인 Ensemble 로 구성됨
    • Ensemble 은 leader-follower 구조를 사용하며, Leader 가 Follower에게 동기화를 위한 명령을 내림
  • 각 어플리케이션의 정보를 중앙 집중화하고 구성관리, 그룹 관리 네이밍, 동기화 등의 서비스를 제공
  • 주키퍼의 데이터는 메모리에 저장되고, 영구 저장소에 스냅샷을 저장함
  • ZooKeeper 는 자체적으로 클러스터링을 제공하며, 장애에도 데이터 유실 없이 fail over/fail back 이 가능하다.
  • 디렉토리 구조기반으로 znode 라는 데이터 저장 객체를 제공(key-value)하고, 객체에 데이터를 넣고 빼는 기능만을 제공한다.
  • 디렉터리 형식을 사용하기 때문에 데이터를 계층화된 구조로 저장하기 용이하다.

 

 

 

 

데이터 모델

 


 

  • 주키퍼는 내부적으로 데이터를 znode 라 불리는 노드에 계층적 트리 형태로 관리한다.
  • znode 경로는 ‘/’ 로 구분된 유니코드 문자열 namespace 구조로 유닉스의 파일시스템 구조와 같다. 상대경로를 지원하지 않고 절대 경로만 지원한다.
  • 데이터 접근은 원자성(성공 또는 실패)를 가진다. 클라이언트가 znode에 저장된 데이터를 읽을 때 데이터 전체가 전달되지 않으면 읽기는 실패한다. 쓰기도 마찬가지로 전체를 갱신한다. 즉 append 기능을 지원하지 않는다.
  • 노드의 종류
    • Persistent Node : 노드에 데이터를 저장하면 일부러 삭제하지 않는 이상 삭제되지 않고 영구히 저장
    • Ephemeral Node : 노드를 생성한 클라이언트의 세션이 연결되어 있을 경우만 유효하다. 즉 클라이언트 연결이 끊어지는 순간 삭제된다. 이를 통해 클라이언트가 연결되어 있는지 아닌지를 판단하는데 사용할 수 있다.
      • 클러스터를 구성할 때 클러스터내에 서버가 들어오면 이 Ephemeral Node 로 등록하면 된다.
    • Sequence Node : 노드를 생성할 때 자동으로 Sequence 번호가 붙는 노드이다. 주로 분산락을 구현하는데 이용한다.
  • Watcher : ZooKeeper 클라이언트가 특정 znode 에 watch 를 걸어놓으면, 해당 znode 가 변경이 되었을 때, 클라이언트로 callback 호출을 날려 클라이언트에 해당 znode 가 변경이 되었음을 알려준다. 그리고 해당 watcher 는 삭제된다.

 

 

 

 

 

 

 

Reference


Comments