Hadoop # 2. 싱글 Namenode 설치,설정

Hadoop #1. 개요

사전 작업

하둡을 구동할 계정은 hadoop, 그룹도 hadoop 으로 한다. hadoop 계정의 홈 디렉토리는 /home/hadoop 이다. 키-쌍 생성 관련 내용은 별도의 포스트를 통해 설명하겠다

 # 사용자 생성
[root@hadoop01 ~]# useradd -g hadoop hadoop
[root@hadoop01 ~]# su - hadoop
[root@hadoop01 ~]# passwd hadoop
hadoop 사용자의 비밀 번호 변경 중
새  암호:
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.
 #여기까지 모든 서버에서 작업한다.
 # 키 쌍 생성
[hadoop@hadoop01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:kQyuv0LCUMDOBwicLr4VyFSskm0wYIGHLIv1pTbALF0 hadoop@centos7
The key''s randomart image is:
+---[RSA 2048]----+
|%O=oE .          |
|XBO. ..o .       |
|O@+o o. +        |
|BBoo=.   .       |
|++..o.  S        |
| .o...           |
|  oo  .          |
| .  .  .         |
|     ..          |
+----[SHA256]-----+
[hadoop@hadoop01 ~]$ chmod 700 ~/.ssh
[hadoop@hadoop01 ~]$ cat ~/.ssh/id_rsa.pub >> authorized_keys
[hadoop@hadoop01 ~]$ chmod 600 ~/.ssh/*
[hadoop@hadoop01 ~]$ ls -l ~/.ssh/
합계 12
-rw------- 1 hadoop hadoop  396  9월 14 15:32 authorized_keys
-rw------- 1 hadoop hadoop 1675  9월 14 15:24 id_rsa
-rw------- 1 hadoop hadoop  396  9월 14 15:24 id_rsa.pub
 # 하둡 클러스터로 사용할 모든 서버에 키를 복사하고 권한을 변경한다.
[hadoop@hadoop01 ~]$ scp ~/.ssh/authorized_keys hadoop@hadoop02:/home/hadoop/.ssh/authorized_keys
The authenticity of host 'hadoop02 (192.168.0.2)' can't be established.
ECDSA key fingerprint is SHA256:nhIT6XvSamWF1mgXDkAuM64eZj5XCJww5T2NEojH2iU.
ECDSA key fingerprint is MD5:7b:a5:40:02:c3:cd:0f:e7:36:77:dd:3c:cc:3b:ba:d2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
hadoop@hadoop02's password:
authorized_keys     
[hadoop@hadoop01 ~]$  ssh hadoop02 chmod 700 /home/hadoop/.ssh
[hadoop@hadoop01 ~]$  ssh hadoop02 chmod 600 /home/hadoop/.ssh/authorized_keys
hadoop@hadoop02's password:

설치

Apache Hadoop 홈페이지에서 바이너리를 다운로드 하고 압축을 해제한다.
※ hadoop 계정으로 진행

[hadoop@hadoop01 ~]$ wget http://mirror.apache-kr.org/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz
--2020-09-14 15:28:30--  http://mirror.apache-kr.org/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz
Resolving mirror.apache-kr.org (mirror.apache-kr.org)... 125.209.216.167
Connecting to mirror.apache-kr.org (mirror.apache-kr.org)|125.209.216.167|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 348326890 (332M) [application/octet-stream]
Saving to: ‘hadoop-3.1.4.tar.gz’
100%[=====================================================================================================================================>] 348,326,890 37.9MB/s   in 11s
2020-09-14 15:28:41 (30.1 MB/s) - ‘hadoop-3.1.4.tar.gz’ saved [348326890/348326890]
[hadoop@hadoop01 ~]$ tar -xvzf  hadoop-3.1.4.tar.gz
hadoop-3.1.4/
hadoop-3.1.4/lib/
중략
hadoop-3.1.4/libexec/mapred-config.sh
hadoop-3.1.4/libexec/hadoop-config.cmd
hadoop-3.1.4/libexec/hdfs-config.cmd
[hadoop@hadoop01 ~]$ ln -s  ~/hadoop-3.1.4 ~/hadoop
[hadoop@hadoop01 ~]$ ls -l
합계 340164
lrwxrwxrwx 1 hadoop hadoop        12  9월 14 15:31 hadoop -> hadoop-3.1.4
drwxr-xr-x 9 hadoop hadoop       169  9월 14 15:31 hadoop-3.1.4
-rw-rw-r-- 1 hadoop hadoop 348326890  8월 24 21:40 hadoop-3.1.4.tar.gz
drwxrwxr-x 2 hadoop hadoop         6  9월 14 15:22 perl5
 #나머지 노드에서 모두 동일한 작업을 수행한다. (다운로드, 압축 풀기, 심볼릭 링크 생성)
[hadoop@hadoop01 ~]$  vi  ~/.bas_profile
 # 여기부터 파일의 맨 뒤에 붙여넣기 한다.
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
[hadoop@hadoop01 ~]$  source ~/.bas_profile
 나머지 노드들에서 동일하게 수행 해 준다.

설정

 # Hadoop 환경변수 설정 (하둡이 구동될 때 읽어들이는 환경변수)
[hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
 # 기존 내용을 모두 지우고 여기서부터 붙여넣기 한다.
 export HADOOP_HOME=/home/hadoop/hadoop
 export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

 # 시스템 사양에 맞추어 적절히 증감한다.
 export HADOOP_HEAPSIZE_MAX= 8g
 export HADOOP_HEAPSIZE_MIN=8g

export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
 # core-site.xml
[hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/core-site.xml
<!-- 모두 지우고 여기서부터 붙여넣기 한다. -->
<configuration>
  <property>
      <name>fs.defaultFS</name>
      <value>hdfs://hadoop01:8020</value>
<!-- 기본 HDFS 주소. 예를 들어 "hdfs dfs -ls / " 를 수행하면  / 앞에 value의 주소가 들어간다고 이해하면 된다 -->
  </property>
  <property>
      <name>hadoop.proxyuser.hive.groups</name>
      <value>*</value>
  </property>
  <property>
      <name>hadoop.proxyuser.hive.hosts</name>
      <value>*</value>
  </property>
</configuration>
 # hdfs-site.xml
[hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<!-- 모두 지우고 여기서부터 붙여넣기 한다. -->
<configuration>
   <property>
        <name>dfs.replication</name>
        <value>3</value>
<!-- 
데이터 복제 횟수 
-->
   </property>
   <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/namenode</value>
<!--
로컬(리눅스 시스템의) 디렉토리 경로이며, 반드시 hadoop을 구동하는 계정이 디렉토리에 대한 모든 권한을 가지고 있어야 한다.
-->
   </property>
   <property>
        <name>dfs.namenode.checkpoint.dir</name>
        <value>/home/hadoop/namesecondary</value>
<!-- 
namenode 디렉토리와 동일하게 로컬 디렉토리이고 모든 권한을 부여해야 한다. 
-->
   </property>
   <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/datanode</value>
<!-- 
실제 hdfs 에 쌓인 데이터가 저장되는 경로. 여유공간이 넉넉한 파티션의 디렉토리를 지정해야 한다.
 datanode로 동작하는 클라이언트, 즉 workers 파일에 등록되어있는 호스트에 모두 동일하게 적용해야 한다.
 당연히 hadoop을 구동하는 계정이 모든 권한을 가진 디렉토리여야 한다.
-->
   </property>
   <property>
         <name>dfs.http.address</name>
         <value>hadoop01:50070</value>
<!--namenode http 주소 및 포트. hadoop web-UI -->
   </property>
   <property>
         <name>dfs.secondary.http.address</name>
         <value>hadoop01:50090</value>
<!-- 
Secondary namenode http 주소 및 포트
주의 할 점은 secondary-namenode는 백업, 복구를 담당하는 것이 아니라 보조의 역할이라는 점이다. 
-->
   </property>

<property>
         <name>dfs.block.size</name>
         <value>16777216</value>
<!-- 
HDFS의 block size, Byte 단위.  다음 값들을 참고하자.
8MB=8,388,608 / 16MB=16,777,216 / 32MB=33,554,432 / 64MB=67,108,864 / 128MB=134,217,728
-->
    </property>
    <property>
      <name>dfs.permissions.enabled</name>
      <value>false</value>
<!-- 
값이 false일 경우 파일 시스템의 퍼미션 관련 기능이 비활성화된다. 
-->
    </property>
    <property>
      <name>fs.trash.interval</name>
      <value>3</value>
<!-- 
휴지통과 같은 기능이다. 파일을 삭제하면 임시 공간으로 이동되고 지정한 시간 이후 삭제된다.
value의 값(=분)에 따라 휴지통이 비워진다.  
-->
    </property>
</configuration>
 # yarn-site.xml
[hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<!-- 모두 지우고 여기서부터 붙여넣기 한다. -->
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop02</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop02:8025</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop02:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop02:8050</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop02:8055</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
<!--
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler
- FIFO : 먼저 들어온 작업을 먼저 처리한다. 후순위 작업은 이전 작업이 끝날 때까지 대기한다.
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
- FAIR : 작업에 균등하게 자원을 할당한다.
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
- 트리 형태로 큐를 선언하고 각 큐 별로 이용할 수 있는 자원의 용량을 정하여 할당한다. 
-->
        </property>
</configuration>
 # mapreduce-site.xml
[hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/mapreduce-site.xml
<!-- 모두 지우고 여기서부터 붙여넣기 한다. -->
<configuration>
     <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
     </property>
     <property>
        <name>mapred.local.dir</name>
        <value>/home/hadoop/mapred</value>
     </property>
     <property>
        <name>mapred.system.dir</name>
        <value>/home/hadoop/mapred</value>
     </property>
     <property>
        <name>mapred.map.memory.mb</name>
        <value>2048</value>
<!-- map 작업을 위한 최대 리소스 제한 -->
     </property>
     <property>
        <name>mapred.map.java.opts</name>
        <value>-Xmx1024M</value>
<!-- map 작업을 위한 최대 child jvms  -->
     </property>
     <property>
        <name>mapred.reduce.memory.mb</name>
        <value>3072</value>
<!-- reduce 작업을 위한 최대 리소스 제한  -->
     </property>
     <property>
        <name>mapred.reduce.java.opts</name>
        <value>-Xmx2560M</value>
     <!-- reduce 작업을 위한 최대 child jvms  -->
     </property>
     <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop02:10020</value>
<!-- Job history server 주소 (기본 포트는 10020)  -->
     </property>
     <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop02:19888</value>
<!-- Job history server Web UI주소 (기본 포트는 19888)  -->
     </property>
     <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>/home/hadoop/mr-history/tmp</value>
     </property>
     <property>
        <name>mapreduce.jobhistory.done-dir</name>
        <value>/home/hadoop/mmr-histroy/done</value>
     </property>
</configuration>
[hadoop@hadoop01 ~]$ vi $HADOOP_CONF_DIR/workers
 # datanode 구동을 위한 노드를 기록한다.
hadoop01
hadoop02
192.168.0.3
hadoop04.net
 # 수정한 설정 파일을 모든 노드에 복사한다.
[hadoop@hadoop01 ~]$ scp $HADOOP_HOME/etc/hadoop/* hadoop02:/home/hadoop/etc/hadoop/


구동 및 확인. 그리고 종료

 # 구동 스크립트를 이용한 방법

 # 하둡 구동
[hadoop@hadoop01 ~]$  $HADOOP_HOME/sbin/start-all.sh
WARNING: Attempting to start all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [centos7]
Starting datanodes
Starting secondary namenodes [centos7]
Starting resourcemanager
Starting nodemanagers

 # 프로세스 확인
[hadoop@hadoop01 ~]$  jps -l
92880 org.apache.hadoop.yarn.server.nodemanager.NodeManager
92339 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
93780 sun.tools.jps.Jps
92685 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
92111 org.apache.hadoop.hdfs.server.datanode.DataNode

 # 종료
[hadoop@hadoop01 ~]$  sbin/stop-all.sh
WARNING: Stopping all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: Use CTRL-C to abort.
Stopping namenodes on [centos7]
Stopping datanodes
Stopping secondary namenodes [centos7]
Stopping nodemanagers
Stopping resourcemanager

Hadoop # 1. 개요

개요

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

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

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

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

이런… 느낌이려나…

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

OSI 7 layer ( OSI 7계층, 모델)

OSI 모형(Open Systems Interconnection Reference Model)은 국제표준화기구(ISO)에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층 모형이라고 한다. 1위키백과 에서 발췌

이 모델 자체가 특별한 역할을 하거나, 목적은 아니고 네트워크 설계를 하게 되면 이 모델을 따라 설계를 하자 하는 표준. 약속이다. 많은 공학도들이 네트워크 과목에서 이걸 만나고 ‘WTF!’2What The Fuck(와떠뻑) 을 외친다는 사실은 많이 알려진 사실이다. 많은 책, 오픈백과, 블로그 등등에서 친절하게 설명하고있고, 이 포스트도 가능한한 친절하게 설명하고자 하지만 그들보다 쉬울 수 있을지는 잘 모르겠다.

그림이 없으면 허전할 것 같아서 그려봤다.

1계층은 물리연결 계층이고 2계층은 데이터링크… 이런 내용은 따로 설명하지 않겠다. 이미 검색결과 상단의 링크에서 지겨울정도로 봤을테니까. 조금은 다른 방법으로 접근 해보자.

스위치는 L2 스위치 부터 존재한다.
여기서 ‘L’‘Layer’를 의미한다.
즉, L2 스위치는 Layer-2 를 처리할 수 있는 스위치라는 뜻이다.
L3 는 Layer-3, L4는 Layer-4. 당연히 L5, L6, L7 스위치도 존재한다.

Layer 1

하.지.만. L1 스위치란 단어는 생소하다. 마치 없는 것 같다.
이유를 알기 위해서는 Layer-1 에서의 역할을 이해야 한다.
Layer-1은 ‘물리’계층임을 이미 알고 있을 것이다. 이름 그대로 물리적으로 연결이 되고, 신호가 전달 되는 것이 1 계층이다.

그림에서처럼 ‘뭔지 모르지만 신호를 보내는 장비’는 ‘뭔지 모르지만 신호를 받고 싶은 장비’ 에게 빨간색 신호를 보내지만 거리가 멀어서 닿지 않는다.

이 중간에 ‘들어오는신호를 증폭 시켜서 밖으로 내보내는 장비’를 설치한다. 멀어서 닿지 않던 신호는 ‘뭔지 모르지만 신호를 받고 싶은 장비’까지 전달된다.
이런 역할을 하는 녀석이 바로 ‘리피터(Repeater)’3신호의 증폭에 초점을 두면 리피터, 단순 연결에 초점을 두면 브릿지(Bridge)가 된다. 결국 그놈이 그놈이다. 신호라고 해서 이해가 안되면 1.5v짜리 건전지를 1Km밖에 있는 전구에 연결한다고 생각해보자. 1Km까지 1.5v를 유지하려면 중간중간 전압을 높여주는 장비들을 설치 해야 할 것이다.이다.
즉 Layer 1 에 해당하는 무언가를 만들 때는 ‘신호의 온전한 전달’ 만 신경 쓰면 된다는 이야기이다.

[가.] 는 리피터(혹은 브릿지)이다.
[나.] 는 출력을 세 개로 늘린 장비이다.
여기서 기억 해야 하는 건, 들어온 신호는 나머지 모든 출력으로 ‘동일하게’ 출력된다는 점이다.

이제 이것들을 수도관이라고 생각해보자.
[가]의 경우 왼쪽 구멍에 물을 부으면 오른쪽으로 나간다. 당연히 오른쪽에서 물을 부으면 왼쪽으로 물이 나간다.
[나]의 경우 왼쪽 구멍에서 물을 부으면 오른쪽 모든 구멍으로 물이 나갈 것이다. 그럼 오른쪽 위의 구멍에 물을 부으면? 역시나 나머지 구멍에서 물이 나올 것이다.
왼쪽 구멍에도 물을 붓고, 오른쪽에서도 물을 부으면? 어디로도 물이 나가지 못한다. (물을 붓지 않는 구멍으로 나가겠지만 그렇다고 치자…)

이게 바로 ‘허브’4(Hub:(특정 장소·활동의) 중심지, 중추, Herb 아니다.)이다.
1. 어딘가에서 신호가 들어오면 자기 자신을 제외한 모든 포트호로 신호를 증폭시켜 내보낸다.
2. 동시에 여러 포트에서 신호가 들어오면 처리하지 못한다.

※ 이것을 브로드캐스트(Broadcast)라고 한다. 신호를

스위칭 ‘허브’

Layer 2

1. Layer 1에서의 장비에 스위칭 기능을 추가한다.
즉, 누군가 신호를 쏘려고 하면 나머지 녀석들은 대기 하게 한다.
2. 각각의 장비에 주소를 부여한다.
즉, 모든 포트에 동일한 신호를 쏘는 것이 아니라 ‘선택적으로’ 신호를 전달한다.
여기에서의 주소는 우리가 흔히 말하는 MAC adress라고 하는 하드웨어의 물리적 주소를 의미한다.

이쯤에서 눈치를 챈 사람들도 있겠지만 허브에 ‘스위칭’ 기능을 추가함으로써 비로소 우리가 아는 ‘스위칭 허브’ 가 된 것이다.

Layer 3

신호가 정상적으로 전달되고, 장비들을 MAC 주소로 식별하여 신호를 전송한다.
L3에서는 TCP 라는 프로토콜을 이용해 신뢰할 수 있는 연결을 만든다

경로 설정을 통해 가장 빠르고 안정적인 경로를 찾아 연결을 수립한다.
(TCP나 신뢰할 수 있는 연결 등이 무엇인지는 따로 포스팅 하도록 하겠다)

Layer 4

신뢰할 수 있는 연결위에 암호화 기능을 추가한다.

애초에 L1은 무엇이고 L5는 무엇이니 하는 설명을 할 것은 아니었으니 이제 데이터가 어떻게 이동하는지 살펴보자. 누군가 한국에서 미국으로 편지를 보낸다고 가정해보자.

  1. 사용자가 편지를 쓰고 – 메시지 생성
    누군가 볼 수 없게 자물쇠가 담긴 상자에 넣고 잠근다. – SSL 암호화 – Layer4
  2. 상자에 우표를 붙이고 주소를 적어서 배달부에게 전달한다. – Layer 3
  3. 우편배달부는 우편물센터로 편지상자를 이동한다. – Layer 2
  4. 우편물센터에서 비행기에 실어 보낸다. – Layer 1
    ~
  5. 미국 우편물 센터에 편지 상자가 도착한다. – Layer 1
  6. 우편배달부는 편지상자를 우편물 센터에서 꺼내온다. – Layer 2
  7. 우편배달부는 편지상자를 수신자에게 전달한다. – Layer 3
  8. 수신자는 열쇠로 편지상자를 연다. – Layer 4

편지에 빗대 설명하자면 위와 같다.
풀어 설명하자면 OSI 7 Layer 참조 모델은 ‘각 영역마다 해야 하는 일의 표준’을 정해 놓은 것이다.

만약 송신자가 편지를 보냈는데 수신자에 도착하지 않았을 경우 편지가 미국의 우편물 센터까지 갔다고 한다면, 내가 보낸 신호가 (L4-> L3-> L2-> L1-> L1) 수신측까지 물리적 연결은 문제가 없다는 이야기 일 것이다.
또 만약 내가 보낸 편지가 수신자에게 전달은 됐는데 편지의 내용을 수신자가 모른다면 자물쇠에 문제가 있거나, 수신자가 열쇠를 가지고 있지 않아서이기 때문일 것이다.

이제 결론.
거창할 것 없다. OSI 7 Layer 참조모델은 ‘네트워크를 통해 통신을 하거나, 하는 프로그램을 만들 때 참고해야 하는 하나의 참고모델‘ 일 뿐이다.
OSI 7 Layer 참조모델을 참고해 만들어진 프로그램과 장비를 이용한다면, 위 편지의 예처럼
– 각 레이어마다 고유한 일을 하므로 하위레이어의 프로그램을 만들지 않아도 되고,
– 만약 문제가 생겼을 경우 어느 Layer에서 문제가 생겼는지만 파악하기도 쉽다.

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

Apache http 서버 구축 – #1. 설치

HTTP 데몬(HTTP Daemon), 즉 httpd는 웹 서버의 백그라운드에서 실행되어, 들어오는 서버 요청을 대기하는 소프트웨어 프로그램이다. 이 데몬은 자동으로 요청에 응답하며 HTTP를 사용하여 인터넷을 경유, 하이퍼텍스트, 멀티미디어 문서들을 서비스한다. HTTPd는 HTTP daemon의 준말이다. (예: 웹 서버)

yum 명령으로 패키지를 설치한다.

[root@class14 ~]# yum install -y httpd
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
epel/x86_64/metalink                                                                                                                                                                | 2.8 kB  00:00:00
 * base: mirror.kakao.com
 base                                                                                                                                                                                | 3.6 kB  00:00:00
(1/7): base/7/x86_64/group_gz                                                                                                                                                       | 153 kB  00:00:00
중략
(7/7): epel/x86_64/primary_db                                                                                                                                                       | 6.9 MB  00:00:03
Resolving Dependencies
--> Running transaction check
중략
---> Package httpd.x86_64 0:2.4.6-93.el7.centos will be an update
--> Processing Dependency: httpd-tools = 2.4.6-93.el7.centos for package: httpd-2.4.6-93.el7.centos.x86_64
--> Running transaction check
---> Package httpd-devel.x86_64 0:2.4.6-80.el7.centos will be updated
중략--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================================================================================================================
 Package                                           Arch                                        Version                                                     Repository                                 Size
===========================================================================================================================================================================================================
Updating:
 httpd                                             x86_64                                      2.4.6-93.el7.centos                                         base                                      2.7 M
Updating for dependencies:
 httpd-devel                                       x86_64                                      2.4.6-93.el7.centos                                         중략
Transaction Summary
===========================================================================================================================================================================================================
Upgrade  1 Package (+4 Dependent packages)

Total download size: 4.4 M
Downloading packages:
No Presto metadata available for base
(1/5): httpd-devel-2.4.6-93.el7.centos.x86_64.rpm                                                                                                                                   | 198 kB  00:00:00
중략
(5/5): httpd-2.4.6-93.el7.centos.x86_64.rpm                                                                                                                                         | 2.7 MB  00:00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                       19 MB/s | 4.4 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : httpd-tools-2.4.6-93.el7.centos.x86_64                                                                                                                                                 1/10
중략
  Verifying  : httpd-manual-2.4.6-80.el7.centos.noarch                                                                                                                                               10/10
Updated:
  httpd.x86_64 0:2.4.6-93.el7.centos
Dependency Updated:
  httpd-devel.x86_64 0:2.4.6-93.el7.centos           httpd-manual.noarch 0:2.4.6-93.el7.centos           httpd-tools.x86_64 0:2.4.6-93.el7.centos           mod_ssl.x86_64 1:2.4.6-93.el7.centos
Complete!
[root@class14 ~]# rpm -qa | grep httpd
httpd-manual-2.4.6-93.el7.centos.noarch
httpd-2.4.6-93.el7.centos.x86_64
httpd-tools-2.4.6-93.el7.centos.x86_64
httpd-devel-2.4.6-93.el7.centos.x86_64

서비스 구동

 # 별도의 설정 없이 구동을 하면 기본 값으로 실행된다.
[root@class14 ~]# service start httpd
Redirecting to /bin/systemctl start httpd.service
 # 또는
[root@class14 ~]# systemctl start httpd.service

서비스 구동 확인

[root@class14 ~]# netstat -nltp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      2411/httpd
 # 또는
[root@class14 ~]# netstat -nltp | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      2411/httpd
tcp6       0      0 :::443                  :::*                    LISTEN      2411/httpd
[root@class14 ~]#
웹브라우저로 접속 성공한 모습.

접속이 안될 경우
※ 다양한 원인이 있을 수 있으나 linux 방화벽 (iptables, firewalld)에 의해 막히는 경우가 많다.

[root@class14 ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
 # 또는
[root@class14 ~]# service iptables stop
 # CentOS6 이하, CentOS7 이상에서 firewalld 를 삭제하고 iptables를 구동 했을 때

YUM repository 구축 – local

이전 포스트에서 설명 한 것처럼 설정된 repository에서 패키지를 다운로드하고 설치하는데 도움을 준다.
이를 위해서는 언급 한 것과 같이 RPM패키지들과 이들 정보를 가진 repository가 필요하다.
일반적인 환경에서는 공용 repositoy (Kakao, naver, KAIST)등에서 제공하는 mirror 사이트를 이용하면 되지만, 폐쇠망 이나, 네트워크 상태가 좋지 않은 경우를 대비해 로컬(서버에 저장)이나, 내부망에 repository를 구축 할 수도 있다.

생각보다 구축 방법은 단순하다.
1. RPM패키지 파일 다운로드
2. repository 정보 생성
3. repo 파일 생성(구축된 repository 서버 정보 기록)
4. 네트워크 접근을 허용할 경우위한 http 서버 구축

로컬 리포지터리 생성

※CentOS7.8 (모든 패키지 포함) 미디어 파일을 이용한 구축의 예

필요 패키지 설치

 # repository 구축을 위한 필수 패키지 다운로드
[centos:/home:]# yum install createrepo yum-utils
Loaded plugins: fastestmirror, langpacks
중략
 * updates: mirror.kakao.com
base                                                                                                                                       | 3.6 kB  00:00:00
중략
(5/5): updates/7/x86_64/primary_db                                                                                                         | 4.5 MB  00:00:01

==================================================================================================================================================================
 Package                               Arch                               Version                                       Repository                           Size
==================================================================================================================================================================
Updating:
 yum-utils                             noarch                             1.1.31-54.el7_8                               updates                             122 k

Transaction Summary
==================================================================================================================================================================
Upgrade  1 Package
후략

설치미디어 파일 다운로드

 # 설치 미디어 파일 다운로드
[centos:/home:]#  wget http://mirror.navercorp.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-Everything-2003.iso

iso 파일 마운트

[centos:/home:]# mkdir /mnt/centos
[centos:/home:]# mount CentOS-7-x86_64-Everything-2003.iso /mnt/centos
mount: /dev/loop0 is write-protected, mounting read-only

repodata 생성

[centos:/home:]# mkdir /home/repo-data
 # 패키지 파일을 복사할 디렉토리 생성.
 # 마운트 한 ISO 파일 경로를 직접 지정할 수도 있지만, 이 경우 마운트 정보를 변경 해야 한다.
[centos:/home:]# cp /mnt/centos/Packages/*.rpm /home/repo-data/
 # 패키지 파일 복사 centos 7.8.2003 iso 기준으로 10070개 rpm 파일이 존재한다.

[centos:/home:]# createrepo /home/repo-data/
Spawning worker 0 with 2518 pkgs
Spawning worker 1 with 2518 pkgs
Spawning worker 2 with 2517 pkgs
Spawning worker 3 with 2517 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

repo 파일 생성

[centos:/home:]# vi /etc/yum.repos.d/local.repo
 #여기부터 붙여넣기 한다.
[haedongg_local-repo]
name=haedongg_local-repo
baseurl=file:////home/repo-data
 # createrepo 명령으로 생성된 repodata 가 있는 디렉토리를 지정한다.
enabled=1
gpgcheck=0