http와 https 차이를 이해하기 쉽도록 간단히 요약해 보겠습니다.


HTTP


http는 클라이언트인 웹브라우저와 웹서버간 통신을 주고 받는 프로토콜이다.

html 페이지도 텍스트이고 http 도 텍스트 교환 방식으로 단순히 텍스트를 주고 받기 때문에 누군가가 통신 중간에 가로 챌 수 있어 노출되기 쉽다. 이러한 보안상의 문제를 해결하기 위한 방식으로 https 프로토콜을 사용한다.


HTTPS


https 는 공개키 암호화 방식을 따른다. 

서로 다른 A와 B의 키가 존재하여 문서를 A로 암호화한 것은 B를 통해 해독할 수 있고, B로 암호화한 것은 A를 통해 해독할 수 있는 방식이다. 


참고로, HTTPS 의 S는 Secure Socket 이라는 뜻이다.


이와 같은 방식으로 예를들어 웹브라우저는 A라는 키를 가지고 있고 웹서버는 B라는 키를 가지고 있습니다. 데이터를 보낼때 각자가 가지고 있는 키를 통해 암호화하여 전달하면 받는 사람은 자신이 가지고 있는 키를 통해 해독하여 내용을 확인 할 수 있습니다. 


사실, 이와 같은 방식은 보안상으로는 큰 의미는 없다. 왜냐하면 누구나 다 A라는 공개키를 얻을 수 있기 때문이다. 대신에 얻을 수 있는 다른 이점은 해당 서버로부터 온 응답이라는 점은 확신 할 수 있다는 것이다.

왜냐하면, 내가 가지고 있는 공개키로 해독이 가능 했기 때문이다.


웹브라우저가 공개키 어떻게 가질 수 있을까?


일단 공개키 저장소인 CA(Certificate Authority)라는 곳을 알아야 한다. CA 인증 기관은 신뢰할 수 있는 기업만 운영할 수 있다고 한다.


1. 웹서버에서 HTTPS 를 적용하기 위해 공개키 A와 개인키 B를 만들고 CA 인증 기관에 공개키 A를 관리해달라고 돈을 지불하면서 계약을 합니다.


2. 공개키 A를 받은 CA 기관은 공개키 A, CA 기관명, 공개키 암호화 방법 등의 정보를 담은 인증서를 만들고, 이 인증서를 CA 기관 자신의 개인키로 암호화 하여 웹서버에게 제공합니다.


3. 암호화된 인증서를 갖게된 웹서버는 HTTPS 요청이 아닌 요청이 오면 이 암호화된 인증서를 클라이언트에게 줍니다.

 ex) 클라이언트가 index.html 파일을 달라고 요청 했을 경우.


4. 브라우저는 세계적으로 신뢰할 수 있는 CA 기업의 공개키는 브라우저가 이미 알고 있습니다. 브라우저가 CA 기업 리스트를 살펴보면서 인증서에 적혀있는 CA기업 이름이 같으면 해당 기업의 공개키로 암호화된 인증서를 해독합니다.

(아까 위에서 암호화된 인증서를 CA 기업의 개인키로 암호화하여 웹서버에 전달 하였습니다.) 이렇게 안호화된 인증서를 해독하게 되면 웹서버의 공개키를 클라이언트인 웹브라우저가 알 수 있게되고 웹서버와 통신을 할 때 이 공개키로 암호화 하여 통신을 할 수 있게 됩니다.


HTTPS 방식은 무조건 안전한 것이 아닙니다


날이 갈수록 공격자는 섬세해 집니다. 역으로 HTTPS에 대한 신뢰를 이용하여 공격하기도 합니다.

공격자는 Let's Encrypt 같은 증명 발급처에서 무료로 증명서를 발급 받을 수 있다고 합니다고 합니다. 단순히 도메인 주소에 나타나 있는 초록색 안전함만을 믿어서는 안되겠습니다.



[출처] "티스토리," 기본기를 쌓는 정아마추어 코딩블로그, 2017년 11월 5일 수정, 2019년 3월 19일 접속, https://jeong-pro.tistory.com/89

JDK, JRE, JDK 의 풀네임을 생각하면 오래 기억하기 편할 것 같다.


JVM 

Java Virtual machine 의 약자입니다.

자바에서 컴파일 과정을 거쳐 만들어진 자바 바이너리 파일(.class)을 실행할 수 있도록 한다.


JRE

Java Runtime Environment 의 약자입니다.

JVM에서 자바 프로그램을 실행시킬 때 필요한 라이브러리 등 파일들을 가지고 있다.

자바를 실행시키기 위한 환경을 구축했다고 보면 된다.


JDK 

Java Development Kit 의 약자입니다.

