인프라 관련 지식 '총' 정리

2023년 5월 6일

#infra

사내 인프라 파트에서 인턴 경험을 쌓으면서 팀원들의 인프라 관련 업무를 엿볼 수 있었는데요.

인프라엔지니어는 사내 구성원을 위한 기술적 지원을 하고, 더 나은 업무 환경을 위해 고민하는 직무라는 것을 알 수 있게 되었습니다.

또한 Hardware, Network, Security, Middleware, OS 등 애플리케이션 개발에 기반이 되는 다양한 영역들을 접하며, 개념 정리의 필요성을 느꼈습니다.

그 동안 개발 경험을 위주로 쌓아왔던 저에게 인프라 관련 도메인 지식과 업무는 낯설기도 하였는데, 이번 포스팅에서 인프라에 대한 지식도 쌓으며 저만의 언어로 정리해보려고 합니다!


1. IT Infrastructure

IT 인프라란?

Infrastructure 라는 단어에서 예측 가능한데요. 애플리케이션을 가동시키기 위해 필요한 하드웨어OS, 미들웨어, 네트워크 등 시스템의 기반을 의미합니다. 저는 애플리케이션 세상에 출시하기 위해 필요한 기반이라고 이해를 하겠습니다!

시스템의 요구 사항에는 기능적 요구사항, 비기능적 요구사항이 존재합니다.

  • 기능적 요구사항 (functional requirement): 해당 시스템이 어떤 기능을 하는지, 무엇을 할 수 있는지
  • 비기능적 요구사항 (non-functional requirement): 시스템의 성능, 안정성, 확장성, 보안 등

인프라는 비기능적인 요구사항과 관련이 있습니다.

클라우드의 등장

애플리케이션 개발과 환경 구축 패러다임에 변화가 일어났는데요.

데이터센터나 서버실에 서버를 두고 직접 관리하던 온프레미스(On-premise) 방식에서 가상의 서버를 여러 대 띄우는 클라우드 방식으로 옮겨지게 되었습니다.

이러한 분산 환경에서는 수동적 관리 방법 보다는, 자동화된 툴을 사용하여 오케스트레이션(orchestration)합니다.

따라서 자동화를 위해 코드를 작성하는 능력이 요구되며, 배포나 테스트 등이 개발자의 업무로 넘어오게 되며, 인프라 관련 지식이 필요하게 되었습니다!

인프라의 구성 요소

  • 하드웨어(Hardware, HW) : 서버 장비 본체나 데이터를 저장하기 위한 스토리지, 전원 장치 등. 넓은 의미로는 이런 하드웨어를 설치하는 데이터 센터의 설비(건물, 공조, 보안 설비, 소화 설비 등) 또한 포함
  • 네트워크(Network) : 사용자가 원격으로 접근할 수 있도록 서버를 연결하는 도구
    • 라우터, 스위치, 방화벽 등 네트워크 장비와 이를 연결하는 케이블 배선 등이 있습니다.
    • 사용자가 단말에서 무선으로 연결할 때 필요한 액세스 포인트(Access Point, AP)
  • 운영체제(Operating System, OS) : 하드웨어와 네트워크 장비를 제어하기 위한 기본적인 소프트웨어 (리소스나 프로세스 관리)
    • 클라이언트 OS : 사용자가 사용하기 쉽도록 하는데 초점 (Windows, macOS …)
    • 서버 OS : 시스템을 빠르고 안정적으로 실행하는데 초점 (Linux, Unix, Windows Server …)
  • 미들웨어(middleware) : 서버 상에서 서버가 특정 역할을 하도록 기능을 제공하는 소프트웨어

2. 온프레미스와 클라우드

온프레미스 On-Premises

