CentOS swap 영역 해제하기

swap 의 사전적 의미. (daum 사전)

개요

Linux의 swap 메모리, swap 영역은 정확히 사전적 의미그대로의 영역을 말한다.
(윈도우는 가상 메모리)

CPU(Cache) – RAM – HDD (혹은 SSD를 포함하는 모든스토리지) 가 있는 컴퓨터는
사용자가 특정한 프로그램을 실행하면
1. HDD에서 필요한 데이터를 읽어서
2. RAM에 일정량을 저장하고
3. 다시 CPU의 Cache 메모리에 일정량을 저장하고
4. CPU에서 연산을 하고
5. 결과를 반환한다.


보통은 위 5단계에서 아무런 문제가 일어나지 않지만 요즘 게임을 하거나, 사진을 찍어서 편집을 하고 하다보면 메모리(RAM) 사용량이 늘어나는 것을 볼 수 있다.

예컨대 RAM이 4GB인데 동영상 편집을 할 때 동영상의 크기가 8GB를 넘어간다면?

바로 이 때 Paging(단편화1 복잡하게 생각 할 필요 없다. 책을 한권 램에 올려야 하는데 램의 크기가 작아서 페이지를 떼어서 올리는 것이라고 생각하면 된다. 우리가 실행하는 게임이건 포토샵이건 다 매 한가지다.) 이라는 작업이 일어나고 swapping 이 필요해 진다.

일단 동양상 편집을 위해 4GB램의 PC에서 8GB짜리 동영상을 로드하게 되면
1. 우선 HDD에 있는 8GB의 데이터 중 4GB의 데이터가 램으로 이동한다.
2. 사용자가 현재 램에 있는 4GB의 동영상 편집을 수행한다.

그런데 이 때 현재 램에 있는 4GB 말고 나머지 반쪽의 내용을 불러와야 한다면?
1. 현재 4GB의 동영상을 HDD의 스왑 파티션으로 이동한다. 2여기서 램에 있는 내용을 삭제 하지 않는 이유는 사용자가 아직 기존에 램에 있던 4GB의 데이터의 작업을 완료하지 않았기 때문이다.
2. HDD에 남아있던 나머지 뒤쪽 4GB를 램에 올린다.
3. 다시 편집 작업을 한다.

그래서 보통 물리 메모리(RAM)의 1배~2배 정도로 설정을 하는데 익히 알고 있다시피 HDD건, SSD건 RAM보다 느린데다가, swap 되는 데이터의 크기 두배3RAM에 있는 데이터를 읽어서, swap에 쓰고 다시 HDD의 데이터를 읽어서 RAM에 올려야 하므로swap으로 만큼 읽고 쓰기가 일어나므로 swapping 이 잦아지면 작업 지연이 생길 수 밖에 없다. 4지금이야 대부분의 PC에 SSD가 달려있어서 잘 못느끼지만 HDD가 주류이던 시절 게임을 하다 지역 이동을 하거나 할 때 본체의 빨간불이 깜빡이며 열심히 HDD가 돌아가고 화면이 멈춰있거나 느려지거나.. 경험 했을 것이다.

swap 영역 해제

 # 현재 swap 정보 확인
[root@centos7:~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            62G        5.5G         54G        264M        2.9G         56G
Swap:           31G          0B         31G

[root@centos7:~]# blkid
/dev/sda1: UUID="d8888888-80c0-4156-8b73-6b5323dd2c01" TYPE="xfs"
/dev/sda2: UUID="p22222-84DI-Hvny-RZ7Z-FbHq-QBq2-tTl5yK" TYPE="LVM2_member"
/dev/sdb1: UUID="45555555-0ca0-4b99-86b5-33e45689fc10" TYPE="xfs"
/dev/mapper/centos-root: UUID="5999999-877a-4fe9-a464-5376cb476310" TYPE="xfs"
/dev/mapper/centos-swap: UUID="2333333-b2d1-4f58-9123-865739a3c2eb" TYPE="swap"    

 # 현재 swap 영역을 사용하고 있으면 해제할 수 없다.
 # swap 영역이 여러개일 때
[root@centos7:~]# swapoff  /dev/mapper/centos-swap

 # 현재 모든 swap을 해제 할 때
[root@centos7:~]# swapoff -a

# 해제 여부 확인.
 # swap 이 모두 0B인 것을 확인할 수 있다.
[root@centos7:~:]# free -h
              total        used        free      shared  buff/cache   available
Mem:            62G        7.7G         52G        161M        3.0G         54G
Swap:            0B          0B          0B
# swap 파티션 마운트 정보 변경
[root@centos7:~:]# vi /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d675d2d3-80c0-1234-8j72-6b5323dd2c01 /boot                   xfs     defaults        0 0
# type이 swap 인 파티션에 대해 주석 처리 해 준다.
# 삭제 해도 된다.
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb1       /data  xfs     defaults        0       0

Hadoop # 1. 개요

개요

아파치 하둡(Apache Hadoop, High-Availability Distributed Object-Oriented Platform)은 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 프리웨어 자바 소프트웨어 프레임워크이다. 원래 너치의 분산 처리를 지원하기 위해 개발된 것으로, 아파치 루씬의 하부 프로젝트이다. 분산처리 시스템인 구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS: Hadoop Distributed File System)과 맵리듀스를 구현한 것이다.

