Zookeeper #3. 구동과 확인

Zookeeper #1. 개요
Zookeeper #2. 설치와 설정
Zookeeper #3. 구동과 확인

Kafka #1. 개요
Kafka #2. 설치

※ zookeeper 앙상블에 들어갈 모든 노드에서 구동 되어야 한다.

 # zookeeper 시작
[kafka@kafka ~]$ $ZOOKEEPER_HOME/bin/zkServer.sh start
Using config: /home/kafka/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 # zookeeper 종료
[kafka@kafka ~]$ $ZOOKEEPER_HOME/bin/zkServer.sh stop
Using config: /home/kafka/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

 # zookeeper 재시작
[kafka@kafka ~]$  $ZOOKEEPER_HOME/bin/zkServer.sh restart
Using config: /home/kafka/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
Using config: /home/kafka/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 # zookeeper 프로세스 확인
[kafka@kafka ~]$  jps -l
53088 sun.tools.jps.Jps
38497 kafka.Kafka
52964 org.apache.zookeeper.server.quorum.QuorumPeerMain
87046 org.apache.kafka.connect.cli.ConnectStandalone
 # zookeeper 프로세스 확인
[kafka@kafka ~]$  jps -l
53088 sun.tools.jps.Jps
38497 kafka.Kafka
52964 org.apache.zookeeper.server.quorum.QuorumPeerMain
87046 org.apache.kafka.connect.cli.ConnectStandalone
 # 네트워크 확인
[kafka@kafka ~]$  netstat -nltp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:3350          0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::35068                :::*                    LISTEN      52964/java
tcp6       0      0 192.168.103.113:9092    :::*                    LISTEN      38497/java
tcp6       0      0 :::2181                 :::*                    LISTEN      52964/java
tcp6       0      0 :::3888               :::*                    LISTEN      52964/java
tcp6       0      0 :::2888                 :::*                    LISTEN      52964/java
tcp6       0      0 :::111                  :::*                    LISTEN      -
tcp6       0      0 :::8080                 :::*                    LISTEN      52964/java
tcp6       0      0 :::8083                 :::*                    LISTEN      87046/java
tcp6       0      0 :::37045                :::*                    LISTEN      87046/java
tcp6       0      0 :::42901                :::*                    LISTEN      38497/java
tcp6       0      0 :::22                   :::*                    LISTEN      -

로그 확인
일단 [ERROR], [CRITICAL] 같은 단어가 보이면 뭐가 잘못됐건 잘못 된 것이다.
[WARN]의 경우는 보통 당장 구동에는 문제가 없지만 특정 작업, 조건 등에서 문제가 발생할 수
있다. 주의 깊게 봐야 한다.