온프레미스데이터 센터나 서버실에 서버를 두고 직접 관리하는 전통적인 방식입니다. 집에 개인적으로 NAS나 서브 PC로 작은 서버를 돌리는 행위도 포함합니다. (NAS는 네트워크 결합 스토리지로 LAN으로 연결하는 외장 하드디스크입니다)

  • 단점 : 서버, 네트워크 장비, OS, 스토리지, 각종 솔루션 등을 직접 구매, 설치, 관리해야 합니다. 초기 투자 비용이 크고, 사용 예측량 가늠이 어려우며, 사용량이 적어도 유지 비용이 그대로 나간다는 특징이 있습니다.

  • 온프레미스 환경이 유리한 경우 : 1. 클라우드 이상의 가용성 2. 기밀성

    • 온프레미스, 클라우드 모두 가용성을 보장하지만, 개념에서 차이가 있습니다. 온프레미스는 서버가 죽지 않는 것을 목표로 하나, 클라우드는 많은 인스턴스로 이루어진 분산 환경에서 인스턴스가 죽으면 다른 인스턴스가 빠르게 대체하는 것을 의미합니다. 클라우드 환경에서 가용성을 높이기 위해선, 가용성을 높이도록 설계를 해야합니다. 따라서 잠시라도 끊어져서는 안되는 시스템이나 클라우드 업체가 보장하는 것 이상의 가용성이 필요한 시스템에서는 온프레미스가 유리합니다.

    • 또한 기밀성이 높은 데이터의 경우에도 온프레미스가 유리합니다. 물리적인 저장 장소를 명확히 알 필요가 있을 때는 온프레미스가 유리합니다. 특히, 멀티 클라우드를 사용한다면 각 클라우드 프로바이더마다 보안 정책이 다르기 때문에 보안 표준을 구축하기 어려운 점도 있습니다.

퍼블릭 클라우드 Public Cloud

인터넷을 통해 불특정 다수에게 서비스 형태로 제공되는 시스템입니다.

서비스 형태라는 건 사용자는 원하는 옵션을 선택하고, 사용한만큼 비용을 지불하면 된다는 걸 말합니다. 제공하는 서비스에 따라 IaaS, PaaS, SaaS 등으로 나눌 수 있습니다. 이 중 IaaS는 원하는 사양의 가상 머신이나 스토리지를 선택하고 이용한 시간이나 데이터 양에 따라 비용을 지불합니다.

AWS(Amazon Web Service), Microsoft Azure, GCP(Google Cloud Platform) 등 클라우드 프로바이더가 데이터 센터와 인프라를 보유하고 있습니다.

프라이빗 클라우드 Private Cloud

퍼블릭 클라우드에서 이용자를 한정한 형태입니다. 기업 내 서비스가 대표적이며, 보안성이 높고 기능이나 서비스를 추가하기 쉽습니다.

  • 클라우드 환경이 유리한 경우 : 1. 트래픽 변동이 잦은 서비스 2. 초기 투자금이 적은 스타트업 혹은 개인

    • 트래픽 양에 따라 서버 사양이나 네트워크 대역을 추정하는 것을 사이징(sizing)이라고 합니다. 사내 시스템의 경우 사용자가 한정되어 있고 트래픽을 예측하기가 쉬워 온프레미스 환경도 적합합니다. 하지만, 대외 서비스에서는 사이징 작업이 쉽지 않습니다. (크게 잡으면 낭비, 적게 잡으면 단기간에 증설하기 어려움)

    • 대외 서비스처럼, 트래픽의 변동이 많은 시스템은 클라우드 환경이 유리합니다. 클라우드 시스템에서는 트래픽에 따라 자동으로 증설해주는 오토스케일링(Auto Scaling)이 있어 유리합니다. 클라우드의 데이터센터는 전 세계에 퍼져 있기 때문에 자연 재해로 인해 데이터 시스템이 다운되더라도 다른 지역에서 시스템 운영을 지속할 수 있습니다.

    • 빠르게 서비스를 제공해야 하는 시스템이나 PoC(Proof of Concept)도 클라우드가 용이하며, 초기 투자금이 적은 스타트업이나 개인 개발자도 클라우드가 유리합니다.

하이브리드 클라우드 Hybrid Cloud

위처럼, 온프레미스, 클라우드 환경 각각 장단점을 가지고 있기 때문에 함께 사용하기도 합니다. 또한 클라우드 프로바이더들도 각자의 장점이 달라서 여러 클라우드를 함께 사용하기도 합니다.


3. 하드웨어

인프라에서 하드웨어네트워크는 가장 Low-Level 입니다.

먼저 하드웨어를 살펴보면, 온프레미스 환경은 여러 대의 서버 장비로 구성됩니다. 클라우드는 인스턴스의 하드웨어 성능을 필요에 따라 선택합니다.

CPU

CPU의 성능은 코어캐시에 영향을 받습니다. 코어가 많을수록 동시에 처리하는 연산이 늘어나고, 메모리와의 처리 속도를 완화하기 위한 캐시는 크기가 클수록 성능이 좋습니다.

GPU(Graphics Processing Unit)는 그래픽을 처리하는데 특화된 프로세서입니다.

CPU직렬 처리에 최적화된 몇 개의 코어로 구성된 반면, GPU병렬 처리에 최적화된 작고 많은 코어로 이루어져 있습니다.