베이스 아파치 하둡 프레임워크는 다음의 모듈을 포함하고 있다:

하둡 커먼(Hadoop Common)
하둡 분산 파일 시스템(HDFS)
하둡 YARN
하둡 맵리듀스

쉽게 설명하면 자바로 만든 네트워크 클러스터링이 가능한 가상 파일 시스템 이다.

이런… 느낌이려나…

컨셉 자체는 매우 단순하다.
1. 네트워크로 연결 되어있다.
2. 데이터를 쪼개서 각 노드에 분산 저장한다.
3. 노드의 장애에 대비해 중복 저장한다.
4. 어디까지나 ‘파일을 저장하기 위한 파일 시스템이다.’

NTP 설정 (서버 구축 & 클라이언트)

네트워크 타임 프로토콜(Network Time Protocol, NTP)은 패킷 교환, 가변 레이턴시 데이터 네트워크를 통해 컴퓨터 시스템 간 시간 동기화를 위한 네트워크 프로토콜이다. 1위키백과에서 발췌

동일한 시간을 사용해야 하는 장비들 간 시간을 동기화 하기 위한 프로토콜이다.
외부 서비스를 하지 않고, 단일 서버만 운영되는 경우는 큰 의미가 없을 수도 있으나, 네트워크로 연결 되어있고, 구성요소간 시간이 동일해야 하는 경우 2예: hadoop 클러스터간 동기화, 결재 서비스를 하는 서버가 여러대로 구축 되어있을 경우 등 NTP 서버를 기준으로 시간을 동기화 한다.

NTP 서버

설치

 [root@ntp-server: ~ ]# yum install -y ntp
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
everything-disc                                                                                                                                         | 2.9 kB  00:00:00
Resolving Dependencies
--> Running transaction check
중략
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================================================================================
 Package                             Arch                               Version                                              Repository                                   Size
===============================================================================================================================================================================
Updating:
 ntp                                 x86_64                             4.2.6p5-29.el7.centos                                everything-disc                             548 k
Updating for dependencies:
 ntpdate                             x86_64                             4.2.6p5-29.el7.centos                                everything-disc                              86 k

Transaction Summary
===============================================================================================================================================================================
Upgrade  1 Package (+1 Dependent package)
중략
Downloading packages:
No Presto metadata available for everything-disc
(1/2): ntpdate-4.2.6p5-29.el7.centos.x86_64.rpm                                                                                                         |  86 kB  00:00:00
(2/2): ntp-4.2.6p5-29.el7.centos.x86_64.rpm                                                                                                             | 548 kB  00:00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                          5.8 MB/s | 635 kB  00:00:00
중략
Running transaction
  Updating   : ntpdate-4.2.6p5-29.el7.centos.x86_64                                                                                                                        1/4
중략
  Verifying  : ntp-4.2.6p5-28.el7.centos.x86_64                                                                                                                            4/4

Updated:
  ntp.x86_64 0:4.2.6p5-29.el7.centos

Dependency Updated:
  ntpdate.x86_64 0:4.2.6p5-29.el7.centos

Complete!

서버 구축을 위한 설정
이 꼭지에서 수정한 설정파일로 nptd를 구동한 서버는 ‘기준’ 이 된다.
이 서버를 바라보는 클라이언트들은 이 서버를 기준으로 시간이 동기화 된다.

 # 서버도 /etc/ntp.conf 클라이언트도 동일하게 /etc/ntp.conf 파일을 수정한다.
 # 설정 변경.
[root@ntp-server: ~ ]# vi /etc/ntp.conf
#이대로 붙여 넣는다.
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
restrict 0.0.0.0 mask 0.0.0.0 nomodify notrap
 # 특별한 경로를 사용하는 경우만 여기서부터
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
 # 여기까지 수정한다.
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 3
 # 서버 시작
[root@ntp-server: ~ ]# service ntpd start
Starting ntpd:                                             [  OK  ]
 # 구동확인, NTPd는 123번 포트, UDP 프로토콜로 통신한다.
[root@ntp-server: ~ ]# netstat -nlup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
udp        0      0 192.168.4.160:123           0.0.0.0:*                               10290/ntpd
udp        0      0 192.168.4.254:123           0.0.0.0:*                               10290/ntpd
udp        0      0 127.0.0.1:123               0.0.0.0:*                               10290/ntpd
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               10290/ntpd
udp        0      0 0.0.0.0:636                 0.0.0.0:*                               1013/portreserve
udp        0      0 192.168.4.160:53            0.0.0.0:*                               25447/named
udp        0      0 192.168.4.254:53            0.0.0.0:*                               25447/named
udp        0      0 127.0.0.1:53                0.0.0.0:*                               25447/named
[root@ntp-server: ~ ]# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*127.127.1.0     .LOCL.           3 l   39   64   37    0.000    0.000   0.004

