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 에 대해 이야기 할 때 설명하겠다.
위 과정은 실제 동작과는 차이가 있다. 단지 이해를 쉽게 하기 위해 서술하였다.

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

Linux 패스워드 관련 정책 설정

1. 패스워드 사용 기간 설정

[root@hostname ~]# vi /etc/login.defs
 #아래 값들을 변경한다.
PASS_MAX_DAYS 90
 #패스워드 최대 사용 기간. 90일 지나면 변경 해야 함
PASS_MIN_DAYS 0
 #패스워드 최소 사용 기간. 변경 최소 0일간 변경 불가.
PASS_MIN_LEN 9
 #패스워드 최소 길이. 9자 이상.
PASS_WARN_AGE 10
 #패스워드 변경 경고 출력 기간. 변경일로부터 10일 전부터 표시.

2. 패스워드 복잡도 설정

[root@hostname ~]# vi /etc/security/pwquality.conf

minlen = 8
 #패스워드 최소 길이
minclass = 4
 #각기 다른 문자의 조합 수 
 #즉 4로 설정 했을 경우 숫자, 대문자, 소문자, 특수문자가 모두 포함 되어야한다.
 #0은 설정 안함.
maxrepeat = 2
 #연속으로 같은 문자의 사용 허용
maxclassrepeat = 0
 #연속으로 같은 종류의 문자 사용 허용.

3. 계정 임계 값 설정

[root@hostname ~]# vim /etc/pam.d/system-auth

auth required pam_tally2.so deny=5 unlock_time=60
 #5회 로그인 실패 시 계정이 잠기고 60초 이후에 풀린다.

YUM 기본 패키지

‘필수’ 의미의 기본이 아니라 이래저래 많이 사용되는 패키지들이다.
필요할 때마다 하나씩 선택해서 설치해도 되고, 귀찮음을 줄이기 위해 일단 설치 해도 되는 패키지들이다.

sudo yum -y install  wget vim setup gdb setuptool nfs-utils autofs rdate gcc iotop ntp curl traceroute unzip lsof tree net-tools nmap it compat-libcap1 gcc-C++ glibc glibc-devel ksh libaio compat-libstdc++-33 libaio-devel libgcc libstdc++ libstdc++-devel libXi libXi libXtst libXtst make sysstat xorg-x11-apps xrdp epel-release maven telnet bind-utils nmap htop tmux

YUM (Yellow-dog Updater Modified)

1. 개요
Yum은 Yellow dog Updater, Modified의 약자로 RPM 기반의 시스템을 위한 자동 업데이터 겸 패키지 설치/제거 도구이다. 듀크 대학교의 Linux@DUKE 프로젝트의 일부분으로 개발되었다. yumex 같은 GUI 기반 확장 도구도 있다.
Yum 이전에 있었던 Yellowdog Updater (YUP) 도구를 대체하며, 듀크 대학교 물리학부에서 사용되었던 레드햇 리눅스 시스템 관리를 위해서 등장하였다. 그 이후로 페도라, CentOS 등 많은 RPM 기반 리눅스 배포판에서 사용되었다. 레드햇의 패키지 관리자 up2date에서도 Yum 저장소에 접근할 수 있다.
현재 GNU 일반 공중 사용 허가서 버전 2 이상으로 사용 가능하다.
Yum은 페도라 22 버전 이후부터 DNF로 전환되고 있다. 그러나 여전히 Yum의 전신인 rpm, 그리고 후신인 DNF와 같이 사용 가능하다.

rpm 패키지들에 대해 검색, 다운로드, 설치 기능을 편리하게 해 주는 것이 가장 큰 역할이지만, 가장 큰 장점은 의존성 1‘A’라는 패키지 설치를 위해 ‘가’ 라는 패키지가 필요할 경우 ‘A’에 대한 설치 명령만 수행해도 ‘가’ 패키지를 함께 다운로드하고 설치 해 준다. 문제를 자동으로 해결 해준다는 점이다.

2. Repository 파일
/etc/yum.repo.d/ 아래에 존재한다.
※ CentOS Base repository 예

[CentOS-repo]
name=CentOS-7- Base
 # 리포지터리 이름 (단지 이름이다.) 
baseurl=http://mirrorlist.centos.org
 # 패키지를 다운로드할 수 있는 미러 목록이 포함된 URL 또는 저장소 자체 지정
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
 # 리포지터리 주소
enabled=1
 # 활성화 여부
gpgcheck=0
 # gpg key 검증 여부
 # 리포지터리에 있는 패키지 파일이 정상적인 파일인지확인한다. (변조 여부 등)
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 #gpg key 위치 

3. 사용법 : 검색 관련

[HOSTNAME:/root]# yum clean all
 # Yum cache 삭제

[HOSTNAME:/root]# rm -rf /var/cache/yum
 # yum clean all 명령의 에러 발생 등의 경우

[HOSTNAME:/root]# yum repolist
 # /etc/yum.repo.d/ 아래의 모든 리포지터리 정보를 갱신한다.

[HOSTNAME:/root]# yum search PACKAGE_NAME
 # PACKAGE_NAME 이라는 이름을 포함한 패키지를 검색한다.

[HOSTNAME:/root]# yum provides LIBRARY_NAME
 # LIBRARY_NAME 이라는 라이브러리를 포함한 패키지를 검색한다.

[HOSTNAME:/root]# yum list 
 # 패키지 리스트를 출력한다.

 [HOSTNAME:/root]#  yum list installed 
 # 현재 설치된 패키지 리스트를 출력한다.