따라서 딥러닝이나 수치해석 등 대량의 데이터를 고속으로 처리해야하는 분야에서는 CPU와 GPU를 함께 사용해서 처리 성능을 높이는 GPU 컴퓨팅 방식이 사용됩니다. 이 방식은 연산이 많이 필요한 부분을 GPU에게 넘기고 나머지 코드만을 CPU에서 처리하는 방식입니다.

메모리

주기억장치인 메모리는 데이터 용량이 크거나 전송 속도가 고속일수록 고성능입니다.

서버용으로는 전력 소모가 적고 오류 처리가 탑재되어 있는 것을 주로 선정합니다.

데이터 스토리지

데이터를 저장하는 장비입니다.

보통 스토리지의 속도가 제일 느리기 때문에 스토리지의 용량이나 읽기, 쓰기 속도가 시스템 전체의 속도에 영향을 주는 경우가 많습니다. 하드디스크SSD 등으로 이루어져 있습니다.

IT에서 가장 중요한 데이터가 손실되면 안되기 때문에 대부분 고가용성(High Availability, HA, 오랜 기간 동안 지속적으로 운영)을 위해 이중화(redundancy) 또는 다중화로 구성합니다.

  • 이중화같은 장비 또는 시스템이 장애가 나는 것을 대비해 같은 모듈을 2개(또는 그 이상) 준비하는 것을 말합니다.

기타 하드웨어

이 외에도 전원 차단을 방지하는 무정전 전원공급장치(Uninterruptible Power Supply, UPS)나 여러 대의 서버를 관리하기 위한 KVM 스위치, 서버 장비 설치에 사용하는 서버 랙 등이 있습니다. 서버 랙은 19인치 랙이 많이 사용됩니다.

이러한 하드웨어는 다양한 스펙의 라인업이 있으므로 용도에 따라 선택해서 구축하게 됩니다.

클라우드를 사용하는 경우도 마찬가지로 용도에 따라 가상 머신의 성능을 선택하고 조합하여 사용할 수 있습니다. 클라우드 업체에게 컨설팅을 받는 것도 하나의 방법입니다.

방화벽

방화벽보안을 위해 내부 네트워크와 외부 네트워크의 통신을 제어하고 불필요한 통신을 차단하는 것입니다.

  • 패킷 필터형 : 통과하는 패킷을 포트 번호나 IP 주소를 바탕으로 필터링합니다.
  • 애플리케이션 게이트웨이형 : 애플리케이션 프로토콜 레벨에서 외부와의 통신을 제어하는 방식으로 일반적으로 프록시 서버라고 부릅니다. 세션에 포함되어 있는 정보를 검사하기 위해서 기존 세션을 종료하고 새로운 세션을 만듭니다. 패킷 필터형에 비해서 속도는 느리지만 많은 검사를 수행할 수 있습니다.

4. 네트워크

각종 장비를 식별하기 위해 네트워크 주소(address)를 활용합니다.

MAC 주소 (물리 주소 / 이더넷 주소)

물리적으로 할당되는 48bit 주소입니다.

앞 24bit는 네트워크 부품의 제조업체를 식별하고, 뒤 24bit는 각 제조업체가 중복되지 않도록 할당합니다. 16진수로 표기하며 2byte씩 구분해서 표기합니다.

IP 주소

인터넷이나 인트라넷 같은 네트워크에 연결된 장비에 할당되는 번호입니다.

주로 많이 사용하는 IPv4의 경우 8bit씩 4개로 구분된 32bit 주소입니다(예를 들어 192.168.1.1). 각 자리는 0~255까지 표현이 가능합니다. IPv4는 하나의 네트워크에 2의 32승(약 42억대)까지밖에 연결할 수가 없어서 인터넷에서 IP 주소가 고갈될 우려가 있습니다.

그래서 IPv6는 128비트의 IP주소를 사용하고 있습니다. 또한 사내 네트워크에서는 임의의 주소를 할당하는 프라이빗 주소를 사용하고, 인터넷과의 경계에서 글로벌 주소로 변환하는 NAT 장비를 사용합니다.

  • 사설 IP (Private IP)

    • 인터넷에서 사용되지 않는 비공개적인 IP 주소입니다.
    • 사설 IP는 로컬 네트워크에서만 사용되며, 일반적으로 집이나 사무실 내부의 장치들에 할당됩니다. 사설 IP는 인터넷에서 라우팅되지 않으므로 외부 인터넷에서는 접근할 수 없습니다.
    • 사설 IP 주소는 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16의 IP 대역을 사용합니다.
    • 사설 IP는 IP 주소 부족 문제를 해결하고, 네트워크 보안을 강화하며, 유연한 네트워크 구성을 가능하게 하고, 비용을 절감하며, 로컬 서비스를 제공하는 등의 이점을 가지고 있습니다.
  • 공인 IP (Public IP)

    • 인터넷에서 사용되는 공개적인 IP 주소입니다. 공인 IP는 인터넷을 통해 외부에서 접근 가능한 인터넷 서버, 웹 사이트, 클라우드 서비스 등에 할당됩니다.
    • 공인 IP는 인터넷 서비스 제공업체(Internet Service Provider, ISP)에서 할당되며, 이 주소는 공용으로 사용되기 때문에 중복된 IP 주소가 없도록 관리됩니다.

