본문 바로가기

Etc/Zookeeper

Apache zookeeper란?

 

Apache zookeeper 공식 문서에 나와있는 zookeeper의 정의는 "분산 어플리케이션을 위한 분산 코디네이션 서비스"이다.

ZooKeeper: A Distributed Coordination Service for Distributed Applications

 분산 어플리케이션을 위한 분산 코디네이션 서비스.. 이 단어 모음을 보고 한 번에 이해가 간다면 당신은 이미 서버 아키텍처에 대해 상당한 이해를 갖고 있는 거라고 생각한다.

 

분산 어플리케이션이 뭔지도 잘 모르겠는데, 이를 코디네이션 하는 서비스..?

차차 알아가 보자...

 

1. 분산 시스템이란? 

 주키퍼를 통해 관리한다는 분산 어플리케이션(정확한 의미를 위해 분산 시스템이라고 하겠다)이란 말 그대로 하나의 시스템이 여러 서버에 분산되어 있는 것이다. 여러 서버에 분산된 시스템들이 유기적으로 동작하며 마치 하나의 시스템처럼 작동하는 것이며 곧 클러스터링을 통해 분산 시스템이 구현되는 것이다.

 

 그렇다면 하나의 서버에서만 시스템을 동작하면 되지 왜 클러스터링을 통해 분산 시스템을 구축해야 할까? 분산 시스템을 사용해서 얻을 수 있는 이점은 크게 다음 두 가지가 있다.

 

1. 고가용성 (HA)

2. 확장성 (Scascalability)

 

 잘 설계되고 동작하는 분산 시스템은 곧 고가용성과 확장성을 만족하며, 고가용성이란 쉽게 말해 시스템이 고장 나지 않는다는 것을 보장한다는 뜻이며, 확장성은 시스템을 확장하기 용이하다는 뜻이다. 시스템을 확장하기 용이하다면 (물리적인 서버를 늘리는 것을 의미) 시스템 전체에서 사용할 수 있는 리소스는 늘어나고 그만큼 고 성능의 시스템을 구축할 수 있으며 시스템 성능을 높이기 용이하다는 뜻이다.

 

2. 주키퍼의 필요성

 분산 시스템을 통해 시스템의 고가용성과 확장성을 얻을 수 있었다. 이런 이점을 얻기 위해 필요한 점이 무엇일까? 바로 앞서 말했던 하나의 시스템이 여러 서버에 분산되어 실행되며, 이 분산된 시스템(프로세스)이 마치 하나의 시스템처럼 동작하기 때문에 이러한 이점을 얻을 수 있었다.

 

 여러 서버에 분산된 시스템이 하나의 시스템처럼! 유기적으로! 동작하기 위해서 우리는 이 분산된 시스템을 조율해줄 무언가가 필요하고 이 조율해주는 것이 바로 Zookeeper이다.

 

3. Zookeeper

Zookeeper란 "분산 시스템을 위한 분산 코디네이션 시스템"이다. Zookeepr의 특징을 보면서 조금 더 이해 해보자.

 

1. Zookeeper 또한 분산되어있다. (Replicated)

 

 

 Zookeeper도 분산 시스템처럼 Zookeeper도 자체적으로 분산되어있다. 쉽게 말해 여러 호스트(서버)에 주키퍼가 설치되며 이 묶음이 하나의 분산 코디네이션 시스템으로 동작한다. 이러한 주키퍼가 설치된 호스트의 묶음을 주키퍼 앙상블이라고 한다. Zookeeper를 구성하는 모든 호스트들은 서로에 대해 알고있는데, 이는 각각의 호스트가 정보를 공유하고 있다는 뜻이다. Zookeeper 또한 분산되어 있기 때문에, Zookeeper를 구성하는 서버중 과반수 이상만 살아있어도, Zookeeper는 정상적으로 동작하는것을 보장한다.

 

 Zookeeper 또한 분산되어 있는 이유는, Zookeeper(코디네이션 서비스)는 분산 시스템 내에서 사용하는 시스템의 중요한 상태 나 설정 정보들을 관리하기 때문에, 코디네이션 서비스의 장애는 곧 분산시스템 전체의 장애를 유발하기 때문이다. 따라서 Zookeeper또한 고가용성을 제공해야 한다.

 