JDK는 JRE +  개발을 위한 도구들을 포함하고 있다.


포함관계 이미지



출처 : "점프 투 자바", 2013년 8월 26일 수정, 2019년 03월 19일 접속, https://wikidocs.net/257

내용물을 까보면 자바에서는 Arrays.sort() 알고리즘으로 듀얼-피봇 퀵정렬을 사용한다.


DualPivotQuicksort 클래스에서 경우에 따라 다르게 정렬 시킨다.

47 미만의 작은 배열 : 삽입 정렬

286 미만의 작은 배열 : 퀵 정렬

그 이상 나머지 : 듀얼-피봇 퀵정렬


Arrays.Sort() : 배열 오름차순 정렬


// Arrays.Sort() : 배열 오름차순 정렬

int[] intArr = {8, 2, 5, 1, 9, 10, 3, 4, 6, 7};
Arrays.sort(intArr);
System.out.println("result : " + Arrays.toString(intArr));

결과: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]




Collections.Sort() : 리스트 오름차순, 내림차순 정렬


// Collections.Sort() : 리스트 오름차순 정렬

Integer[] intArr = {8, 2, 5, 1, 9, 10, 3, 4, 6, 7};
List<Integer> list = Arrays.asList(intArr);
Collections.sort(list);
System.out.println(list.toString()); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// Collections.reverse() : 정렬 뒤집기

Collections.reverse(list);
System.out.println(list.toString()); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]





 : 참고 "티스토리," 나야님의 블로그, 2008년 03월 31일 수정, 2019년 03월 19일 접속, https://thebasis.tistory.com/31


'규린이 IT 개발' 카테고리의 다른 글

Balanced Tree  (0) 2019.04.29
http, https 의 차이  (0) 2019.03.19
JVM, JRE, JDK 차이 간단 요약  (0) 2019.03.19
CentOS7 - VirtualBox 디스크 용량 증설 방법  (0) 2019.03.15
윈도우에서 Virtual Box 설치 방법  (2) 2019.03.12


 VirtualBox 에서 가상 디스크 용량 증설


현재 용량을 파악합니다.

변경된 내용을 정확히 파악하기 위해 아래 두 명령어에 대한 결과를 캡쳐 하시는 것을 추천합니다.


fdisk -l


df -h



8GB 정도 사용하고 있습니다.


hadoop04 서버를 10GB 로 늘려 주겠습니다.


파일 -> 가상 미디어 관리자 클릭


증설하고자 하는 vdi를 선택 -> 원하는 크기로 늘린다. -> 적용 (줄이는 것은 안됨)



가상머신의 설정 -> 저장소 -> 용량 증가를 확인.




* VBoxManage를 통해 cmd창에서 명령어로 바꿔주는 방법도 있습니다.


fdisk -l 명령어로 증설된 용량을 확인합니다.




증설된 용량을 확인하셧다면 그 다음으로는 파티션 설정을 합니다

가상 디스크 용량은 커졌지만 파티션 설정이 아직 그대로이기 설정을 다시 해주어야 합니다.


- 파티션 설정


# fdisk /dev/sda

아래 순서대로 입력합니다.

d ( 파티션 삭제를 진행하겠다. )

2 ( 두번째 파티션 /dev/sda2 삭제 )

n ( 새로운 파티션을 생성하겠다 )

p ( Primary 파티션 선택 )

2 ( 두번째 파티션으로 선택 )

엔터 

엔터 

( 변경사항 저장 )

# reboot ( 적용을 위해 재부팅 )


- 물리 볼륨 사이즈 재조정

# pvresize /dev/sda2

# pvscan  ( 반영 여부 확인 )

- 논리 볼륨 늘리기

# lvextend -l +100%FREE /dev/mapper/centos-root  

- 논리 볼륨 사이즈 재조정

# lvresize -r -l +100%FREE /dev/mapper/centos-root    

- 확인

# fdisk -l

# df -h

















centOs7 설치가 완료 되었다는 것을 가정하고 시작하겠습니다.


서버 접속시 root 계정으로 접속하도록 하겠습니다.




접속 후 기존 자바 jdk 를 삭제하고 새로 깔아줍니다.

디폴트로 Open JDK 로 해도 된다고 하지만 많은 블로그에 올라와있는 내용이 Oracle JDK 를 예시로 사용하고 있어 일단 나도 똫같이 했다.

참고로, 두 JDK 스펙은 Open JDK 6버전 까지는 성능상의 이슈가 있었다고 한다. 7 이후로는 둘다 비슷하다고 합니다.




자바 설치 유무를 확인합니다.


yum list installed java*

또는

rpm -qa | grep java


자바가 설치되어 있다면 삭제하여 줍니다.