OSI 모델

통신을 할 때에는 서로 어떻게 메시지를 주고받고, 어떤 언어를 사용할지 등의 규칙이 필요합니다. 이런 규약을 통신 프로토콜이라고 합니다.

OSI 모델(Open Systems Interconnection Model)은 국제 표준화 기구(International Organization for Standardization, IOS)에서 만든 컴퓨터의 통신 기능을 계층 구조로 나눈 모델입니다.

총 7계층으로 이루어져 있습니다. 데이터가 네트워크로 나갈 때는 위층에서부터, 네트워크에서 데이터를 받을 때는 아래층에서부터 들어옵니다. 인터넷에서는 TCP/IP 계층 모델을 사용합니다.

사용자가 웹브라우저에 접속하면 무슨 일이 일어날까? (네트워크 관점) 포스팅에서 해당 내용에 대해 자세히 정리하였으니 가볍게 넘어가겠습니다 :)

  • 1계층 물리 계층(Physical Layer)

    • 전송 케이블이 직접 연결되는 계층으로 케이블을 통해 전송하는 기능을 합니다.
  • 2계층 데이터 링크 계층(Data Link Layer)

    • 동일한 네트워크 간 인접한 두 시스템(노드) 간 통신을 규정합니다.
  • 3계층 네트워크 계층(Network Layer)

    • 서로 다른 네트워크 간 통신을 위한 규정입니다. 특정 서버로 가는 경로를 효율적으로 처리하는 라우팅(routing) 기능이 있습니다. 데이터 링크 계층이 MAC 주소를 기반으로 한다면 네트워크 계층은 IP 주소를 기반으로 합니다.
  • 4계층 전송 계층(Transport Layer)

    • 데이터 전송을 제어하는 계층입니다. 보낼 데이터의 용량, 속도, 목적지 등을 처리합니다. 대표적인 프로토콜로는 TCP와 UDP가 있습니다.
  • 5계층 세션 계층(Session Layer)

    • 애플리케이션 간 연결을 유지 및 해제하는 역할을 합니다. 커넥션 확립 타이밍이나 데이터 전송 타이밍 등을 규정합니다.
  • 6계층 프레젠테이션 계층(Presentation Layer)

    • 데이터를 애플리케이션이 이해할 수 있도록 변환해주는 역할을 합니다. 데이터의 저장 형식, 압축, 문자 인코딩 등을 변환하고 데이터를 안전하게 전송하기 위해 암호화, 복호화하는 기능도 이 계층에서 처리합니다.
  • 7계층 응용 계층(Application Layer)

    • 최상위 계층으로 웹 브라우저나 아웃룩처럼 사용자가 직접 사용하는 애플리케이션을 의미합니다.

5. 리눅스 Linux OS

리눅스는 Linus Torvalds가 개발한 Unix 호환 서버 OS입니다. 오픈소스로 여러 기업이나 개인의 기여로 만들어지고 있습니다.

리눅스 커널 Linux Kernel

커널이란 OS의 코어가 되는 부분을 말합니다. 메모리 관리, 파일 시스템, 프로세스 관리, 디바이스 제어의 역할을 합니다.

안드로이드(Android) 또한 리눅스 커널을 기반으로 만들어졌습니다.

디바이스 관리

리눅스 커널은 CPU, 메모리, 디스크, IO 등 하드웨어디바이스 드라이버라는 소프트웨어를 이용해 제어합니다.

프로세스 관리

리눅스는 프로그램 파일에 쓰여 있는 내용을 읽어서 메모리 상에서 처리하는데 이렇게 실행된 프로그램프로세스라고 합니다.

이 프로세스를 식별하기 위해 PID(Process ID)를 붙여서 관리하고 각 프로세스에 필요한 자원을 효율적으로 할당합니다.

메모리 관리

프로세스에 필요한 메모리를 할당하고 해제합니다.

다만 메모리가 부족한 경우에는 하드디스크와 같은 보조기억장치에 가상 메모리 영역을 만들어 사용하는데 이를 스왑(swap)이라고 합니다.