동기화를 위한 클라이언트 설정

[root@ntp-client: ~ ]# vi /etc/ntp.conf
 # 아래에 NTP 서버의 IP만 고쳐서 붙여넣는다.
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

 # 위에서 ntp 서버로 설정한 서버의 IP가 192.168.0.1 이라면
server 192.168.0.1 iburst

includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
 # 서비스 재시작. 시간 동기화는 꾸준히 해야 하기 때문에 데몬을 구동한다.
[root@ntp-client: ~ ]# service ntpd restart
 # 서버측과의 결과 값과 비교해 보자.
 # 현재 클라이언트의 시각과 딜레이등의 정보가 표시 되는 것을 확인할 수 있다.
[root@ntp-client: ~ ]# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 192.168.0.1   LOCAL(0)         4 u    1   64    1    0.683  197.879   0.081

YUM repository 구축 – online

폐쇄망, 사내 활용 등을 위한 yum repository를 구축한다.
local repository 구축과 특별히 다른 점은 없다. 단지 웹(http, https) 을 통한 접근을 허용하는 경로를 추가하는 것으로 구축이 가능하다.
웹 서버가 구축 되어있어야 한다.

http 디렉토리를 확인하고 그곳에 리포지터리 파일을 복사한다.

[root@class14 ~]# vi /etc/httpd/conf/httpd.conf
 # 다음 내용을 찾는다.
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

생성한 repodata 디렉토리가 있는 디렉토리를 /var/www/html 에 복사한다.
이전 포스트에서 /home/repo-data/ 에 rpm 패키지를 넣고 repodata를 생성했었다.

[root@class14 ~]# cp -r /home/repo-data /var/www/html
 # 또는 심볼릭 링크를 만들어준다.
[root@class14 ~]# ln -s /home/repo-data /var/www/html/repo-data

repo 파일 생성
※ local repository에 대한 repo 파일을 만드는 것과 다르지 않다. url만 다를 뿐이다.

[centos:/home:]# vi /etc/yum.repos.d/haedongg_net.repo
 #여기부터 붙여넣기 한다.
[haedong_net-repo]
name=haedongg_net-repo
baseurl=http://www.haedongg.net/repo-data
 # createrepo 명령으로 생성된 repodata 가 있는 디렉토리를 지정한다.
 # http로 시작하는 것에 유의하자. 
enabled=1
gpgcheck=0

WGET 다운로더

GNU Wget(간단히 Wget, 이전 이름: Geturl)는 웹 서버로부터 콘텐츠를 가져오는 컴퓨터 프로그램으로, GNU 프로젝트의 일부이다. 이 프로그램의 이름은 월드 와이드 웹과 get에서 가져온 것이다. HTTP, HTTPS, FTP 프로토콜을 통해 내려받기를 지원한다. 1위키백과에서 발췌

이런걸 다운 받을 때 사용한다.
웹브라우저가 있다면 클릭 한번이면 되지만
웹브라우저가 없는 터미널 환경 등에서 파일을 다운로드 하기 위해 사용한다.

기본 명령은 단순하다.
“wget 다운로드할_파일주소”

[root@host ~]# wget http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-boot.iso         --2020-09-09 18:11:46--  http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-boot.iso
Resolving mirror.kakao.com (mirror.kakao.com)... 113.29.189.165
Connecting to mirror.kakao.com (mirror.kakao.com)|113.29.189.165|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 654311424 (624M) [application/octet-stream]
Saving to: ‘CentOS-8.2.2004-x86_64-boot.iso’

13% [========>                                                                ] 89,458,496  11.2MB/s  eta 49s

다운로드 시 파일명 변경
원본 파일명은 CentOS-8.2.2004-x86_64-boot.iso이지만
다운로드 파일 이름은 centos-boot.iso 이 된다.

[root@host ~]샾 wget -O centos-boot.iso http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-boot.iso

HTTPS 사이트에서 인증서 오류 등 발생 시

[root@host ~]샾 wget --no-check-certificate http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-boot.iso

하위 디렉토리를 포함해 여러 파일을 다운로드 하고 싶을 때

[root@host ~]샾 wget -r http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/ 
 # 파일 이름을 지정하지 않음을 기억하자.

robots.txt 로 인해 순환 다운로드(-r)가 안될 때

[root@host ~]샾 wget -r -e robots=off 
 http://mirror.kakao.com/centos/8.2.2004/isos/x86_64/ 

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 에 기록한 서버 번호와 일치 해야 한다.