[HOSTNAME:/root]#  yum list PACKAGE_FULL_NAME --show duplicate
 # PACKAGE_FULL_NAME 패키지의 중복 여부 정보를 출력한다.

[HOSTNAME:/root]# yum list PACKAGE-VERSION
  # PACKAGE 란 이름의 패키지 중 VERSION 에 해당하는 버전의 목록을 출력한다. 

4. 사용법 : 패키지 설치

[HOSTNAME:/root]# yum install PACKAGE_NAME
 # PACKAGE_NAME 패키지를 설치한다.

[HOSTNAME:/root]# yum install PACKAGE_NAME*
 # PACKAGE_NAME으로 시작하는 이름의 패키지들을 설치한다.

[HOSTNAME:/root]# yum install PACKAGE_1 PACKAGE_2 PACKAGE_3
 # PACKAGE_1, PACKAGE_2, PACKAGE_3 세개의 패키지를 설치한다.

[HOSTNAME:/root]# yum -y install PACKAGE_NAME
 #  명령어 수행 시 사용자의 확인이 필요한 경우('진짜로 설치 하시겠습니까? 등 ')자동으로 y 가 입력되는 것과 같다

5. 사용법 : RPM 패키지 설치

 [HOSTNAME:/root]# yum install /tmp/PACKAGE_1.rpm
 # /tmp/PACKAGE_1.rpm 을 설치한다. 의존성 패키지가 필요한경우 리포지터리에서 자동으로 다운로드 하고 함께 설치 된다.

 [HOSTNAME:/root]# yum install /tmp/*
 # /tmp 디렉토리 내에 모든 rpm 을 설치한다.

※ yum 명령은 관리자 권한(root)으로 수행 해야 한다.

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

CentOS 7 네트워크 설정

CentOS 7 리눅스를 예시로 네트워크 설정 (IP관련)을 변경한다.

1. 네트워크 인터페이스 정보 확인
– ip addr 명령을 입력한다. 

[HOSTNAME:/root]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 32:1d:58:2b:56:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.103.253/24 brd 192.168.103.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 6e:de:37:60:f8:1b brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:ec:5a:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:ec:5a:ab brd ff:ff:ff:ff:ff:ff

– 또는 ifconfig 명령을 이용한다.

[HOSTNAME:/root]# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.103.253  netmask 255.255.255.0  broadcast 192.168.103.255
        ether 32:1d:58:2b:56:ef  txqueuelen 1000  (Ethernet)
        RX packets 2882429  bytes 1896744621 (1.7 GiB)
        RX errors 0  dropped 50585  overruns 0  frame 0
        TX packets 694551  bytes 1768919562 (1.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 6e:de:37:60:f8:1b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 406  bytes 32755 (31.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 406  bytes 32755 (31.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:ec:5a:ab  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
virbr0-nic: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 52:54:00:ec:5a:ab  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. 설정 변경
– 예제에서는 eth0의 설정을 변경할 것이다.
※ 인터페이스의 이름은 시스템마다 다를 수 있다.

[HOSTNAME:/root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet
BOOTPROTO=static
 #static : 고정 IP를 사용할 경우 
 #dhcp : hdcp 서버가 있고 자동 설정을 할 경우.

NAME=eth0
DEVICE=eth0
ONBOOT=yes
 #이 값을 yes로 바꿔야 시스템이 시작될 때 인터페이스가 활성화 된다.
 #일반적으로 여기까지는 자동으로 생성되며 값만 변경한다.

 #dhcp를 사용할 경우 아래 값은 필요 없다.
IPADDR=192.168.103.123
 #사용할 IP 주소. 
NETMASK=255.255.255.0
 #subnet mask. 
 #PREFIX=24 처럼 prefix로 대체할 수 있다.
GATEWAY=192.168.103.1
 #Gateway.

3. 활성화

[HOSTNAME:/root]# service network restart
 # [HOSTNAME:/root]# service network stop
 # [HOSTNAME:/root]# service network start 
 # 정지 후 시작을 할 수 있지만 현재 연결 된 인터페이스일 경우 stop 이후 접속할 수 없다.
 # CentOS 6 이하의 명령어.
[HOSTNAME:/root]# systemctl restart network.service
  # CentOS7 이후. 
  # service network restart 형식으로 수행해도 리디렉션 된다.

4. 확인

[HOSTNAME:/root]# ping 192.168.103.1
PING 192.168.103.1 (192.168.103.1) 56(84) bytes of data.
64 bytes from 192.168.103.1: icmp_seq=1 ttl=117 time=33.2 ms
64 bytes from 192.168.103.1: icmp_seq=1 ttl=117 time=33.1 ms
--- 192.168.103.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 33.207/33.248/33.289/0.041 ms
 # 이 시도가 성공 했을 경우 gateway 까지 연결이 정상이라고 생각해도 된다.
 # 단 gateway에서 ICMP를 허용하지 않을 경우 응답이 없을 수 있다.
[HOSTNAME:/root]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=33.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=33.2 ms
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 33.207/33.248/33.289/0.041 ms
 # 8.8.8.8은 google의 DNS이다. 
 # 이 시도가 성공 했다면 네트워크 설정에는 문제가 없다고 여겨도 된다.

CentOS8의 경우 network.service를 사용할 수 없다.
NetworkManager 서비스를 이용하자.

[HOSTNAME:/root]# systemctl restart NetworkManager.service