쉘 Shell

사용자는 이라는 커맨드라인 인터페이스를 통해 명령어를 커널로 전달할 수 있습니다. 또한 쉘에서 실행하고자 하는 명령을 모아놓은 것을 쉘 스크립트(shell script)라고 합니다.

사용하는 쉘에 따라서 스크립트 작성이 달라질 수 있습니다.

  • bash : 명령 이력, 디렉토리 스택, 명령이나 파일명의 자동 완성 기능 등을 지원하는 쉘. 대부분의 Linux 시스템이나 macOS(OS X)에 표준으로 탑재되어 있음
  • csh : C 언어와 비슷한 쉘. BSD 계열 OS에서 주로 사용
  • tcsh : csh 를 개선한 버전으로 명령이나 파일명 등의 자동완성 기능 지원
  • zsh : bash 와 호환성이 있고 고속으로 동작하는 쉘

파일 시스템

파일 시스템이란 파일에 이름을 붙여서 어디에 저장할지 나타내는 체계입니다. 즉 파일을 관리하는 시스템입니다.

리눅스 커널은 가상 파일 시스템(Virtual File System, VFS)을 사용합니다. 사용자의 입장에서 각 데이터가 저장되어 있는 위치(하드디스크, 메모리, 네트워크 스토리지 등)와 상관없이 그냥 파일처럼 사용할 수 있도록 하는 것입니다. VFS에서는 각 디바이스를 파일로 취급합니다.

디렉토리 구성

리눅스의 디렉토리 목록은 FHS(Filesystem Hierarchy Standard)라는 규격으로 표준화되어 있습니다. 대부분의 주요 배포판은 이 FHS를 기반으로 디렉토리를 구성합니다.

  • / : 루트 디렉토리
  • /bin : ls, cp 같은 기본 커맨드를 저장하는 디렉토리
  • /boot : 리눅스 커널(vmlinuz) 등 OS 시작에 필요한 파일을 저장하는 디렉토리
  • /dev : 하드디스크, 키보드, 디바이스 파일을 저장하는 디렉토리.
  • /etc : OS 나 애플리케이션의 설정 파일을 저장하는 디렉토리.
  • /home : 일반 사용자의 홈 디렉토리. root 사용자는 /root를 홈 디렉토리로 사용.
  • /proc : 커널이나 프로세스에 대한 정보가 저장하는 디렉토리. 하위에 있는 숫자 폴더는 프로세스 ID를 의미.
  • /sbin : 시스템 관리용 마운트를 저장하는 디렉토리.
  • /tmp : 일시적으로 사용하는 파일을 저장하는 임시 디렉토리. 서버를 재시작하면 사라짐.
  • /usr : 각종 프로그램이나 커널 소스를 저장하는 디렉토리
  • /var : 시스템 기동과 함께 변하는 파일을 저장하는 디렉토리.

보안 기능

대표적인 기능 3가지만 정리하겠습니다.

  • 1. 계정에 대한 권한 설정

    • 리눅스는 사용자 계정에 권한을 설정할 수 있습니다. 시스템 전체를 관리하는 root 사용자그 외 일반 사용자가 있습니다. 또한 미들웨어와 같은 데몬을 작동시키기 위한 시스템 계정도 있습니다. 계정은 그룹으로 묶을 수도 있습니다.

    • 이런 계정과 그룹을 바탕으로 파일이나 디렉토리에 대한 액세스 권한(permission)을 설정할 수 있습니다.

  • 2. 네트워크 필터링

    • 리눅스는 원래 네트워크 상에서 여러 사용자가 이용하는 것을 전제로 만든 OS 이므로 네트워크 관련 기능이 많습니다.

    • iptables는 리눅스에 내장된 패킷 필터링 및 NAT를 설정할 수 있는 기능입니다.

  • 3. SELinux(Security-Enhanced Linux)

    • SELinux는 미국 국가안전보장국이 제공하는 리눅스 커널에 강제 액세스 제어 기능을 추가한 기능입니다. 리눅스는 root 사용자가 퍼미션에 상관없이 모든 액세스가 가능해서 root 계정이 도난당하면 시스템에 치명적인 영향을 줄 수 있는 단점이 있습니다.

    • SELinux는 프로세스마다 액세스 제한을 거는 TE(Type Enforcement)와 root 를 포함한 모든 사용자에게 제어를 거는 RBAC(Role-based Access Control) 등으로 root 에게 권한이 집중되는 것을 막아줍니다.


6. 미들웨어