2. Zookeeper 앙상블에서 공유하는 데이터 구조

Zookeeper's Hierarchical Namespace (zNode)

 Zookeeper는 분산된 시스템을 조율하기 위해, Zookeeper 앙상블에서 공유하는 데이터 구조를 제공한다. 이 데이터 구조는 일반적인 Linux의 파일 시스템과 동일한(계층적인) 구조를 갖고 있다. 다만 Zookeeper는 이를 디스크가 아닌 메모리에 보관하며 당연히 파일 시스템보다 높은 처리량과 낮은 latency를 갖게 된다.

 

 계층을 구성하는 하나의 데이터는 zNode라는 이름으로 불리며, 파일시스템과 다른점으로는 Znode는 파일이며 디렉토리가 될 수 있다는 점이다. 위 그림에서 /app1, /app1/p_1, /app2는 각각 zNode이다. (zNode는 코디네이션 데이터를 저장하도록 설계되었으며, 상태정보, 설정, 호스트의 위치정보 등을 저장한다. 일반적으로 zNode에 저장되는 데이터의 크기는 작다. byte ~ KB)

 

  zNode는 데이터를 저장할 때, 데이터 뿐만 아니라 버전정보까지 함께 저장한다. 즉 zNode의 데이터가 업데이트 되면 버전넘버 또한 증가하는 방식으로 동작한다.

 

 zNode의 Read/Write 연산은 원자적(Atomically)이다. 이말은 zNode에서 데이터를 읽을 때는 zNode의 모든 데이터를 읽어오고, 쓸 때는 모든 데이터를 덮어쓴다는 의미이다. 즉 zNode에 써있는 데이터의 일부분만 수정할 수 없다. (일부분만 수정한다면 일부분만 수정한 데이터를 덮어씌우는 것)

 

마지막으로 zNode는 여러가지 타입이 존재한다.

 

1. Persistent Node

- Node에 데이터를 저장하면, 삭제하지 않는 이상 영구적으로 보존되는 Node

 

2. Ephemeral Node

- Node를 생성한 클라이언트와 세션이 유지되는 경우에만 유효한 Node

- 클라이언트와 연결이 끊어지는 순간 삭제된다

 

3. Sequence Node

- 노드를 생성할 때, 자동으로 Sequence Number가 붙는 Node

- Sequence Node는 Persistent Node, Ephemeral Node와 함께 사용할 수 있다.

 

3. Watches

 Zookeeper는 Watch라는 기능을 제공한다. Zookeeper를 사용하는 Client는 zNode에 Watch를 설정할 수 있는데, zNode에 Watch를 설정하게 되면, zNode가 변경되었을 때, Watch를 설정한 Client에게 알람을 준다. 한번 알람을 받으면 Watch는 삭제되고, 다시 설정해야 한다. (3.6 버전 부터 삭제되지 않는 Watch를 설정할 수 있다)

 

 


 

Summary

Zookeeper : 분산시스템을 위한 분산 코디네이션 시스템.. 말은 거창하지만 사실 기능을 살펴보면 분산된 시스템 사이에 데이터를 공유하는 Namespace 제공하고, 여기에 데이터를 넣었다 뺐다 하는 정도의 기능만을 제공한다. 실제 Zookeeper에서 제공하는 API는 다음과 같다. 모두 zNode와 관련된 API 이다.

  • Create : Create a node a a location in the tree
  • Delete : deletes a node
  • Exist : test if a node exists at a location
  • Get Data : reads the data from a node
  • Set Data : writes data to a node
  • Get Children : retrieves a list of children of a node
  • Sync : waits for data to be propagated

Zookeeper에 대해 간략하게 훒어보았다. 자세한 내용은 Zookeeper 공식문서에서 더 공부해보면 좋을 듯 하다.

: zookeeper.apache.org/doc/current/zookeeperOver.html#zkComponents