[Kafka] 카프카 클러스터와 주키퍼(zookeeper)

Posted by 김성철

카프카 - 카프카 클러스터와 주키퍼(Zookeeper)

카프카 클러스터

- 브로커들을 하나의 클러스터로 관리  
- 브로커, 즉 카프카 서버들의 집함  

Zookeeper란

- 분산 애플리케이션을 위한 코디네이션 시스템  
- Kafka에도 사용되고 Nifi , Hbase , Hadoop 등에서도 사용됨  
- 분산 시스템에서 발생 가능한 여러 문제들을 핸들링함  
	* 시스템에서 정보를 어떻게 공유할 것인지  
	* 상태를 어떻게 체크할 것인지  
	* 분산 서버들간의 잠금을 처리하는 방법에 대한 핸들링  
- 부분 실패를 안전하게 처리하기 위한 분산 처리 도구  

부분실패(Partial Failure)란

- 네트워크로 연결된 두 노드 사이에 메시지가 전송된 상황  
	* 네트워크가 끊겼다면, 송신자는 수신가자 메시지를 수신했는지 여부를 모름  
	* 수신자가 메시지는 받았지만 처리중 죽었다면, 작업의 실패여부조차 모르게 되는 상황  

Zookeeper 사용 목적

- 설정관리(Configuration management)  
	클러스터의 설정 정보를 최신으로 유지  
- 클러스터 관리(Cluster management)  
	서버가 추가되거나 제외될 때 정보를 클러스터 내부 서버들에게 공유  
- 리더 채택(Leader selection)  
	여러 후보 노드 중 리더를 선택함  
- 락, 동기화 서비스(Locking and synchronization service)  
	클러스터에 쓰기 연산이 자주 발생한다면, 경쟁상태에 들어갈 수 있음  
	데이터 불일치가 발생할 수 있음  
	클러스터 전체에 대해 Lock을 걸어 동기화해 경쟁상태에 들어갈 경우를 사전에 방지함  

Zookeeper 아키텍처

https://da-nika.tistory.com/32?category=1044521  

Zookeeper 서비스 구성

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=221082741052  
- 주키퍼 서비스는 홀수로 구성된 서버로 유지됨, 서버간의 데이터 불일치가 발생하면 과반수의 룰을 적용하기 위함  
- 주키퍼 서비스를 구성하는 대부분의 서버들이 사용 가능한 상태이면, 주키퍼 서비스는 사용가능함  
- 주키퍼 서비스를 구성하는 서버들은 서로서로 알고있음  
- 클라이언트(분산 노드)는 하나의 주피커 서버로 TCP를 이용해서 연결됨, 해당 서버로의 커넥션이 손실되면 다른 서버로 연결됨  
- 주키퍼는 read/write 비율이 10:1 정도일때 최고의 효율을 내며 read에 특화되어 있다.  
- 주키퍼를 변경이 자주 발생하는 데이터를 저장하기 위한 용도로 사용하면 안됨  
- 주키퍼 서버는 클라이언트(노드)들이 동시작업을 할 수 있도록 부하를 분산시킴  

클라이언트에서 서버(Follower)로 데이터를 저장하는 경우

클라이언트 -> 서버(Follower) -> 서버(Leader) -> 나머지 서버(Folllower)순으로 데이터를 동기화  
모든 서버에 데이터가 저장된 후 클라이언트에게 성공/실패 여부를 알려줌  
모든 서버가 동일한 데이터를 가지고 있어야, 클라이언트가 어떤 서버에 연결되더라도 유효한 데이터를 가져올 수 있게 됨  

Zookeeper Namespace

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=221082741052  
주키퍼에서 데이터는 다음과 같은 디렉터리 구조로 저장된다.  
데이터에 대한 트랜잭션 로그와 스냅샷 파일이 디스크에 저장되어 재시작해도 데이터는 유지된다.  
app1이라는 노드는 자신의 네임스페이스 하위에 있는 모든 정보에 접근 가능하다.  
보통 중간에 있는 노드들은 상태정보를 관리하기 위해 데이터를 많이 저장하지 않는다.  
ZNode라고 불리는 맨 아래 속하는 노드들에 데이터가 저장된다.  

Zookeeper 데이터 모델

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=221082741052  
  
- Persistent Node  
	세션이 종료되어도 삭제되지 않는 노드. 명시적으로 삭제하기 전에는 데이터는 삭제 및 변경되지 않음  
- Ephemeral Node  
	세션이 유효한 동안에만 유지되는 노드. 어떤 클라이언트가 주키퍼 서버와 연결된 후 어떤 데이터를 Ephemeral Node로 생성했다면, 세션이 끊어지면 해당 노드도 사라진다. 이 기능을 통해 클라이언트의 동작 여부를 쉽게 판단할 수 있음  
- Sequence Node  
	데이터 노드가 생성될 경우 시퀀스 넘버가 자동으로 붙는 노드. 동기화 락을 구현하기 위해 사용됨