미들웨어OS애플리케이션 사이의 각종 SW를 의미합니다. 웹서버, DBMS, 시스템 모니터링 툴 등이 미들웨어에 포함됩니다. 다양한 미들웨어가 존재하므로, 상황에 요건에 맞게 적절히 선정해야 합니다.

웹서버

웹 서버는 클라이언트가 보낸 HTTP 요청을 받아 웹 콘텐츠를 응답으로 반환하거나, 서버쪽 애플리케이션을 호출하는 기능을 가진 서버입니다.

  • Apache HTTP Server : 폭 넓게 사용되는 전통의 오픈소스 웹 서버.
  • Internet Information Services : Microsoft에서 제공하는 웹 서버. Windows Server 시리즈와 같은 OS 제품에 들어 있음.
  • Nginx : 소비 메모리가 적으며 리버스 프록시로드밸런서 기능을 갖추고 있는 오픈 소스 웹 서버.

DBMS Database Management System

DBMS는 데이터베이스를 관리하는 미들웨어입니다. 데이터의 CRUD(Create, Read, Update, Delete)와 같은 기본 기능과 트랜잭션 처리 등 많은 기능을 포함합니다.

아래는 RDBMS 를 정리한 내용입니다.

  • Oracle Database : Oracle 이 제공하는 상용 RDBMS. 주로 기업에서 많이 사용되는 데이터베이스로 글로벌 DB시장 점유율 1위. 상당히 고가인만큼 많은 기능을 제공
  • MySQL : Oracle 이 제공하는 오픈 소스 RDBMS(관계형 데이터베이스). 무료인 커뮤니티 버전과 유료인 상용 버전으로 나뉘어져 있음. 이후 오픈 소스 진영에서 MySQL을 기반으로 한 MariaDB를 만들었음.
  • Microsoft SQL Server : Microsoft 에서 제공하는 상용 RDBMS. Windows 에 특화되어 있음.
  • PostgreSQL : Oracle, MySQL, SQL Server 에 이어 글로벌 점유율 4위인 오픈 소스 RDBMS.

추가로 NoSQL(Not Only SQL) 또한 DBMS로 많이 사용됩니다. SQL 이상의 기능을 제공하는 DBMS를 의미합니다. 데이터를 테이블 대신 다른 형태로 저장하는 방식이며, 용도에 맞는 선택이 이루어져야 합니다.

  • Key-Value : 단순한 형태의 NoSQL. 간단하여 속도가 빠르고 익히기 쉽다는 장점. 값의 내용을 사용한 쿼리는 불가능하여, 애플리케이션 레벨에서 처리가 필요함 (Redis, Amazon, DynamoDB, Memcached)
  • Document : Key-Value 와 비슷하나 단순히 Key-Value 값으로 저장하는 것이 아닌, 계층구조인 Document로 저장. 쿼리를 사용할 순 있으나 일반 SQL 과는 다름. (MongoDB, Couchbase)
  • Wide column stores : 테이블, 로우, 컬럼을 사용하지만 RDB와는 달리 컬럼의 이름과 포맷은 같은 로우라도 다를 수 있다. 2차원 Key-Value 형태 (Cassandra, HBase)
  • Graph : 데이터를 그래프처럼 연속적인 노드, 엣지, 프로퍼티의 형태로 저장. SNS나 추천 엔진, 패턴 인식 등 데이터 간의 관계를 저장할 때 적합 (Neo4j)

시스템 모니터링 툴

시스템 모니터링 툴을 활용하여 네트워크, 서버, 클라우드, 애플리케이션, 서비스, 트랜잭션 등 다양한 Level에서 모니터링을 하면서 이상 여부를 확인하고 원인을 분석합니다

  • Zabbix : Zabbix SIA 가 개발한 오픈 소스 모니터링 툴. 다양한 서버의 상태를 모니터링 가능
  • Datadog : Datadog 가 개발한 서버 모니터링 SaaS. 따로 서버를 도입할 필요 없이 웹 브라우저에서 모니터링 가능. 멀티 클라우드 환경에서도 손쉽게 모니터링이 가능.
  • Mackerel : Hatena 가 개발한 서버 모니터링 SaaS. 클라우드 서버 모니터링에 유용.

7. 인프라 구성 및 관리를 위한 개념

인프라 구성 관리란 인프라를 구성하는 하드웨어, 네트워크, OS, 미들웨어, 애플리케이션 등의 구성 정보를 관리하고 적절한 상태로 유지하는 작업을 의미합니다.

대표적인 기술 Docker에 대해 알아보기 전! 몇 가지 개념을 정리해보았습니다.

Immutable Infrastructure