자바 삭제 명령어

yum remove [삭제할 패키지]

ex) yum remove java-1.7.0.-openjdk.x86_64


삭제 후 자바를 새로 설치하기 위해 자신의 리눅스가 몇 비트인지 확인합니다.

getconf LONG_BIT


자신의 비트에 맞게 오라클 jdk 를 다운받아 줍니다.

저는 64bit 이고 자바 1.8 버전을 다운받았습니다.


압축을 풀어 /usr/local 경로로 보냅니다.

mv jdk1.8.0_201 /usr/local


작업을 편리하게 하기 위해 심볼릭 링크를 걸어줍니다.


ln -s jdk1.8.0_201 java


ll 명령어를 사용시 다음과 같이 설정된 모습을 확인할 수 있습니다.




심볼릭 링크란?

 윈도우의 바로가기와 비슷한 개념과 비슷합니다. 링크로 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내도록 합니다.


어디서든지 사용할 수 있도록 환경 변수에 등록합니다.


vi /etc/profile


맨 마지막에 다음과 같이 내용을 추가 합니다.


export JAVA_HOME=/usr/local/java

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH="."


설정을 적용하기 위해 아래와 같은 명령어를 입력해 줍니다.

source /etc/profile


/etc/profile과 /.profile 파일은 사용자가 로그인했을때 스크립트가 적용이 되기때문에

수정된 내용을 바로 적용하기 위해 source 명령어를 사용합니다.


자바 설치 및 설정이 잘 되었는지 확인합니다.

java -version



 클러스터링 할 서버 증설


서버를 닫고 VirtualBox 에서 서버 우클릭 후 복제


모든 네트워크 카드의 MAC 주소 초기화를 꼭 체크해줍니다.



완전한 복제를 선택하여 복제(총 4개의 서버를 가지고 할 것입니다)





복제 완료 후 각각의 서버 네트워크를 설정해 주어야합니다.

설정 -> 네트워크를 어댑터에 브리지로 설정 하여 주시고 이름은 각자 사용하는 네트워크에 맞게 설정해 주세요




서버 접속은 root 계정으로 접속.


접속 후 모든 서버의 CentOS 방화벽은 꺼두도록 합시다. (클러스터링 환경이기 때문에 서로 통신을 하기 위함.)


방화벽 끄기

systemctl stop firewalld

systemctl disable firewalld


방화벽 상태 확인

firewall-cmd --state


각각의 계정에 호스트 네임을 지정해 줍니다.

vi /etc/hostname




저는 hadoop01, hadoop02, hadoop03, hadoop04 로 변경하여 주었습니다.


* 설정 방법 예시(1번 서버)



다음으로는 hosts 파일에 클러스터링할 서버 정보를 추가해줍니다.

vi /etc/hosts


기존에 있는 내용은 전부 지우고 아래과 같이 작성합니다.(예시)


IP 주소 확인 방법

ip addr


다른 서버도 마찬가지로 설정한 다음 재시작 해줍니다.


재시작


reboot



* ssh 접속 설정


ssh-keygen으로 공개키/비밀키 한 쌍을 생성하고, 공개키 내용을 접속할 서버에 저장하면 해당 서버에 비밀번호 없이 ssh 접속이 가능합니다.(일단 방화벽이 꺼져 있어야 함)


모든 서버에 ssh 키젠을 생성합니다.


ssh-keygen -t rsa


엔터 3번


~/.ssh/id_rsa.pub 에 공개키가 저장 됩니다.

이 공개키의 내용을 접속할 서버의 ~/.ssh/authorized_keys 에 추가 할 것입니다.


접속할 서버의 authorized_keys 파일에 공개키 추가.

ssh-copy-id [계정]@[접속할 서버 ip]

예시) ssh-copy-id root@hadoop02


ssh를 통해 접속을 확인

ssh [계정]@[접속할 서버 ip]


암호를 묻지 않는다면 올바르게 설정이 된 것입니다.


각각 모든 서버에 서로 전부 되도록 설정하여 줍니다.(자기자신의 서버에도 적용)


* 하둡 설치


hadoop01(master) 서버에서 설치 후 나머지 hadoop02, hadoop03, hadoop04 서버(slave)에 배포 할 예정입니다.


하둡 공식 홈페이지 : https://hadoop.apache.org/


Version : 2.6.5



다운로드 후 압축을 풀고 /usr/local 위치로 파일을 옮긴다음 hadoop으로 심볼릭 링크를 생성하여 줍니다.




hadoop 명령어를 사용하기 위해 /etc/profile 에 환경 변수를 다음과 같이 수정합니다.



이 후 하둡의 실행 환경 변수를 설정해 주어야 합니다.


