일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- intellij ide
- 사설 ip
- cosine similarity metric
- goland
- GoF
- 배포 파이프라인
- Logrus
- 티스토리챌린지
- 오블완
- golang
- 디자인패턴
- 윈도우키보드
- m4 pro
- Kubernetes
- http 413
- notification system
- kube-prometheus-stack
- elasticsearch
- 코사인 유사성 메트릭스
- body size
- apollo router
- 배포 프로세스
- go
- Intellij
- gitops
- Buffered channel
- 대규모 시스템 설계
- AWS
- Infra
- UnBuffered channel
- Today
- Total
Fall in IT.
IT 인프라 구조 총정리 본문
IT 인프라란?
애플리케이션을 가동시키기 위해 필요한 하드웨어나 OS, 미들웨어, 네트워크 등 시스템의 기반을 말합니다.
시스템 요구사항이라고하면 두 가지로 정리할 수 있습니다.
- 기능적 요구사항
어떤 기능을 하는지, 무엇을 할 수 있는지
- 비기능적 요구사항
시스템의 성능, 안정성, 확장성, 보안 등
IT 인프라는 이런 비기능적인 요구사항과 관련이 있습니다.
개발자에게 인프라 지식이 필요한 이유
예전에는 데이터센터나 서버실에 서버를 직접 두고 관리하던 On-premise 방식이었기 때문에 물리적 서버를 담당하는 엔지니어가 따로 존재했습니다.
그러나, 최근에는 On-premise방식에서 Cloud 방식으로 넘어오게 되면서 개발자가 배포나 테스트 등을 직접 할 수 있게 되었고 이로 인해서 인프라 관련 지식이 필요하게 되었습니다.
인프라 구성요소
- Hardware, HW
서버 장비 본체나 데이터를 저장하기 위한 스토리지, 전원 장치 - Network
사용자가 원격으로 접근할 수 있도록 서버를 연결하는 도구들 - Operating System, OS
하드웨어와 네트워크 장비를 제어하기 위한 기본적인 소프트웨어
Client OS(Windows, macOS 등)
Server OS(Linux, Unix, Windows Server 등) - Middleware
서버 상에서 서버가 특정 역할을 하도록 기능을 제공하는 소프트웨어
On-premise & Cloud
On-premise 방식
온프레미스는 데이터 센터나 서버실에 서버를 두고 직접 관리하는 방식을 말합니다. 전통적이고 지금도 널리 사용되고 있습니다. 직접 관리할 수 있고, 기밀성이 높은 장점도 있으나, 장비들이 상당히 고가이고 사용량 예측이 불가하다는 단점이 있습니다.
Cloud 방식
Cloud란, 클라우드 프로바이더가 데이터 센터와 인프라를 보유하고 사용자에게 제공하는 형태
트래픽 변동이 많을 수 있거나 많을 경우 유리한 방식 입니다. 초기 투자금이 적은 스타트업이나 개인 개발자에게는 사용한만큼 값을 지불하는 Cloud 방식이 유리합니다.
- Public Cloud
인터넷을 통해 불특정 다수에게 제공되는 시스템. 대표적으로 AWS, GCP, Azure가 있습니다. - Private Cloud
퍼블릭 클라우드에서 이용자를 한정한 형태
보안이 좋고 독자적인 서비스를 추가하기 쉽습니다. - Hybrid Cloud
온프레미스와 클라우드를 함께 사용하는 형태
하드웨어
인프라에서 가장 low-level을 맡고 있는 것이 하드웨어와 네트워크입니다. 온프레미스 시스템은 여러 대의 서버 장비로 구성됩니다. 클라우드에서는 인스턴스의 하드웨어 성능에 따라 선택할 수 있습니다.
CPU (Central Processing Unit, 중앙처리장치)
CPU 성능은 코어와 캐시에 영향을 받습니다. 코어가 많을수록 동시에 처리하는 연산이 늘어나고 메모리와의 처리 속도를 완화하기 위한 캐시는 크기가 클수록 성능이 좋습니다. CPU가 직렬 처리에 최적화된 몇 개의 코어로 구성된 반면, GPU(Graphics Processing Unit)는 병렬처리에 최적화된 작고 많은 코어로 이루어져 있습니다.
메모리
주기억장치인 메모리는 데이터 용량이 크거나 전송 속도가 고속일수록 고성능입니다. 서버용으로는 전력 소모가 적고 오류 처리가 탑재되어 있는 것을 주로 선정합니다.
데이터 스토리지
데이터를 저장하는 디바이스입니다. 보통 스토리지의 속도가 제일 느리기 때문에 스토리지의 용량이나 읽기, 쓰기 속도가 시스템 전체의 속도에 영향을 주는 경우가 많습니다. 하드디스크나 SSD 등으로 이루어져 있습니다.
IT에서 가장 중요한 것은 데이터라고 할 수 있는데요. 이런 데이터가 손실되면 안되기 때문에 대부분 고가용성(High Availability, HA, 오랜 기간 동안 지속적으로 운영되는 것)을 위해 이중화(redundancy) 또는 다중화로 구성합니다. 이중화란 같은 장비 또는 시스템이 장애가 나는 것을 대비해 같은 모듈을 2개 (또는 그 이상)을 준비하는 것을 말합니다.
아래 그림은 AWS에서 DB를 같은 리전 내 다른 가용 영역에 분산하여 이중화 구성한 모습니다. AWS에서는 이를 다중 AZ배포라고 합니다.
기타 하드웨어
이 외에도 전원 차단을 방지하는 무정전 전원공급장치(Uninterruptible Power Supply, UPS)나 여러 대의 서버를 관리하기 위한 KVM 스위치, 서버 장비 설치에 이용하는 서버 랙 등이 있습니다.
방화벽
방화벽은 보안을 위해 내부 네트워크와 외부 네트워크의 통신을 제어하고 불필요한 통신을 차단하는 것을 말합니다.
- 패킷 필터형 포트 번호나 IP 주소를 바탕으로 필터링
- 애플리케이션 게이트웨이형 애플리케이션 프로토콜 레벨에서 외부와의 통신을 제어하는 방식. 일반적으로 프록시 서버라고 부릅니다. 세션에 포함되어 있는 정보를 검사합니다. 패킷 필터형에 비해서 속도는 느리지만 많은 검사를 수행할 수 있습니다.
네트워크
MAC 주소 (물리 주소 / 이더넷 주소)
물리적으로 할당되는 48bit 주소입니다. 앞 24bit는 네트워크 부품의 제조업체를 식별하고 뒤 24bit는 각 제조업체가 중복되지 않도록 할당합니다. 16진수로 표기하며 2byte씩 구분해서 표기합니다.
IP주소
인터넷이나 인트라넷 같은 네트워크에 연결된 장비에 할당되는 번호입니다. IPv4, IPv6 방식 두 가지가 있으며 일반적으로 IPv4를 사용합니다.
- IPv4 8bit씩 4개로 구분된 32bit 입니다. (ex. 192.168.1.1) 각 자리는 0~255까지 표현이 가능합니다. 따라서, 하나의 네트워크에 2의 32승, 약 42억개까지 밖에 연결할 수 가 없어서 인터넷 IP 주소가 고갈될 우려가 있습니다. 이를 해결하기 위해서 나온 IP 주소체계가 IPv6입니다. 또한, 사내 네트워크에서는 사설 IP를 사용하고 인터넷으로 나가는 경계에서는 공인IP를 사용하는 NAT 장비를 사용합니다.
- IPv6 128bit의 IP주소를 사용하고 있습니다.
OSI 모델 (Open System Interconnection Model)
통신을 할때 서로 어떻게 메시지를 주고 받고 어떤 언어를 사용할지 규칙이 필요합니다. 이런 규약을 통신 프로토콜이라고 합니다.
OSI 모델은 국제 표준화기구(International Organization for Standardization, IOS)에서 만든 컴퓨터의 통신 기능을 계층 구조로 나눈 모델입니다. 이를 이용하면 특정 네트워킹 시스템에서 일어나는 일을 계층을 활용해 시각적으로 이해할 수 있습니다. 총 7계층으로 이루어져 있습니다. 데이터가 네트워크로 나갈 때는 위층에서부터, 네트워크에서 데이터를 받을 때는 아래층에서부터 들어옵니다. 그림에서 오른쪽은 인터넷에서 사용하는 TCP/IP 계층 모델입니다.
- 물리 계층 (Phisical Layer)
전송 케이블이 직접 연결되는 계층으로 케이블을 통해 전송하는 기능을 합니다. 전압과 전류의 값을 할당하거나 케이블이나 커넥터의 모양 등 통신 장비의 물리적 전기적 특성을 규정합니다. 예를 들어 LAN 케이블로 사용되는 트웨스트 페어 케이블(STP/UDP)이나 이더넷(Ethernet) 규격인 100BASE-T 또는 IEEE802.11 시리즈의 무선 통신 등이 있습니다. - 데이터 링크 계층 (Data Link Layer)
동일한 네트워크 간 인접한 두 시스템(노드) 간 통신을 규정합니다. 물리 계층이 데이터를 보내고 받고 하는 기능을 한다면 데이터 링크 계층은 물리 계층이 잘 동작하고 있는지 확인하는 역할입니다. 네트워크 계층에서 데이터 패킷을 받아들여 MAC 주소와 각종 제어 정보를 추가합니다. 이때 추가적인 정보를 가지고 있는 데이터 단위를 프레임이라고 하고 물리 계층을 통해 전송됩니다. - 네트워크 계층 (Network Layer)
서로 다른 네트워크 간 통신을 위한 규정입니다. 특정 서버로 가는 경로를 효율적으로 처리하는 라우팅(routing) 기능이 있습니다. 데이터 링크 계층이 MAC 주소를 기반으로 한다면 네트워크 계층은 IP 주소를 기반으로 합니다.
데이터 계층이 노드 간 전달을 담당하는 반면 네트워크 계층은 송신지에서 최종 수신지까지 데이터를 안전하게 전달하는 것을 담당합니다. 이를 위해 패킷의 이동량이 많을 때는 패킷의 흐름을 제어하는 흐름제어(flow control) 기능과 전송 중 분실되는 패킷을 감지하고 재전송을 요구하는 오류 제어 기능을 가지고 있습니다. - 전송 계층 (Transport Layer)
데이터 전송을 제어하는 계층입니다. 보낼 데이터의 용량, 속도, 목적지 등을 처리합니다.
세션 계층에서 보낸 메시지를 세그먼트로 나누고 각 세그먼트의 순서 번호를 기록해서 네트워크 계층으로 보내면 받는 쪽에서는 이를 다시 조립합니다. 이런 방식으로 전송 오류의 검출이나 재전송을 규정합니다. 대표적인 프로토콜로는 TCP와 UDP가 있습니다. - 세션 계층 (Session Layer)
애플리케이션 간 연결을 유지 및 해제하는 역할을 합니다. 커넥션 확립 타이밍이나 데이터 전송 타이밍 등을 규정합니다. - 프레젠테이션 계층 (Presentation Layer)
데이터를 애플리케이션이 이해할 수 있도록 변환해주는 역할을 합니다. 데이터의 저장 형식, 압축, 문자 인코딩 등을 변환하고 데이터를 안전하게 전송하기 위해 암호화, 복호화하는 기능도 이 계층에서 처리합니다. - 응용 계층(Application Layer)
최상위 계층으로 웹 브라우저나 아웃룩처럼 사용자가 직접 사용하는 어플리케이션을 의미합니다.
리눅스 Linux
리눅스는 Linus Torvalds가 개발한 Unix 호환 서버 OS 입니다. 오픈소스로 여러 기업이나 개인의 참여로 만들어지고 있습니다. 컴퓨터 역사상 가장 많은 인력이 들어간 오픈소스 프로젝트라고 합니다.
Linux Kernel
커널이란 OS의 코어가 되는 부분을 말합니다. 메모리 관리, 파일 시스템, 프로세스 관리, 디바이스 제어의 역할을 합니다. 안드로이드 또한 리눅스 커널을 기반으로 만들어졌습니다.
디바이스 관리
리눅스 커널은 CPU, 메모리, 디스크, IO 등 하드웨어를 디바이스 드라이버라는 소프트웨어를 이용해 제어합니다.
프로세스 관리
리눅스는 프로그램 파일에 쓰여 있는 내용을 읽어서 메모리 상에서 처리하는데 이렇게 실행된 프로그램을 프로세스라고 합니다. 이 프로세스를 식별하기 위해서 PID(Process ID)를 붙여서 관리하고 각 프로세스에 필요한 자원을 효율적으로 할당합니다.
메모리 관리
프로세스에 필요한 메모리를 할당하고 해제합니다. 다만 메모리가 부족한 경우에는 하드디스크와 같은 보조기억장치에 가상 메모리 영역을 만들어서 사용하는데 이를 스왑(swap)이라고 합니다.
쉘 Shell
사용자는 쉘이라는 커맨드라인 인터페이스를 통해 명령어를 커널로 전달할 수 있습니다. 또한, 쉘에서 실행하고자 하는 명령을 모아놓은 것을 쉘 스크립트(shell script)라고 합니다.
파일시스템
파일 시스템이란 파일에 이름을 붙여서 어디에 저장할지 나타내는 체계입니다. 즉, 파일을 관리하는 시스템입니다.
리눅스 커널은 가상 파일 시스템(Virtual File System, VFS)을 사용합니다. 사용자의 입장에서 각 데이터가 저장되어 있는 위치(하드 디스크, 메모리, 네트워크 스토리지 등)와 상관없이 그냥 파일처럼 사용할 수 있도록 합니다.
디렉토리 구성
리눅스 디렉터리 목록은 FHS(Filesystem Hierarchy Standard)라는 규격으로 표준화되어 있습니다. 대부분의 주요 배포판은 이 FHS를 기반으로 디렉터리를 구성합니다.
미들웨어 Middleware
미들웨어는 OS와 비즈니스를 처리하는 애플리케이션 사이에 들어가는 각종 소프트웨어를 말합니다. 웹서버, DBMS. 시스템 모니터링 툴 등이 있습니다.
웹 서버 Web Server
웹 서버는 클라이언트가 보낸 HTTP 요청을 받아 웹 콘텐츠를 응답으로 반환하거나 서버쪽 애플리케이션을 호출하는 기능을 가진 서버입니다.
- 아파치 서버 폭 넓게 사용되는 전통의 오픈소스 웹 서버
- NginX 소비 메모리가 적으며 리버스 프록시와 로드밸런서 기능을 갖추고 있는 오픈소스 웹 서버
DBMS (Database Management System)
데이터베이스 관리 시스템으로 데이터베이스를 관리하는 미들웨어입니다. 벤더마다 구문이 조금씩 다르고 지원하는 기능과 성능, 가격이 천차만별입니다.
대표적인 DBMS(RDBMS) 종류
- Oracle 글로벌 DB 시장 점유율 1위. 상당히 고가인만큼 많은 기능을 제공합니다.
- MySQL 가장 많이 사용되는 오픈소스 RDBMS로 Oracle이 인수하였습니다. 이후 오픈소스 진영에서 MariaDB를 만들게 되었습니다.
- PostgreSQL 글로벌 점유율 4위인 오픈소스 RDBMS.
DBMS의 글로벌 점유율과 다양한 모델을 DB-Engines에서 확인할 수 있습니다.
시스템 모니터링 System Monitoring
시스템 운영을 위해서는 여러 상태를 지속적으로 감시해야 합니다. 네트워크, 서버, 클라우드, 애플리케이션, 서비스, 트랜잭션 등 다양한 레벨에서 모니터링을 하면서 이상 여부를 확인하고 원인을 분석합니다.
대표적 제품
- Zabbix
- Datadog
- Mackerel
가상화 Virtualization
가상화란 쉽게 말해 컴퓨터 안에 독립적인 컴퓨터를 만드는 것입니다. 컴퓨터 안에 컴퓨터를 만드는 이유는 물리적인 리소스를 여러 사용자 또는 환경에 배포해서 제한된 리소스를 최대한 활용하기 위함입니다.
특히 하나의 서버 자원을 여러 사용자들이 나눠서 사용하는 클라우드 컴퓨팅의 기반이 됩니다.
호스트형 서버 가상화
하드웨어 위에 호스트 OS를 설치하고 OS에서 가상화 SW를 이용해 게스트 OS를 작동시키는 기술입니다. 가상화 SW를 설치하면 쉽게 가상 환경을 구축할 수 있기 때문에 개발 환경 구축 등에 주로 사용합니다. 오라클의 Virtual Box나 VMware가 있습니다.
하지만 OS상에 또 다른 OS가 돌아가므로 자원이 많이 소비되고 느리다는 단점이 있습니다.
하이퍼바이저형 가상화
하드웨어 상에 가상화를 전문적으로 수행하는 sw인 하이퍼바이저를 올라가는 방식입니다. 호스트 OS가 없어져서 조금 덜 부담되지만 그래도 각 VM(Virtual Machine)마다 게스트 OS가 돌아가기 때문에 가상 환경 시작에 걸리는 오버헤드가 커집니다. 클라우드의 가상 머신에서도 사용하는 방법입니다.
컨테이너 (Container)
컨테이너는 오버헤드를 최소화하기 위한 방법입니다. 호스트 OS 상에 독립적인 공간을 만들고 별도의 서버인 것 처럼 사용합니다. 따라서 컨테이너는 같은 호스트 OS를 공유하기 때문에 오버헤드가 적고 고속으로 동작합니다.
컨테이너는 애플리케이션 실행에 필요한 모듈을 하나로 모을 수 있기 때문에 여러 개의 컨테이너를 조합해서 하나의 애플리케이션을 구축하는 마이크로서비스와 잘 맞습니다.
도커 Docker
도커는 애플리케이션 실행에 필요한 환경을 이미지로 만들고 해당 이미지를 활용해 다양한 환경에서 실행 환경을 구축하기 위한 오픈소스 플랫폼입니다. 도커는 내부에서 컨테이너를 사용합니다.
일반적인 개발 환경에서는 잘 동작하다가 갑자기 스테이징이나 운영 환경으로 가면 동작하지 않는 경우가 있습니다. 이런 인프라 환경을 도커를 이용해 컨테이너로 관리하면 어떨까요? 필요한 것을 모두 컨테이너로 모아서 이미지로 만드는 것입니다.
좀 더 자세히 보면 개발자가 커밋을 할 때마다 CI를 통해 도커 이미지로 빌드하고 해당 이미지를 관리합니다. 그리고 개발 환경이든 테스트 환경이든, 실제 운영 환경이든 해당 이미지를 배포하면 컨테이너에서 독립적으로 배포된 환경에서 동작하기 때문에 오류 없이 동작할 수 있습니다.
쿠버네티스 Kubernetes
실제 애플리케이션은 여러 컨테이너에 걸쳐 있고 이러한 컨테이너는 여러 서버에 배포되어 있습니다. 이렇게 여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술을 클러스터링이라고 합니다. 이를 통해서 가용성과 확장성을 향상시킬 수 있습니다.
이런 멀티호스트 환경에서 컨테이너를 클러스터링하기 위한 툴을 컨테이너 오케스트레이션 툴이라고 합니다. 오케스트레이션 툴은 컨테이너들을 클러스트링하기 위해 컨테이너 시작 및 정지와 같은 조작, 호스트 간 네트워크 연결, 스토리지 관리, 컨테이너를 어떤 호스트에서 가동시킬지와 같은 스케줄링 기능을 제공합니다.
컨테이너 오케스트레이션 툴의 사실상 표준은 쿠버네티스 입니다. 쿠버네티스는 구글을 중심으로 한 오픈소스로 다양한 기업이 개발에 참여하고 있습니다.
참조
'기타' 카테고리의 다른 글
자주사용하는 GIT 커맨드라인 명령어 알아보기 (0) | 2019.02.23 |
---|---|
Git Alias 개념 및 사용방법 (0) | 2019.02.13 |
여러대의 맥북에서 Xcode 빌드하기 (인증서 등록하기) (0) | 2018.07.10 |
VSCODE 유용한 플러그인 settings sync 사용하기 (2) | 2018.05.17 |
Python + Django 환경설정하기 (0) | 2018.05.14 |