온프레미스 환경에서 인프라 환경을 구축하는 것 자체로 비용이 크며, 오랜 기간이 소모됩니다.

반면 클라우드는 가상 환경이기 때문에 필요하면 구축하고 불필요하면 바로 폐기해도 문제되지 않습니다. 서비스가 업데이트되면 기존 운영 환경을 변경하는 대신 이미지를 새로 생성해 배포합니다.

이를 변경하지 않는다는 뜻의 Immutable Infrastructure 라고 합니다. Immutable Infrastructure이미지 하나로 서버를 쉽게 찍어낼 수 있고, 이미지 관리도 용이합니다. 또한 환경 자체를 배포하기 때문에 동일한 환경에서 테스트도 용이합니다.

Infrastructure as Code

  • (온프레미스) 새로운 서버를 설치하는 상황에서…
    • 물리 서버나 네트워크 장비를 데이터 센터에 설치한 후 여러가지 설정을 해야 함 => 서버가 많을수록 단순 반복 작업으로 오랜 시간 소요, 수작업은 실수가 나올 수 있음

이후 OS미들웨어의 버전 관리 및 보안 패치 적용을 생각했을 때, 구성 관리를 효율적으로 하는 것이 앞으로의 운영 효율을 높이는 데 중요합니다. 이력이 제대로 관리되지 않는다면, 버전 정보와 설정 항목을 적어놓은 값이 맞질 않아서 애플리케이션에 오류가 발생하는 경우가 있습니다.

따라서, 수작업 대신 프로그램 코드를 기반으로 관리하는 것이 좋습니다. 작업 실수도 줄일 수 있을 뿐더러 Git 과 같은 버전 관리 소프트웨어를 이용해 변경 이력을 관리할 수 있습니다. 이렇게 코드 기반으로 인프라 구성을 관리하는 방식을 Infrastructure as Code 라고 합니다.

인프라 구성 관리 툴

  • Bootstrapping : OS 시작을 자동화
    • 서버 OS 를 설치, 가상 환경 설정, 네트워크 구성 설정 등
    • Vagrant
  • Configuration : OS 나 미들웨어의 설정을 자동화
    • OS 설정, 각종 미들웨어 설치 및 설정
    • Ansible, Chef, Puppet
  • Orchestration : 여러 서버 관리를 자동화
    • Kubernetes : 컨테이너 오케스트레이션의 표준. (=== K8S)

Continuous Integration, Continuous Delivery

  • Continuous Integration

    • 지속적인 통합은 제대로 동작하는 코드를 자동으로 유지하기 위한 방법입니다.
    • CI 환경이 구성되어 있지 않다면? 빌드가 정상적으로 되지 않는 경우가 있고, 최악은 빌드가 정상적으로 되었는지 조차 모르는 경우가 있습니다.
    • CI 환경에서 개발자가 코드를 커밋하면 Jenkins 같은 툴이 코드 커밋을 감지해 자동으로 빌드와 테스트를 수행하고 코드 품질을 점검합니다. 문제가 있을 경우 해당 개발자에게 피드백이 가서 빠르게 조치하고 좋은 품질의 코드를 계속 유지할 수 있습니다.
    • 테스트를 하면 되지 않나? 단위 테스트를 통과한 모듈이 다른 환경에서도 정상적으로 동작한다고 보장하기 어렵습니다. 각종 환경 설정이나 네트워크, 권한 등 인프라 환경에는 서로 연관있고 의존되어 있는 설정이 많습니다. 이러한 부분을 코드로 관리한다면 항상 동일한 환경에서 개발할 수 있어 테스트가 쉽고 환경 구성 관리가 더욱 쉬워집니다. 팀 단위의 작업이라면 꼭 필요한 환경일 것입니다.
  • Continuous Delivery

    • SW를 사용자에게 주기적으로 딜리버리함으로써 고객의 피드백을 받고 반영하는 것을 Continuous Delivery 라고 합니다. 개발 사이클 자체를 짧게 해서 개발과 릴리즈를 반복하는 것입니다.
    • 문제는 지속적으로 딜리버리하는 과정에서 테스트 환경과 실제 운영 환경이 달라서 문제가 발생하기도 합니다. 인프라 환경도 포함한 애플리케이션 실행 환경을 그대로 제품 환경에 딜리버리할 수 있다면 안전하게 버전업을 할 수 있게 됩니다.

가상화 Virtualization