/usr/local/hadoop/etc/hadoop/ 하둡의 설정파일의 경로로 찾아갑니다.


hadoop-env.sh 수정

자바 패스가 디폴트로 저장되어 있던 것을 다음과 같이 수정



hadoop-env.sh 맨위에는 다음과 같이 환경 변수를 추가해 줍니다.



yarn-env.sh 수정



slaves 파일 수정

기존 내용을 삭제하고 Data node 들의 서버를 지정해줍니다.



core-site.xml 수정

property 내용을 적어줍니다.

tmp 파일이 없기 때문에 /usr/local/hadoop/ 파일 위치에 tmp 파일을 만들어줍니다.

mkdir /usr/local/hadoop/tmp



hdfs-site.xml 수정

hadoop01를 namenode로 지정하고 hadoop02를 보조노드로 지정했습니다.




mapred-site.xml 수정

기본적으로는 mapred-site.xml 파일이 없습니다. mapred-site.xml.template을 복사하여 만든 후 수정합니다.


cp mapred-site.xml.template mapred-site.xml




yarn-site.xml 수정




* Slave 들에게 배포하기


>> slave 에 hadoop-2.6.5 파일을 배포합니다.

scp -r hadoop-2.6.5 root@hadoop02:/usr/local

scp -r hadoop-2.6.5 root@hadoop03:/usr/local

scp -r hadoop-2.6.5 root@hadoop04:/usr/local


>> 각 서버에서 하둡 디렉토리의 심볼릭 링크를 생성합니다.

ln -s /usr/local/hadoop-2.6.5 hadoop


>> profile 전송

scp /etc/profile root@hadoop02:/etc/profile

scp /etc/profile root@hadoop03:/etc/profile

scp /etc/profile root@hadoop04:/etc/profile


slave 노드들에서 자바와 하둡이 잘 설치되었는지 확인합니다.


java -version

hadoop version


* hadoop 실행


환경 설정 및 설치가 완료되었으니 이제 hadoop 서버를 실행시켜 봅니다.

우선 실행전에 포맷을 진행합니다.


hadoop namenode -format


~$HADOOP_HOME/sbin/start-all.sh 으로 실행시켜 줍니다.( 중지는 stop-all.sh )


실행 화면입니다.


하둡 현황 파악 : localhost:8088

Active Nodes : 3 ( 3개의 slave 존재 확인 )



HDFS 확인 : localhost:50070

Live Nodes : 3 ( 3개의 slave 존재 확인 )




jps 명령어를 통해 동작이 되고 있는지 확인 가능하다.




JPS(Java Virtual Machine Process Status Tool) 명령어

jvm 위에서 돌아가는 프로세스를 확인할 수 있다.



* 시행착오

리눅스 환경에 익숙하지 않고 하둡에 처음 접하는거라 많은 삽질의 시간을 가졌습니다.


삽질에 관한 후기도 남기겠습니다.


첫번째, 가상 네트워크 환경을 만드는 곳에서 애좀 먹었습니다.

두번째, ssh 인증 문제로 hadoop01 에서만 공개키를 전달하고 다른 서버에서 hadoop01로 공개키를 전달하지 않아서 문제가 발생했었습니다.

세번째, 데이터 노드에서 네임노드로 connection 이 안되는 로그가 떠서 삽질을 했었는데 방화벽 상태를 보니 돌아가고 있었습니다. 

(ㅡㅡ.. 언제부터 돌아가고 있었냐..)


오류가 발생하면 일단 stop-all.sh 로 작동을 멈추고 jps 로 프로세스가 켜져있는지 확인 한 후 켜져있을 경우 프로세스를 킬 해줍니다.

그리고 모든서버에서 logs 폴더안에 있는 log를 띄운다음 다시 start-all.sh 을 이용하여 켜준다음 에러 로그를 파악해야합니다.


로그 확인 방법

tail -10000f [log 파일명]

예시) tail -10000f hadoop-root-namenode-hadoop01.log










- Virtual Box 다운로드 링크

https://www.virtualbox.org/wiki/Downloads


1) 먼저 VirtualBox 다운로드 페이지에 접속 합니다.

* 아래 이미지의 첫번쨰 링크는 구버전, 그 아래는 신버전입니다. 입맛에 맞게 다운받아 주세요(저는 구버전..^^)




2) exe 파일 다운로드 완료 후 체크된 옵션들은 그대로 두고 Next 버튼을 쭉 눌러줍니다.


3) 호스트 자원을 공유하기 위해 드라이버를 설치 해주어야 합니다.

4) 설치 끝.


* 특정 기능을 사용하기 위해서는 확장팩 설치가 필요합니다. 여기서는 다루지 않겠습니다.

+ Recent posts