객체지향 기술의 발전
- 기술 트랜드 :
OOP > 컴포넌트(Component) > "분산"컴포넌트(스프링) 서비스기반 아키텍쳐 (SOA : Service Oriented Architecture) > 마이크로 서비스 아키텍쳐 (MSA : Micro-Service Architecture) > 스프링 MSA
- OOP > MVC (Model/View/Controller) 아키텍쳐 > DI(Dependency Injection)
객체지향
- 전체코드가 클래스 하나인 경우? > 객체지향이 맞을까? 맞다!
- 디자인패턴(경험, 베스트 프랙티스 Best Practice-최선책)
- MVC (Model/View/Controller)패턴. 3개의 클래스로 분리하자.
데이터는 Model, 화면은 View, 조율을 Controller
- 모바일/PC 동시 대응할 수 있다는 장점.
View에는 로직이 최소화되어야하지만, 로직이 들어가게 됨.
- MVVM(Model-View-ViewModel) 이 나오게 됨.
- DI(Dependency Injection) 패턴
POJO(Plain Old Java Object)
- 자바 객체지향의 특징 및 정신을 요약
- 클래스/인터페이스로 구현할 수 있는 방법을 모두 제공.
- 특정한 기술/규약에 의존 배격
스프링은 유사종교(?)
- 유교/유학
- 공자
- 맹자
- 역성혁명 / 제왕학
- 왕이 부덕하면 바꿔야한다.
- 수신제가치국평천하
- 주자
- 성리학
- "성(사람의 본성)" 과 "리(이치)"
- 우주론(태극, 주역 등등..)
객체지향 흐름
- 상속/캡슐화
- POJO(궁극적인 객체지향)
- 특정 클래스를 상속받아야 함(X. 이거 아님)
- Thread 생성 > Thread 클래스 상속/Runnable 인터페이스 상속
- 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다. 그러한 POJO에 애플리케이션의 핵심로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 할 수 있다.
- 스프링 삼각형
객체지향 분석설계(OOAD)
- 객체지향(OO) 기술 = OOA+OOD+OOP
- 객체지향 분석설계(디자인)의 5원칙 (SOLID)
- SRP(Single Responsibility Principle) : 단일책임 원칙
클래스 하나 당 기능 하나. 메서드 하나에 기능 하나. 코드 안에 하나의 기능만 넣자. 심플하게 짜자.
- OCP(Open-Close Principle) : 개방-폐쇄 원칙
기능추가에는 열려있고, 수정에는 닫혀있다.
기능추가가 쉬운 구조로, 조금의 수정으로 코드에 반영되게 설계되어야한다.
- LRP
- ISP
- DIP
- DO + AOP + PSA를 지키면 SOLID원칙에 맞게 코드를 구성했다 볼 수 있다.
DI스러운 코드 > OCP를 지켰다.
객체지향기술의 심화 (POJO)
- 클래스/인터페이스로 구현할 수 있는 방법을 모두 제공
- POJO의 열렬한 지지자
- Spring Framework / MyBatis ...
Interface vs Abstract class
- 사이비
- 템플릿 메소드 패턴(추상클래스) vs 전략패턴(인터페이스)
- 자바의 단일상속을 고려하면 인터페이스를 사용하는 것을 선호
- 인터페이스를 사용하는 전략패턴(DI)가 주류이다.
제어의 역전(IoC)
- Inversion of Control
- 프레임워크/WAS/미들웨어 등이 주로 사용.
- 제어의 권한을 넘기고 필요한 기능(메소드/함수)만 구현하는 형태
- 프레임워크는 정해진 (콜백)메소드를 호출하면 사용자의 코드가 호출되는 구조.
UML 기본
의존성 주입(DI)
- Dependency Injection
- 디자인패턴의 전략패턴(Strategy Pattern)
- 필요한 의존성 오브젝트를 정해진 시점에 공급.
- 의존성이 없는 (최소화한) 프로그래밍을 작성하라.
- DI를 왜 쓰는가? 여러 환경에서 적용할 수 있게 하기 위해서.
설계할 때는 어떤 환경에서도 실행할 수 있는 코드를 짜고, 실행하는 순간 의존성이 생겨야한다.
의존성(Dependency)이란
- 어떤 프로그램이나 서비스가 수행되기 위해 필요한 것.
- 의존성의 종류
- 의존성에 방향이 있다.
- 전체는 부분에 의존한다.
- 큰게 작은것에 의존.
- 예시) 프로그램에서 DBMS로 오라클을 사용한다. > 프로그램은 오라클에 의존한다.
객체지향기술의 심화 - 의존성 주입(IoC/DI)
- 인터페이스에만 의존
- 코드를 의존성이 없는 방식으로 구현.
- 오라클에서도, MySQL에서도 작동되는 프로그램을 만들자.
- 인터페이스를 구현한 오브젝트를 계속 만들 수 있음.
- 코드의 기능추가가 매우 쉬운 구조.
- SOLID의 OCP(개방-폐쇄) 원칙 준수
- 확장에는 열려있고(OPEN) 수정에는 닫혀(CLOSE) 있어야 한다.
- 어떤 오브젝트를 생성할 때 필요한 구체적인 오브젝트를 지정하는 형태
- 주로 생성자를 사용해서 주입.
- setter/일반 메서드를 사용하는 경우도 있음.
인터페이스를 선호하는 이유 (= 상속의 문제점)
- 클래스를 상속받았는데, 재활용 되지 않는 코드가 있다면,
- 전체를 다 상속받았는데, 사용 안되는 코드가 있다. > 군살같다.
- 다중 상속은 활용되지 않는 코드가 늘어날 가능성이 높음.
- 그러니까 단일상속만 허용하자.
- 인터페이스는 코드가 없기 때문에 상속받아도 오버헤드(군살)이 없다. > 인터페이스는 오버헤드없는 상속이 가능.
- 코드의 통일성 유지 및 기능추가에 유연한 구조.
- 코드 재활용보다는 유연한 기능추가에 방점을 주자.
- DI가 유행이 됨 > 모든 코드를 DI로 만들어버리자!
- PSA : POJO, DI가 적용이 안된 코드도 껍데기는 DI스럽게 만들자.
- JUnit : 내부적으로는 JUnit이지만, 껍데기는 인터페이스.
껍데기는 DI지만 내부는 아님.
Spring에서 DB를 연결하려면 JDBC, Spring JDBC로 포장이 되어 있어야 함.
모양 자체가 이상해짐.
- POJO화는 DI가 큰 역할을 하고 있음. AOP나 DI가 적용되지 않는 것은 PSA로 포장해서 DI스럽게 보이자. >> 이것이 스프링 삼각형.
스프링 삼각형
DI(의존성 주입) 방법
- 어떠한 의존오브젝트가 들어오더라도 동작할 수 있도록 하는, 일반화 프로그래밍
- 생성자를 통한 주입
- 기본. 주로 어노테이션을 사용하여 간단히 만듬.
- setter를 통한 주입
- 전용 메서드를 통한 주입
- 여러 개를 주입해야 하는 경우 전용 메서드 지정.
WAS에서 제공되는 기능
- 상용서비스를 운영하게 된다면, 서버를 하나로 할 수 없다. 서버나 DB가 죽더라도 서비스는 유지되어야 하기 때문.
- DB가 죽어버리면 어떡하지? 서버 증설해야하는 경우라면? > 카피본을 만들어서 예비를 만들어둔다. (이중화)
- DB에서 트랜잭션을 한다고 해도 DB가 트랜잭션을 보장하는 것은 완벽한가? > DB도 죽을 수 있기 때문에 완벽하지 않다.
- DB외부에 별도의 시스템이 있어서(WAS, Middleware 등), 문제가 생기면 롤백을 시키거나 우회를 시키는 등의 역할을 하는 서버/시스템이 필요함.
- WAS가 들어가면 최소 3-tier. WAS가 글로벌 트랜잭션을 수행해줌. T-max의 제우스 등이 있다.
- 트랜잭션 처리
- DBMS가 아닌 외부에서 트랜잭션 처리 보장
- 로컬(일반) 트랜잭션 vs 글로벌(분산) 트랜잭션
글로벌 트랜잭션: 서버 외부에서 여러 DB서버간의 트랜잭션을 처리해야되는 것
- 2PC(Phase Commit) 프로토콜 - XA 프로토콜
2PC프로토콜 : 두개의 DB사이에 커밋을 두 단계로 둠. 두 단계 commit 프로토콜.
XA 프로토콜 : 위의 것을 구현.
- 로드밸런싱(L7 / L4 switch)
- 로드밸런서 : 클라이언트가 생겼을 때 어느 서버로 배치해주는지 결정. (ex 은행 번호표.)
- 동일한 여러 대의 서버로 분산처리
- 다이나믹 vs 스태틱
- 스태틱 - 모든 서버에 일을 공평하게 나눠줌.
- 다이나믹 - 일이 몰린 서버에 일을 빼주거나, 적은 서버에 일을 더 줌. 대기열이 긴 서버에는 일을 적게주고, 짧은 쪽에 집중해서 배당해줌.
- 고가용성
- 일부 서버에서 장애가 발생하더라도 전체 서비스 유지
- 장애가 나더라도(서버, DB따위 등이 죽거나 하는 일로) 전체 서비스는 잘 운영되게 하는 것.
- (오토)스케일링
- 로그 취합
- 여러 대의 서버에서 발생한 로그를 취합, 관리하는 기술.
- 카프카 : 로그취합 가능.
AOP(Aspect Oriented Programming)
- 관점지향 프로그래밍
- 비즈니스로직에
- 메인 코드에는 로직코드만 있고
- 나머지 기능은 메서드 이름에 따라 부여
- 예)txWrite() > tx라는 단어가 있으면 트랜잭션 처리를 하도록 부여
- 바이트코드 위빙(weaving)
- 소스코드, 컴파일 시점, 바이트코드 로 변환된 시점
- 클래스 로드 시, 런타임(실행중)
- SpringAOP vs AspectJ
PSA(Portable Service Abstraction)
- DI로 안된 프로그램을 DI 포장을 입히는 작업
- ex. JUnit, JavaMail, JDBC 등의 코드를 DI화해서 제공.
- JUnit vs SpringJUnit
- 일반적인 JUnit코드와 스프링 기반의 JUnit이 다름.
- JDBC도 마찬가지. 일반적인 JDBC와 스프링 JDBC는 다르다.
스프링 프레임워크
- 분산컴포넌트 기반의 백엔드용(비즈니스 로직) 프레임워크
- 주로 WAS(Web Application Server)와 같이 운용
- 3-tier / N-tier 환경에서 주로 운용
- IoC/DI 기반
- 스프링은
VMWare
이라는 회사에서 만들고 있다.
- VMWare은 Dell의 스토리지서버 자회사인 EMC의 사업부문(자회사 될수도)
- 서버(DELL), 스토리지서버(EMC), 가상화/스프링 프레임워크(VMWare)
WAS/미들웨어
3계층 구조(3-tier)
- 표현계층
- 비즈니스 로직 계층
- 비즈니스 오브젝트(데이터)계층
- DBMS와의 연결 담당
- ORM
- SQLMapper(MyBatis)
tier (1 참조)
- WAS는 최소 3티어부터 시작된다.
- 트랜잭션/로드배런싱, 장애대응, 로그취합 등등은 3티어부터 가능성이 생긴다.
비즈니스 로직
- 업무논리(로직)을 코딩하는 부분
- 비즈니스 로직을 구현/운영할 때 필요한 많은 추가 기능 필요
- 트랜잭션 처리(로컬/글로벌), 로드밸런싱, 고가용성(장애대응), 스케일링, 로그취합 등
- WAS(예전에는 Middleware)와 같이 운용
- 높은 신뢰성이 필요함
- 높은 SW비용(수천만~수억원 대)
- 저렴한 WAS vs 비싼 WAS
- BEA Weblogic, Tmax JEUS, tcServer, IBM WebSphere
네트워크 프로그래밍과 RPC + 분산컴포넌트
네트워크(소켓) 프로그래밍
- TCP/UDP/IP
- High-lever vs Mid-level vs Low-level
- Stream vs Buffer vs Packet/Segment
- Blocking / Non-Blocking / Asynchronous
- 컴퓨터 Big3 - OS, Network, DB (AI)
RPC / RMI
- 단점 : 속도가 떨어진다.
- Remote Procedure Call / Remote Method Invocation
- 네트워크 프로그램을 함수(메서드) 호출하는 방식으로 만들어 줌.
- 서버 /클라이언트에 일종의 프록시(Proxy)가 필요
- 스텁(Stub)/스켈리톤(Skeleton)
- 인자와 리턴값을 시스템에 맞게 조정해주어야 함.
- 마샬링/언마샬링(오리지날), 직렬화/역직결화(자바)
조정해주는 것 > 마샬링, 직렬화. 복원하는 것 > 언마샬링, 역직렬화
- Sun(지금은 오라클에 인수)이 처음으로 제안
- Sun RPC / DCE RPC로 분화
- Java RMI는 Sun RPC 기반, MS DCOM은 DCE RPC기반
→ 자바는 자바대로, 윈도우는 윈도우대로 돌아간다는 의미.
윈도우 서버의 안드로이드(자바) 클라이언트는 어떻게 해야할까? 원격으로 RPC를 하고 싶지만, 그럴 수 없다. DCE와 Sun은 호환성이 없다.
- 여러 시스템 간 연동을 위해서 xml/JSON을 사용.
- 자바직렬화 RPC vs xml RPC vs JSON RPC
xml은 느리니까 JSON으로 하자.
- 현재는 오버헤드를 더 줄인
gRPC(Google RPC)
기반으로 성능 최적화
- 텍스트 대신 바이너리로 RPC를 주고받음.
- HTTP/2 요구하고 프로토콜버퍼(ProtocolBuffer)라는 구글솔루션을 써야함. > 면접관이 좋아할 얘기.
디렉토리 서비스
- 여러대의 시스템에서 해당 컴포넌트 / 함수를 찾으려면 디렉토리 서비스를 통해 등록/검색
- 디렉토리 서비스(Directory Service) / 레지스트리(Registry)
- X.500 기반
- Novell Netware(IPX/SPX)
- Java JNDI(Java Naming & Directory Service)
- MS Active Directory
직렬화(Serialization) / 역직렬화(Deserialization)
마샬링/ 언마샬링
- 메모리 상의 자바 오브젝트를 네트워크나 디스크에 저장/전송하고 복원하는 개념.
자바 → JSON / JSON → 자바
- RMI를 기반으로 스프링 BEAN이 생성되어 돌아감.
- Persitence(지속성)의 요구조건
- 오브젝트의 필드를 스트림화(streamize)해서 저장(전송)
- ObjectInputStream / ObjectOutputStream
- writeObject() / readObject
리플렉션(Reflection)
- JVM 상에서
- 오브젝트 → 클래스/부모클래스 조회
- 클래스 → 오브젝트 생성
- 메서드 인자기반으로 호출
- 생성자 호출
- ...
Java BEANs(콩, 사람 머리)
- 조건
- 직렬화(Serializable) 가능
- 기본생성자가 있어야 함.
- 모든 프로퍼티(method/field)는 private해야 한다.
- 프로퍼티는 getter/setter가 있어야 함.
- persistent 해야 한다. -저장/복원이 가능해야 함.
스프링 빈(Spring Bean)
참고 링크
스프링 RMI
- 스프링은 스프링 빈을 만들어서 등록하고, 사용한다.
Apache Kafka
- LinkedIn에서 만든 고성능 분산메시징용 오픈소스
- MoM(Message-oriented Middleware)용
- cf. IBM MQ Series / JMS(Java Messaging Service)
- 안정적인 버퍼링(큐잉)/스트리밍용/Log Aggregation/헬스체크
- Producer / Consumer / Broker
- 트래픽이 과다되면 서버가 다운된다 → 서버를 증설하면 해결되는 문제긴 하지만, 서버 증설에는 자원이 소요된다. → 버퍼링, 큐잉 등을 도입해서 해소할 수 있다.
- 버퍼링의 장점 : 서버 스트레스를 줄여줌. 시스템 안정성이 높아진다.
단점 : 동시 최고 사용자를 제한함.
- 큐잉 시스템의 최고 미덕은 서버 안정성을 높여서 서비스 다운을 막는 것.
서버 딜레이가 길어진다.
- 이런 기술은
1) 큐잉, 버퍼링 등으로 서버에 과부화를 주지 않고 안정적으로 작동하게 하고,
2) 많은 write가 발생했을 때 안정적으로 작성할 수 있는 기술.
- 용도
- Messaging System
- Website Activity Checking/Monitoring
- Log Aggregation
- Stream Processing / Batch Processing
- Buffering
- Event sourcing(이벤트를 시간순으로 기록)
카프카 이전 → 이후
- topic들은 Broker가 보관하고, 브로커가 죽으면 안되기 때문에 Zookeeper이란 것이 지키고 있다.
Kafka의 특징
- Publisher/Subscriber 모델
- High Availability / Scalability
- Sequential Sore and Process in Disk
- Distributed Processing
Kafka 아키텍쳐
- Pub/Sub 구조
- 브로커(Broker)
- 주키퍼(Zookeeper) : 브로커가 죽는 상황을 방지.
- 토픽(Topic)
- 파티션(Partition)
- 리더(Leader)/팔로워(Follower)
- 컨슈머 그룹(Consumer Group)
Kafka leader/follower
- Broker이 세개. 각 토픽이 들어가 있음.
- 토픽 리더를 입력하면 팔로워가 업데이트 됨.
- ack
- 0 : ack를 기다리지 않음. 빠르다.
- 1 : leader는 데이터를 기록.
- all(-1) : 모든 ISR확인. 느리고 손실가능성 없음.
- DBMS의 마스터-슬레이브 복제와 유사.
- 동기복제/반동기/비동기 복제와 유사
파티션과 컨슈머 그룹
Kafka Broker 구성예
- 삼중화를 했으니, 2개가 고장나는 최악의 경우에도 사용 가능.
- write 파티션을 세개로 나눴으니 동시에 3개를 작성 가능.
Consumer Group
- Consumer들을 묶는 개념
- Consumer 수 만큼 파티션의 데이터 분산처리함(읽을 때의 단위)
- 파티션이 3개면 3개의 Consumer가 필요하다.
- 복제본에는 Leader를 선정(하늘색), 읽기 쓰기를 관장하는 구조.
카프카 성능 (vs RabbitMQ)
- 카프카가 성능이 좋다.
- 제로 카피(Zero Copy)
- 큐의 복사가 실제 일어나지 않고, 주소의 복사만 일어나게 된다.
- 많은 수의 큐/버퍼를 관리해야하는 상황에서 큰 성능차가 발생.
- 큐 (mbuf:BSD)를 복사하지 않고 포인터를 넘기면 성능이 향상된다. (3번→0번)
실제 메모리 카피를 하지 않는다.
- 리눅스/BSD 네트워크 커널
Apache zookeeper
- 카프카는 주키퍼가 필수.
- 브로커가 죽으면 모든 프로그램이 죽음. 그리고 이 주키퍼는 브로커가 죽지 않도록 방지한다.
- 고가용성 기술 : 일부 서버가 죽어도 서비스를 계속 사용할 수 있게하는 기술.
같은 브로커가 최소 두개 이상은 있어야 고가용성을 유지할 수 있다.
- Master / Slaves
- 하나의 마스터와 여러 개의 슬레이브 구성
마스터가 죽어도 슬레이브로 연결해서 서비스 유지.
- 수동으로 한다는 특징.
- 근데 수동으로 하는 거 별로 원하지 않음.
- Active / Stand-by
- 장애가 발생하면 Fail-over
- Active 브로커가 우선 작동을 하다 죽을 경우, Stand-by브로커가 대체하게 된다.
최초 Active는 하나. 동작하는 Active가 죽을 경우 Stand-by 브로커가 Active 브로커로 자동 전환됨.
- Active 브로커는 항상 하나이다.
- 전환에 시간이 걸리면 문제가 생길 가능성이 있음.
- Active / Active
- 동시에 여러 개의 Active를 구성
- 어떤 상황에도 Active가 하나 이상 존재함.
따라서 Active가 죽어도 큰 문제가 없음.
- 의견이 다를 때는 합의(다수결. 3,5,7,9개의 Active)
결정에 시간이 걸린다는 단점이 있음.
zookeeper에 대한 입장
- 필수
- 꼭 해야함.
- Required / mandatory / compulsory
- 권장
- 안해되 되지만, 안하면 좀 힘들걸
- recommended
- 옵션
- 하둡2 부터는 주키퍼는 recommended, 카프카의 주키퍼가 required
클라우드
클라우드 현황
- IT 공룡들의 경쟁
- 실리콘 밸리 핵심기업 FAANG
- Facebook, Amazon, Apple, Netflix, Google
- 클라우드 4인방 AMIG
- Amazon AWS
- Microsoft Azure
- IBM Bluemix(Watson, Hyperledger Fabric, ...)
- Google Cloud
- 얼마나 돈이 될까?
- 모든 IT 기업들이 클라우드에 투자.
- 한국은 규제나 기술격차가 심하다.
클라우드는 싸지 않다.
- 절대비용은 작게 잡아도 50%이상 비쌈.
- 하지만 총 비용(TCO, Totla Cost of Ownership. 총 소유비용) 감소
- 인건비, 수리비 등 여러 부대비용을 모두 계산해보면 클라우드가 더 저렴하다.
클라우드의 장점
- 비용 절약! / 시간 절약 / 부가가치
- 첨단 하청.
- 클라우드로 옮기면 기존의 서비스가 모두 지원되는가?
클라우드 서비스의 종류
- 클라우드는 public과 private로 나뉨
- 대상이 일반인가 기업인가
AWS 등은 public 계열. 카카오 등 기업 자체적으로 구축한 클라우드는 private
- 클라우드 자체 구축(On-premise) vs 클라우드 서버 사용
- 서버 호스팅과의 차이점은?
- 비용 / 보안 / 성능 문제 등등..
SPI 모델
IaaS(Infrastructure as a Service)
- 서버 자원(CPU/메모리/디스크/네트워크), ...
- 아마존 AWS EC2
- 요새는 OS설치까지는 해서 제공되는 경우가 많다.
- OS + Runtime(Java)+Platform(Spring, Hadoop, DBMS, ...)
- 아마존 AWS EMR
- 풀옵션 원룸과 비슷함.
- 프로그램을 실행하기 위한 여러 기반 프로그램이 갖춰져 있는 경우.
SaaS(Software as a Service_
- Google Drive, MSOffice.com, ...
- BaaS(Backend as a Service)
- 네트워크를 사용하는 앱을 만들 때 서버단을 서비스형태로 제공.
- CaaS(Container as a Service)
- MaaS(Monitoring as a Service)
- CaaS(Communication as a Service)
- DaaS(Database as a Service)
- XaaS(Anything as a Service)
- BaaS(Blockchain as a Service)
- IaaS와 SaaS 사용이 많다. IaaS의 점유가 50% 이상.
오픈소스 기반 IaaS 서비스
- 오픈스택(OpenStack)
- Open IaaS
- IaaS 스타일의 오픈소스 클라우드 구축 플랫폼
- "KVM"을 기본 하이퍼바이저로 사용
- 직접 IaaS를 구축할 수 있다.
- 오픈스택 재단(OpenStack Foundation)
- 2010년부터 시작.
오픈소스 기반 PaaS 서비스
- VMWare의 CloudFoundry와 Redgat의 Openshift가 경쟁
- PaaS에서 기본으로 제공되는 "서비스"의 종류
- 장애 복구, 스케쥴링, 로드밸런싱, 확장성(Scalability), 고가용성(High Availability), 미터링(Metering), 모니터링(Monitoring)
클라우드 구현 기술
- 클라우드를 구축하기 위한 가능 기술(Enabling Technology)
- 가상화
- 하이퍼바이저(Hypervisor)로 통칭
- VMWare, Hyper-V, ...
- 컨테이너 기반 가상화
- 도커(Docker), 쿠버네티스(Kubernetes)
가상화
- 가상화는 얼마나 사용하나?
- 서버에서는 가상화를 사용하지 않는 경우가 거의 없다.
- Utilization(70~80%)
100%에 근접하게 할 경우 불안해질 수 있다.
- 하지만 개별 VM은 느려짐
- 가상머신 예시
- 리소스가 놀고 있다면 가상머신을 추가해서 성능을 끌어올린다.
- 가상화(Virtualization)는 서버의 리소스 가상화를 통해 하나의 서버에 여러대의 OS를 동작시킬 수 있는 기술
- 서버의 사용 효율 (Utilization)을 높일 수 있다.
- 컴퓨터 자원 (CPU, 메모리, 저장장치 등)의 추상화/프로비저닝(Provisioning)
- CPU의 기능 지원 필요
- vt-x(인텔)/AMD-V(AMD)
- 인텔 셀러론/펜티엄 계열 CPU는 지원하지 않음.
- 가상머신을 사용하면 낭비되는 리소스를 활용해 성능을 개선할 수 있다. 하지만 개별 VM의 성능은 저하된다.
→ 개별 VM의 성능을 덜 저하시키는 기술이 나오게 된다.
- 가상화 2세대 기술
- 도커(컨테이너기반 가상화)
- 쿠버네티스(오케스트레이션 기술)
도커 & 쿠버네티스
가상화
- 가상화(Virtualization)는 서버의 리소스 가상화를 통해 하나의 서버에 여러대의 OS를 동작시킬 수 있는 기술
가상화의 레벨
- API(Application Programming Interface)
- 응용프로그램 레벨의 함수/메서드, 언어독립적인 경우도
- 윈도우→리눅스, 리눅스→윈도우 처럼 가상화 없이 프로그램이 돌릴 수 있도록 API를 제공.
- WSL(Windows Subsystem for Linux)
- ABI(Application Binary Interface)
- Windows RT(AMD) vs Windows(Intel)
- 플랫폼과 소프트웨어 사이의 인터페이스 정의
- API보다 낮은 레벨
- API는 유지되면서 ABI는 변경되는 경우
- 안드로이드 프로그램이 윈도우에서 동작하게 해주는 것도 일종의 VM. ABI기술에 속한다.
- ISA(Instruction Set Architecture)
- 하드웨어와 소프트웨어 사이의 인터페이스 정의
- VMWare등의 기술. 애뮬레이션처럼 동작함.
일반적인 부팅방식을 따름.
- 하이퍼바이저
- 호스트시스템에서 다수의 게스트 OS를 돌리기 위한 플랫폼
- 호스트 OS
- 게스트 OS
- 타입 1
- 타입 2
가상화의 장단점
- 장점
- 서버의 사용효율(Utilization)을 높일 수 있음.
- 20년 가까이 성숙된 기술/시장의 주류
- 단점
- 네이티브보다 느림.
- 상대적으로 무거움(컨테이너 기반 가상화)
- 불필요한 기능의 중복
- 배치(Deployment)의 어려움
전가상화와 반가상화
전가상화(Full Virtualization)
- 하드웨어를 완전히 가상화
- OS를 제약없이 사용할 수 있음
- 게스트 OS는 자신이 가상머신 위에서 동작하고 있다는 것을 인식하지 못함.
- 시스템에서 물리적인 가상화 지원기능이 필요. vt-x(인텔)/AMD-V(AMD)
- 게스트 OS에서 물리자원에 직접 접근 불가
- 반드시 하이퍼바이저를 통해 접근해야 함 → 성능 저하로 이어짐.
반가상화(Para Virtualization)
- 게스트 OS가 자신이 가상머신 위에서 동작하고 있다는 것을 인식
- OS 제약이 있다.
- OS의 제약, 커널을 수정해야한다.(주로 리눅스만 됨)
- 게스트OS에서 물리자원 직접 접근 가능(Passthrough) → 성능개선
- 바이너리 변환(Binary Translation)
- HVM(Hardware Virtual Machine)
- 서버는 거의 100% 가상머신을 사용하지만, 사용하지 않는 경우도 있다.
그것을 베어메탈이라고 부른다.
- Bare : 거의 없는. Bare-metal은 위에 덮인 프로그램 없이 생 쇠와 같다는 뜻으로 이해하면 된다.
하이퍼바이저 종류
- VMWare
- 대표적인 상용 하이퍼바이저
- ESXi/Workstation/WorkStation Player
- vSphere(ESXi+vCenter)
- vCenter : 중앙제어
- 가상머신과 중앙제어 소프트웨어
- MS Hyper-V
- Ctrix Xen(오픈소스)
- KVM(오픈소스)
- 하이퍼바이저를 커널의 '서브모듈'로 제공(.ko)
- 메모리관리자/파일시스템/하이퍼바이저
- 오픈스택의 기본 하이퍼바이저
- 패러렐즈(Parallels)
- 오라클 버츄얼박스(Oracle VirtualBox)
컨테이너기반 가상화
- 기존의 가상화와 다른 개념
- 하드웨어 가상화가 아닌 실행환경의 분리(isolation)
- 각 컨테이너 간 영향을 분리
- 기존의 경우 : 호스트OS > 하이퍼바이저 > 게스트OS > ...
- 도커 : 호스트OS > 도커 > ...
- 사용하는 입장에서는 일반적인 가상머신과 다를 것이 없으나, 아키텍쳐 관점에서는 게스트 OS와 다르다.
호스트OS의 커널을 컨테이너가 모두 공유.
- 도커는 리눅스 전용 기술. (윈도우 X)
- 구축 및 실행 단순화
Build-Ship-Run
도커의 특징
- 가볍다
- 똑똑하다
- 많은 사람들이 자기가 구축한 이미지를 공유(도커허브)
- 거의 천만개 이상의 이미지가 공유되고 있음.
- 구글, 오라클과 같은 회사에서 자사의 SW 배포 방법으로 채택
- 텐서플로우, 오라클/MySQL, ...
- 에코시스템(Ecosystem)
- 도커의 단점을 보완하는 기술들.
- 도커기반/활용 기술의 활성화
- 도커 컴포즈, 스웜, 쿠버네티스, ...
- 하이퍼레저 패브릭, ...
- 가상머신을 쓰는 것보다 도커를 사용하는 것이 장점이 더 많다.
- 오버헤드가 3~5% 이내
- 도커를 쓰면 네이티브(베어메탈)에 비해 큰 성능저하를 보이지 않는다.
기술적 특징
- 시스템의 분리에는 Linux Containers(LXC)
- 파일 시스템은 Advanced multi layered unification filesystem(Aufs)
- 그리고 Git과 같은 이미지 버전컨트롤 시스템 도입
- 모든 컨테이너들이 동일 OS 커널 공유
- 독립적인 스케줄링이나 CPU/메모리/디스크/네트워크를 가상화하지 않음
- 리눅스의 특수 기능(LXC)을 사용한 실행환경 격리를 응용
- 다른 OS(윈도우/OSX)에서 사용하려면
- 일반 하이퍼바이저(경량)가 있어야 함
- Windows Container 지원 (MS)
- 구글에서 만든 Go언어로 작성
- PaaS 공급업체 DotCloud가 PaaS의 백엔드로 사용하는 컨테이너 기반의 가상화 소프트웨를 오픈소스로 공개.
- 14년 6월 출시
- 구글과 같은 메이저 벤더들에 빠른 속도로 채택
- 현재 사실상의 표준(de facto standard)이 됨
- 리눅스 시스템설정방식과 도커기반 리눅스 설정방식이 다름.
LXC
- 커널에 있는 기능만 사용해도 가상화를 할 수 있음.
- Linux Container
- 시스템레벨 가상화
- cgroups(control groups)
- Namespaces(Namespace Isolation)
- 프로세스트리, 사용자계정, 파일시스템, IPC, ...
- 호스트와 별개의 공간 설정
- chroot(change root) 명령어에서 발전
- chroot jail
- chroot 상의 폴더에서 외부 디렉토리 접근 안됨.
- 하지만 우분투의 특허기술.
Libcontainer
- 우분투의 의존성을 해결하기 위해 LXC 외에 libcontainer 제작
- 실행 드라이버(exec driver)라고 부름.
- native(libcontainer), lxc(LXC)
- 이 기술을 도입하고 나서 우분투 외에서도 기능하기 시작함.
containerd/runC
- 표준화 진행한 도커.
- 기존방식과 최신방식의 차이점
- containerd/runC 기반의 도커
- 도커 1.11 이후
- containerd
- 컨테이너를 실행하고 노드에서 이미지를 관리하는데 필요한 최소한의 기능세트를 저장하고 OCI(Open Container Initiative) 호환 코어 컨테이너 런타임 중 하나
- CNCF에 공식적으로 포함됨(쿠버네티스 표준화 담당)
- 도커는 root권한을 요구하는데, 이것이 보안취약점을 만들 수 있음.
LXD
- 우분투를 만든 캐노니컬(canonical)에서 만든 컨테이너 솔류션
- 기존의 LXC에 보안 개념 추가
- Secure by default
- Unprivileged container
- 도커는 Application Container, LXD는 Machine Container
- LXD는 Container "Hypervisor"
- 경쟁기술이라기 보다는 보완관(도커와 병행 가능)
- KVM(Kernel Virtual Machine)을 경쟁 기술로 간주
- Docker on RunC vs Docker on LXD
- 단점 : 캐노니컬의 특허 기술이기 때문에 우분투에서만 기동함.
때문에 LXD는 반쪽짜리 해결책이라 부를 수 있음.
rkt, 로켓
- root권한을 요구하지 않는 다른 컨테이너 프로그램을 이용한다면? 보안문제를 해결할 수 있지 않을까?
- 단점 : 도커를 사용하지 않으면 도커 이미지를 활용할 수 없다.
Container Orchestration(컨테이너 지휘)
오케스트레이션
- 여러 대의 서버/서비스를 편리하게 관리해주는 작업
- Logging, Monitoring
- 여러 대의 서버를 관리하는 경우 로그와 서버 상태를 한 곳에서 관리
- Service Discovery
- 서버나 컨테이너가 추가되었을 때 자동으로 발견하는 작업
- Clustering
- Scheduling(핵심기능)
- Load Balancer
- 여러 개의 서버/컨테이너에 작업을 고르게 분배.
- High Avilability(고가용성)
- 클러스터 내의 서버가 다운됐을 때 대응
cf. DB 이중화
- (Auto) Scalability
- 성능을 지속적으로 향상시키는 기능
트래픽 양에 따라 서버 수를 조절함. 완전자동으로 할수도 있고, 명령어를 통한 수동제어도 가능.
- Rolling Update
- 여러개의 컨테이너의 이미지 업그레이드
일부는 업데이트 / 일부는 운영. 모든 서버가 동시에 업데이트하면 위험하다.
→ 일종의 분산 WAS/미들웨어의 역할
툴 선택기준
- Swarm vs Kuvernetes
- 쿠버네티스
- 강력한 기능/ 복잡한 설정
- 500대의 서버에 50,000컨테이너를 서비스 가능
- 스웜
- 비교적 간단한 설정
- 50대 미만의 경우 스웜을 사용하는 것이 유리
- Kakao Cloud > 20000VM > 2~3명이 관리.
- 도커는 스웜을 좋아하지만, 시장은 쿠버네티스를 선택하는 것 같다.
서비스가 시작될 때는 규모가 작겠지만, 시간이 지나면 지날수록 더 많은 서버가 필요하게 됨. > 결국 스웜으로는 부족해진다.
- 공부할때는 스웜이 좋지만 운영할 때는 결국 쿠버네티스를 사용하게 된다.
스웜
- 여러대의 도커 서버를 하나의 클러스터로 구성
- 분산코디네이터(Distributed Coordinator)
- 각종 정보를 저장하고 동기화
- 일종의 분산 DB
- 서버 상태, 각 노드의 상태를 파악할 수 있음
- 매니저(Manager)
- 클러스터 내의 서버를 관리하고 제어함.
- 각 서버의 상태를 보고 명령을 내림.
- 에이전트
- 각 서버의 제어를 담당.
- 매니저에게 명령을 받고, 명령을 수행.
분산 코디네이터
- 기능
- 클러스터에서 새로운 서버의 발견
- 클러스터의 각종 설정 저장
- 데이터 저장
- 보통 고가용성(HA:High Availability)를 위해 사용하는 경우가 많음
- 분산 코디네이터가 다운되면 전체 클러스터가 동작하지 않음.
- etcd(kubernaetes), zookeeper(swarm, hadoop, spark, ...), consul등이 있다.
스웜 모드
- (정적) 로드밸런싱
- 라운드 로빈(round-robin)방식으로 컨테이너 접근
- 이중화를 하면 내부적으로 로드
- 스케일링
- 장애 복구
- 롤링 업데이트
- 로그(도커)
- 로그 취합(스웜)
Kubernetes