가상화란 컴퓨터 안에 독립적인 컴퓨터를 만드는 것입니다. 가상화의 목적은 물리적인 리소스를 여러 환경에 배포해서 제한된 리소스를 최대한 활용하기 위함입니다.

  • 예시 : 사용량이 크지 않은 3개의 물리 서버가 존재

    • 가상화를 이용해 하나의 서버에 두 개의 서버를 독립적으로 분리하면 영향을 받지 않고 리소스를 더 효율적으로 사용할 수 있습니다. 특히 하나의 서버 자원을 여러 사용자들이 나눠서 사용하는 클라우드 컴퓨팅의 기반이 됩니다.
  • 호스트형 서버 가상화

    • 하드웨어 위에 호스트 OS 를 설치하고 OS에서 가상화 SW를 이용해 게스트 OS를 작동시키는 기술입니다.
    • 가상화 SW 를 설치하면 쉽게 가상 환경을 구축할 수 있기 때문에 개발 환경 구축 등에 주로 사용합니다. 오라클의 Virtual BoxVMware 가 있습니다.
    • 하지만 OS 상에서 또 다른 OS 가 돌아가므로 자원이 많이 소비되고 느리다는 단점이 있습니다.
  • 하이퍼바이저형 가상화

    • 하드웨어 상에 가상화를 전문적으로 수행하는 SW 인 하이퍼바이저(Hypervisor)를 올리는 방식입니다. 하이퍼바이저가 하드웨어와 가상 환경을 제어합니다.
    • VM(Virtual Machine)마다 게스트 OS 가 돌아가기 때문에, 가상 환경 시작에 걸리는 오버헤드가 커집니다. 클라우드의 가상 머신에서도 사용하는 방법입니다.

컨테이너 Container

컨테이너는 오버헤드를 최소화하기 위한 방법입니다.

호스트 OS 상에 독립적인 공간을 만들고 별도의 서버인 것처럼 사용합니다. 따라서 각 컨테이너는 같은 호스트 OS 를 공유하기 때문에 오버헤드가 적고 고속으로 동작합니다. 실제 컨테이너 박스처럼, 필요한 것을 모두 담고, 다른 컨테이너 박스와 격리시켜놓은 것으로 이해하면 좋습니다.

컨테이너는 애플리케이션 실행에 필요한 모듈을 하나로 모을 수 있기 때문에, 여러 개의 컨테이너를 조합해서 하나의 애플리케이션을 구축하는 마이크로서비스와 잘 맞습니다.


8. 인프라 구성 및 관리

도커 Docker

도커는 애플리케이션 실행에 필요한 환경이미지로 만들고,

해당 이미지를 활용해 다양한 환경에서 실행 환경을 구축하기 위한 오픈소스 플랫폼입니다. 도커는 내부에서 컨테이너를 사용합니다.

대게 애플리케이션 개발시 개발 환경, Staging 환경, 운영 환경으로 나눠 작업하게 되는데, 잘 실행되던 앱이 특정 환경에서 동작을 안하는 경우가 있습니다. 이런 인프라 환경을 Docker를 이용해 컨테이너로 관리하면 해당 문제를 해결하는데 도움이 됩니다.

필요한 실행 환경을 모두 컨테이너로 모아서 이미지로 만드는 것입니다.

개발자가 커밋을 할 때마다 CI를 통해 도커 이미지빌드를 하고 해당 이미지를 관리합니다. 그리고 이미지를 배포하면 컨테이너에서 독립적으로 배포된 환경에서 동작하기 때문에 오류 없이 동작할 수 있습니다.

쿠버네티스 Kubernetes

실제 애플리케이션은 여러 컨테이너에 걸쳐 있고, 이러한 컨테이너는 여러 서버에 배포되어 있습니다.

이렇게 여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술을 클러스터링(clustering)이라고 합니다. 이를 통해서 가용성확장성을 향상시킬 수 있습니다.

이런 멀티호스트 환경에서 컨테이너를 클러스터링하기 위한 툴을 컨테이너 오케스트레이션 툴이라고 합니다. 오케스트레이션 툴은 컨테이너들을 클러스터링하기 위해 컨테이너 시작 및 정지와 같은 조작, 호스트 간 네트워크 연결, 스토리지 관리, 컨테이너를 어떤 호스트에서 가동시킬지와 같은 스케줄링 기능을 제공합니다.

그리고 이러한 오케스트레이션 툴은 대표적으로 쿠버네티스가 존재합니다. 구글을 중심으로 하는 오픈소스이며, 다양한 기업에서 개발에 참여하고 있습니다.


이미지가 없어서 아쉬운 긴 정리 글이였습니다…! 이후에 관련 이미지도 추가하여 포스팅의 이해도를 발전시켜보겠습니다 😎


참고 자료


Profile picture

주희(Joy)
가치를 고민하는 과정을 함께해요