[kafka@kafka ~]$ tail -100f $ZOOKEEPER_HOME/logs/zookeeper-kafka-server.out
2020-09-03 10:11:35,822 [myid:2] - WARN  [QuorumConnectionThread-[myid=2]-2:QuorumCnxManager@400] - Cannot open channel to 3 at election address /192.168.113.138:3888
java.net.ConnectException: 연결이 거부됨 (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:607)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:383)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(Qu ....
2020-09-03 10:11:35,828 [myid:2] - INFO  [WorkerReceiver[myid=2]:FastLeaderElection$ ... 후략

예제의 경우 다른 zookeeper 노드가 아직 구동되지 않아 발생한 [WARN] 메시지가 존재한다.
나머지 노드가 구동되고 연결되면 [WARN] 메시지는 사라진다.

로그의 모든 내용을 설명하기는 어렵고 자주 바라보고 눈에 익숙해 질 수 있도록 해야한다.

Zookeeper #2. 설치와 설정

Zookeeper #1. 개요
Zookeeper #2. 설치와 설정
Zookeeper #3. 구동과 확인

Kafka #1. 개요
Kafka #2. 설치

대충.. 이렇게 구성 해보자..
2888은 leader만 오픈 한다는 것을 기억하자.

1. 다운로드 및 압축 해제
Apache zookeeper 홈페이지에서 필요한 버전을 선택하거나 여기를 클릭하여1글 작성일 2020년 09월01일 기준으로 최신버전은 3.6.1이다.다운로드 한다.
– 다운로드한 파일을 FTP 또는 SFTP등을 이용하여 서버에 업로드한다.
– 또는 wget 명령을 이용하여 서버에서 다운로드 한다.

[kafka@kafka ~]$ wget http://apache.tt.co.kr/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
--2020-09-01 08:27:41--  http://apache.tt.co.kr/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
Resolving apache.tt.co.kr (apache.tt.co.kr)... 211.47.69.77
Connecting to apache.tt.co.kr (apache.tt.co.kr)|211.47.69.77|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9394700 (9.0M) [application/x-gzip]
Saving to: ‘apache-zookeeper-3.5.8-bin.tar.gz’

100%[========================================================================>] 9,394,700   72.0KB/s   in 2m 6s

2020-09-01 08:29:47 (72.8 KB/s) - ‘apache-zookeeper-3.5.8-bin.tar.gz’ saved [9394700/9394700]

[kafka@kafka ~]$ ll
합계 91272
-rw-r--r--  1 kafka kafka 12436328  5월  1 04:53 apache-zookeeper-3.6.1-bin.tar.gz
drwxrwxr-x 76 kafka kafka     4096  9월  1 08:29 data
drwxr-xr-x  7 kafka kafka      245  8월 13 07:54 jdk1.8.0_251
lrwxrwxrwx  1 kafka kafka       16  8월 12 09:00 kafka -> kafka_2.13-2.6.0
drwxr-xr-x  9 kafka kafka      182  8월 13 09:48 kafka_2.13-2.6.0
-rw-r--r--  1 kafka kafka 65537909  8월  5 07:01 kafka_2.13-2.6.0.tgz
drwxrwxr-x  2 kafka kafka        6  8월 12 09:07 perl5

– 압축을 해제하고 심볼릭 링크를 생성한다.2Symbolic-Link:윈도우즈의 바로가기 lnk파일과 유사하다. 3심볼릭 링크를 사용하면 환경 변수의 관리가 편리하다. 예제의 경우 압축을 해제하면 ‘apache-zookeeper-3.6.1-bin’ 라는 이름의 디렉토리가 생성되는데 이 이름으로 환경 변수를 등록하여 운영 중 zookeeper 판올림을 할경우 환경변수를 변경 해야 한다. 또 ‘zookeeper’라는 이름으로 변경을 했을 경우 동일한 디렉토리에 파일을 교체해야 하므로 별도로 파일을 이동해줘야 하지만 심볼링 링크로 연결 했을 경우는 링크만 변경 하는 것으로 바이너리를 교체하는 효과를 볼 수 있다.

[kafka@kafka ~]$ tar -xvzf apache-zookeeper-3.6.1-bin.tar.gz
apache-zookeeper-3.6.1-bin/docs/
apache-zookeeper-3.6.1-bin/docs/skin/
    :
중략
   :
apache-zookeeper-3.6.1-bin/lib/metrics-core-3.2.5.jar
apache-zookeeper-3.6.1-bin/lib/snappy-java-1.1.7.jar
[kafka@kafka ~]$ ln -s apache-zookeeper-3.6.1-bin zookeeper
[kafka@kafka ~]$ ll
합계 12148
drwxrwxr-x 6 kafka kafka      133  9월  1 08:35 apache-zookeeper-3.6.1-bin
-rw-r--r-- 1 kafka kafka 12436328  9월  1 08:34 apache-zookeeper-3.6.1-bin.tar.gz
lrwxrwxrwx 1 kafka kafka       26  9월  1 09:12 zookeeper -> apache-zookeeper-3.6.1-bin
 

2. 환경변수 설정
※ /home/kafka 디렉토리에 압축을 해제했고 kafka 계정을 사용하는 것으로 가정한다.
– ~/.bash_profile 에 환경 변수를 등록한다. 4~‘ 는 사용자의 home 디렉토리를 의미한다. 홈 디렉토리는 /etc/passwd 에 기록 되어있다.

[kafka@kafka zookeeper]$ vi ~/.bash_profile

export JAVJA_HOME=/home/kafka/jdk1.8.0_251
export PATH=$PATH:$JAVA_HOME/bin
 # JAVA_HOME 디렉토리 관련 설정. 

#여기부터 추가한다.
export ZOOKEEPER_HOME=/home/kafka/zookeeper
export ZOOBINDIR=$ZOOKEEPER_HOME/bin
 # zookeeper home 과 bin 설정
 # $ZOOKEEPER_HOME/bin/zkEnv.sh 에 $ZOOBINDIR이 명시되어있긴 하지만
 #편의를 위해 등록한다. zkEnv.sh 를 수정해도 된다.

export PATH=$PATH:$ZOOBINDIR
 #zookeeper bin 디렉토리를 PATH에 등록

 #변수를 별도록 export 하지 않으면 해당 변수는 '현재의 스크립트에서만 유효하다'

[kafka@zookeeper-kafka zookeeper]$ source ~/.bash_profile


3. zookeeper 설정
– 설정 파일 수정, node id 파일 생성, 클러스터간 설정 파일 동기화 세가지 작업이 필요하다.

가. $ZOOKEEPER_HOME/conf/zoo.cfg 파일을 생성하고 파일을 수정한다.

[kafka@kafka ~]$ vi $ZOOKEEPER_HOME/conf/zoo.cfg

tickTime=2000
 # 단위는 밀리초. 신호를 보내고 응답이 오기까지 설정된 시간만큼 대기한다.

initLimit=10
 # election 과정 이후 리더로 선출 된 zookeeper와 follower zookeeper들 간의 
 # 동기화 등에 사용되는   tick 시도 횟수. 즉 TickTime=2000에 initLimit=10일경우 
 # 총 20초동안 대기한다.
 # 관리하는 데이터의 양이 많을 경우 값을 늘려준다.

syncLimit=5
 # follower와 zookeeper 간의 동기화를 위한 틱 시도 횟수. 

dataDir=/home/kafka/zookeeper/datadir
 # zookeeper 데이터 디렉토리. tmp는 권장하지않는다.

clientPort=2181
 # zookeeper로 관리되는 클라이언트가 zookeeper에 연결 할 때 사용하는 포트

maxClientCnxns=7
# 최대 접속 가능한 클라이언트 갯수.
# 관리 대상 클라이언트가 많으면 값을 늘려준다.

autopurge.snapRetainCount=3
 # dataDir 디렉토리에 유지할 snapshot 갯수

autopurge.purgeInterval=1
 # 정리(삭제) 시도 주기, 간격. 
 # 단위는 시간.

server.1=192.168.100.111:2888:3888;2181
server.2=zookeeper2:2888:3888;2181
server.3=zookeeper3.fqdn.name:2888:3888;2181
 # 노드 정보. IP, host명(hosts 파일에 있는), FQDN 을 사용할 수 있다.
 # 2888은 leader노드가 follower 노드를 위해 열어두는 포트(동기화용).
 # 3888은 리더 선출을 위한 election 용 포트.
 # server. 뒤에 오는 숫자는 노드의 식별자가 된다. 

admin.enableServer=true
admin.serverPort=8000
admin.commandURL=/commands
 # 관리 서버 설정.
 # 사용하도록 설정하고 웹브라우저로 접속하면 커맨드 정보를 볼 수 있다.
[kafka@kafka ~]$  mkdir /home/kafka/zookeeper/datadir
[kafka@kafka ~]$  echo 1> /home/kafka/zookeeper/datadir/myid
 # myid에 적는 숫자는 zoo.cfg 에 기록한 서버 번호와 일치 해야 한다.

Zookeeper #1. 개요

Zookeeper #1. 개요
Zookeeper #2. 설치와 설정
Zookeeper #3. 구동과 확인

Kafka #1. 개요
Kafka #2. 설치

아파치 주키퍼(Apache ZooKeeper)는 아파치 소프트웨어 재단 프로젝트중의 한 소프트웨어 프로젝트로서 공개 분산형 구성 서비스, 동기 서비스 및 대용량 분산 시스템을 위한 네이밍 레지스트리를 제공한다. 주키퍼는 하둡의 한 하위 프로젝트이었으나 지금은 독립적인 상위 프로젝트이다. 주키퍼의 아키텍처는 중복 서비스를 이용한 고가용성을 제공한다. 클라이언트는 주키퍼 마스터가 응답을 하지 않으면 다른 주키퍼 마스터에게 요청을 한다. 주키퍼 노드들은 파일 시스템이나 trie 데이터구조와 비슷한 구조의 네임 스페이스안에 데이터들을 저장한다. 클라이언트들은 이 노드들에게서 읽거나 쓴다. 1 https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EC%A3%BC%ED%82%A4%ED%8D%BC

쉬운 이해를 위해 설명하자면 ‘Hadoop Eco System’ 등의 고가용성 제공을 위한 도구이다. 즉, Hadoop 네임노드 이중화, Kafka 클러스터, NiFi 클러스터링 등을 위한 관리 기능을 제공한다.

기본적으로 1개 이상 21개로 구성은 가능하지만 이는 단순히 zookeeper의 관리 기능을 이용하는 것이지 고가용성 확보를 위한 구성은 아니다. 의 홀수개 노드(인스턴서,서버)들로 구성되며 주 용도는 다음과 같다.
– 설정 관리 : 클러스터의 설정 정보 관리
– 클러스터 관리 : 클러스터의 서버가 추가되거나 제외될 때 그 정보를 클러스터 노드 간 공유
– 리더 선출 : 흔한 이중화 개념에서 ‘액티브’ 노드로 사용할 노드를 선택
– 락 관리 및 동기화 서비스 : 클러스터 쓰기,연산 과다 등으로 인한 데이터 불일치를 최소화 하기 위한 락(Lock) 수행 및 동기화

이후 진행할 NiFi 클러스터 설정, Kafka, Hadoop 설정을 위한 최소한의 개념을 살펴보자면

① zookeeper 노드 간 정보를 확인하고 Leader가 선택된다.
② kafka broker들이 zookeeper 에 연결된다.
zookeeper는 kafka broker 3개 중 하나를 리더로 선출한다.
zookeeper 노드들은 kafka broker 정보들을 공유한다.
③ consumer는 메시지를 읽기 위해 zookeeper로부터 kafka broker 중 리더가 누구인지 확인한다.
④ consumer는 리더로 선출된 broker로부터 메시지를 받는다.
※ consumer, broker 등에 대한 이야기는 kafka 에 대해 이야기 할 때 설명하겠다.
위 과정은 실제 동작과는 차이가 있다. 단지 이해를 쉽게 하기 위해 서술하였다.

쉽게 설명하자면 노드가 여러개일 경우 노드들 중 실제 동작을 하게 될 노드를 선택하고 사용자가 통신하기 위한 노드의 정보를 관리하고 사용자에 전달해 주는 역할을 한다.
당연한 이야기지만 노드에 장애가 있을 경우 다음 노드를 지정해주는 역할도 한다.

Graph Database

시맨틱 쿼리를 위해 노드, 엣지, 프로퍼티와 함께 그래프 구조를 사용하여 데이터를 표현하고 저장하는 데이터베이스이다.
이 시스템의 주 개념은 그래프(엣지 또는 관계)이며 스토어에 직접 데이터 항목들의 관계를 정한다.
이러한 관계들은 스토어 안의 데이터가 함께 직접 연결될 수 있게 한다.

그래프 데이터베이스는 일반적인 그래프를 표현한다는 점에서 1970년대의 네트워크 모델 데이터베이스와 비슷하지만 네트워크
모델 데이터베이스는 더 낮은 수준의 추상화로써 동작하며 일련의 엣지 간의 용이한 횡단이 불가능하다.

이름
라이선스
언어
AgensGraph  
APL2 (CE) / 상용(EE)
C, Java, Javascript, Python
AllegroGraph
사유, 클라이언트: 이클립스 공용 허가서 v1
C#, C, CL, 자바, Python
ArangoDB
APL 2
C++, 자바스크립트
Blazegraph
상용 / GPLv2(평가용)
JAVA
Cayley
APL2
Go
Dgraph
AGPLv3(서버용), APL2
Go
DataStax Enterprise Graph
사유
JAVA
Sparksee
사유, 상용, 프리웨어(평가,연구,개발용)
C++
GraphBase
사유, 상용
JAVA
gStore
BSD 허가서
C++
InfiniteGraph
사유, 상용
JAVA
JanusGraph
무료, APL2
JAVA
마크로직
사유, 프리웨어(개발발자 버전)
JAVA
Neo4j
GPLv3(CE), 상용&AGPLv3(EE,AE3)
JAVA, .NET, Python, Ruby
오픈링크 Virtuoso
오픈 소스 에디션은 GPLv2 / 사유(EE)
C, C++
Oracle Spatial and Graph
사유
JAVA, PL/SQL
OrientDB
APL2, 상용(EE)
JAVA
SAP HANA
사유
C, C++, JAVA & SQL
Sqrrl Enterprise
사유
JAVA
Teradata Aster
사유
JAVA, SQL, Python, C++, R
TigerGraph
사유
C++
MS SQL SERVER 2017
tkdb
SQL/T-SQL, R, Python