2015년 12월 10일 목요일

모던 자바의 역습(2) 자바를 둘러싼 진실 혹은 거짓말

이번 포스팅은 김대우 님(http://lekdw.blogspot.kr/)과 함께 진행한 동명의 웨비너의 발표 내용에 바탕을 두고 작성되었습니다. 세상에 나온지 어느덧 20년. 오랜동안 프로그래밍 언어의 절대 강자로서 세상을 호령하던 자바를 둘러싼 진실 혹은 거짓말 그리고 과거와 미래에 대하여 알아봅니다.

스크롤의 압박을 피하기 위해 이번 포스팅은 다섯 파트로 나누어 연재합니다.


모던 자바의 역습 

2. 자바를 둘러싼 진실 혹은 거짓말

자바는 오래된 언어이고 여러 영역에 걸쳐 쓰이다 보니 다양한 모습을 지니고 있습니다. 그러다 보니 언어 자체에 대한 선입견이 많이 쌓인 것도 사실입니다. 일반적으로 자바에 대해 개발자들이 가지고 있는 선입견은 다음과 같습니다.

자바의 성능

자바의 성능에 대한 의구심은 JVM의 최적화가 아직 덜 된 1.4 이전의 이미지가 선입견으로 굳어진 부분이 있습니다. 자바는 새 버전을 발표할 때마다 JVM의 성능 향상을 릴리즈 노트에 꼭 적어 놓고 있습니다. 결과적으로 많은 성능 개선이 이뤄져왔습니다. 다음의 그래프는 현 시점에서 자바가 여러 언어 사이에서 차지하는 성능에 대한 객관적인 지표로 참고할 만합니다.


위 그래프는 여러 언어들에 대하여 10종류의 로직을 벤치마크한 결과값을 나타냅니다. 자바의 경우 C/ C++에는 미치지 못하지만 비교적 상위권에 속한다는 사실을 알 수 있습니다. 여기서 한 가지 주의해야 할 점은, 이 벤치마크 결과는 순수하게 로직이 움직인 시간 만을 측정한 것으로 실행 파일이 메모리에 로딩되는 시간은 포함되지 않았다는 점 입니다. 자바의 경우 실행에 필요한 바이트코드 로딩시간  이외에도 JVM과 라이브러리가 메모리에 로딩되는 시간이 추가로 필요한데 이러한 초기 기동 시간이 오래걸리는 것이 자바가 느리다는 선입견에 한몫하지 않았나 합니다.

NIO의 Direct ByteBuffer

자바 1.4에서 추가된 NIO는 자바 7에서 2.0으로 버전업하며 더 강력한 기능을 선보이고 있습니다. javamex.com에서 실시한 벤치마크 결과에 따르면 NIO에서 추가된 direct ByteBuffer는 일반적인 ByteBuffer에 비해 평균적으로 20% 정도의 성능 개선을 보이는데 버퍼 크기가 커질수록 성능의 차이도 크게 벌어집니다.
NIO direct ByteBuffer벤치마크 결과



Netty PooledMemory를 이용한 고속 애플리케이션 구현

최근 성능에 목말라 하는 많은 자바프로그래머들로부터 주목받고 있는것이 바로 네티(Netty) 프레임워크(netty.io) 입니다. 이희승 님이 오픈소스화하여 발전된 Netty 프레임워크는 성능 향상을 위한 IO 관련 API부터 동시성 구현에 이르기까지 고성능에 구현하기 편하게 잘 디자인된 API 세트를 제공하고 있습니다. 네티의 여러 API 중에서도 특히 PooledMemory라 불리우는 buffer pool은 자바 기본 API에 비해 강력한 성능과 메모리 관리 효율을 자랑합니다.

간편해진 JVM 튜닝

초기 자바 버전에서 JVM 튜닝은 자바 애플리케이션, 특히 서버 애플리케이션에 있어서 안정성과 성능에 직접적인 영향을 끼치는 중요한 요소였습니다. 하지만 JVM 튜닝에 제공되는 옵션들은 JVM의 내부 동작구조에 대한 이해가 없이는 다루기가 어려웠고 최적값을 구하기 위해 설정값을 변경해가며 모니터링해야 하는 불편함이 있었습니다. 오늘날 자바 서버 애플리케이션에 있어서 JVM 튜닝은 다음의 네 가지 옵션 지정만으로도 대부분의 경우 무난히 작동합니다. 다만 대량의 IO가 발생하여 더 최적화된 가비지 콜렉션을 수행해야 하는 경우에는 사용하는 라이브러리의 특성과 내부적인 처리 방식에 따라 가비지 콜렉션 옵션을 적절히 지정해줘야만 합니다.    

  • -server : 서버 모드 기동. JVM을 장시간 실행해야 하는 서버 애플리케이션이 빠르고 안정적으로 실행될 수 있도록 최적화합니다. 참고로 client 모드의 경우 JVM의 빠른 기동과 더 적은 메모리를 사용하도록 조절됩니다.
  • -d64 : 64비트 JVM에서만 사용 가능한 모드로 JVM이 64비트 모드로 작동될 수 있도록 합니다. 64비트 어드레싱을 사용하므로 32비트 JVM의 상한선인 2기가 바이트를 넘어선 대용량의 메모리를 사용할 수 있습니다.
  • -Xms 과 -Xmx : 메모리 할당 풀의 하한선(Xms)과 상한선(Xmx)을 지정합니다. 상한선의 경우 너무 작게 잡으면 OutOfMemoryError가 일어날 수 있고, 너무 클 경우는 FullGC 시에 많은 시간이 소요되게 되므로 적절한 수치를 지정하는 것이 중요합니다.

언어별 생산성 비교

처음 등장할 당시에는 C/C++ 그리고 아직 엔터프라이즈 영역에서 무시 못할  세력을 가지고 있던 Cobol 언어에 비해 높은 생산성을 자랑하던 자바였지만 이후 등장한 C#이나 VB.net, 파이썬, 루비 등의 언어와 비교하여 다소 생산성이 떨어진다는 평가를 받게 됩니다.
하지만 프로그래머를 위한 웹진으로 유명한 Dr.Dobbs의 조사 결과에 의하면 전체 언어 중에서도 비교적 상위권(3위)에 속하는 생산성을 보여주고 있습니다.


언어명
기능포인트FunctionPoint를 구현하는데 소요되는 시간
ASP*
6.1
Visual Basic
8.5
Java
10.6
SQL
10.8
C++
12.4
C
13.0
C#
15.5
PL/1
14.2
COBOL
16.8
ABAP
19.9
언어별 생산성 비교

다만, 이 수치는 단순히 언어의 문법적 기능적 차이에서 오는 생산성 뿐만이 아니라, 개발 툴셋, 라이브러리와 레퍼런스의 풍부함, 그리고 해당 언어가 자주 사용되는 도메인 영역의 특성이 종합적으로 영향을 끼친다고 보아야 할 것입니다.

자바 기반 초고속 개발 프레임워크 - Vaadin

오늘날 자바를 있게 한 일등공신을 꼽으라면 인터넷을 꼽을 수 있습니다. 하지만 지금은 사정이 다릅니다. 루비온 레이즈(RoR, Ruby on Rails)가 선보인 웹 개발 스타일은 개발 속도와 편리함이라는 측면에서 엄청난 혁신을 가져온 것 입니다. 오늘날 자바를 이용한 웹 개발의 대세는 아직까지 스프링이 중심이지만, 아카(Akka) 라이브러리를 이용해 actor 모델을 구현한 플레이(Play) 프레임워크이나  지금 소개하고자 하는 바딘(Vaadin)의 경우 RoR의 개발 철학에 직접적으로 영향을 받아 발전시킨 프레임워크이라 할 수 있습니다.


Screen Shot 2015-07-24 at 7.31.55 AM.png
HTML, CSS, Javascript등 웹 UI 요소들을 서버사이드 자바 코드로 제어할 수 있게 해 주는 프레임 워크 - Vaadin


Vaadin은 웹 개발에 있어서 갈수록 중요도를 더해가고 있는 프론트엔드, 특히 자바스크립트와 CSS에 대한 부담을 덜어주기 위해 개발된 경량 프레임워크입니다. 백엔드 뿐만이 아니라 프론트엔드까지 모두 자바만으로 개발할 수 있도로 설계되어 있어 자바스크립트뿐만이 아니라 HTML까지도 자바에서 정의 가능한, 자바 개발자에게 있어서는 그야말로 환상적인 프레임워크라 할 수 있습니다.

vaadin의 아키텍처
출처 : dev.vaadin.com


자바의 언어 생태계

오늘날의 자바가 강력한 위상을 가지게 된 데에는 자바 플랫폼 이외에도 개발 환경, 라이브러리, 튜토리얼, 패키지 관리 시스템 등 자바를 둘러싼 거대한 언어 생태계를 빼 놓고는 이야기할 수 없습니다. 특히 오늘날까지 자바의 통합개발 환경으로 널리 사랑받고 있는 이크립스의 경우 높은 완성도에도 불구하고 무료인데다가 기능 확장이 자유롭도록 OSGi 기반의 플러그인 시스템을 갖추고 있어 단순한 툴을 넘어 플랫폼에 가까운 지위를 지니고 있습니다. 여러 개발 언어들이 각축전을 벌이고 있어 가히 언어의 춘추전국시대라 불리우기에 손색이 없는 요즘 시대에도 자바는 거의 모든 미들웨어나 플랫폼, 클라우드 서비스에게 있어서 최우선 지원 대상이 되고 있어 어떠한 형태의 개발을 진행하더라도 충분히 필요한 리소스와 레퍼런스를 지원받을 수 있습니다.

자바의 거대한 언어 생태계
출처 : http://readwrite.com/2011/01/24/the-java-ecosystem-infographic


모던 자바의 역습(1) 프로그래밍 언어 자바

이번 포스팅은 김대우 님(http://lekdw.blogspot.kr/)과 함께 진행한 동명의 웨비너의 발표 내용에 바탕을 두고 작성되었습니다. 세상에 나온지 어느덧 20년. 오랜동안 프로그래밍 언어의 절대 강자로서 세상을 호령하던 자바를 둘러싼 진실 혹은 거짓말 그리고 과거와 미래에 대하여 알아봅니다.



스크롤의 압박을 피하기 위해 이번 포스팅은 다섯 파트로 나누어 연재합니다.


모던 자바의 역습 

1. 프로그래밍 언어 자바

자바가 세상에 나온 지 어느덧 20년의 세월이 흘렀습니다. 지금은 오라클에 합병된 썬마이크로시스템즈의 제임스고슬링(James Gosling), 마이크 셰리던(Mike Sheridan), 패트릭 노튼(Patrick Naughton)에 의해 인터렉티브 텔레비전을 개발하기 위해 개발된 이 언어는 1990년대 중반 이후 시작된 인터넷의 성장과 발전을 주도하고 스마트 디바이스와 클라우드 컴퓨팅이 대세가 된 오늘날에 이르는 20년의 세월 동안 크고 작은 진화를 거쳐오며 건재함을 과시하고 있습니다.
가장 좋은 언어가 무엇이냐는 무엇을 만드는지에 따라 달라질 수 있고 관점에 따라 이론의 여지가 있겠지만 가장 많은 프로그래머를 보유한 언어로 자바를 꼽는 데 주저할 만한 이유는 없다. 자바는 그만큼 오랜 기간 여러 분야에서 널리 사용되어왔고 또 자바 이전에 나왔던 다른 언어들에 비해 배우기 쉬운 언어인 것만은 분명합니다. 하지만 오랜 역사를 가진 언어인 만큼 자바 또한 코딩 스타일에 있어서 단편화가 진행되어온 것도 사실입니다. 20년의 세월을 지내오며 새로이 추가된 것은 문법뿐만이 아니라 프로그래밍의 패러다임 또한 바뀌어왔기 때문입니다.

자바 언어 시스템

자바에 대하여 이야기를 할 때에는 몇 가지 포인트를 분리하여 이야기하지 않으면 안 됩니다. OOP 언어로서의 순수한 프로그래밍 언어 자바와 자바를 동작시키기 위한 환경으로서의 자바 가상 머신(Java Virtual Machine)과 표준 API를 지칭하는 자바 플랫폼, 그리고 마지막으로 자바를 둘러싼 개발 환경과 패키지 관리 시스템 즉, 자바 생태계입니다. 물론 이 모든 것을 다루기엔 지면도 부족할 뿐더러 무엇보다 제 자신의 지식이 많이 부족합니다. 이 기사를 통해 저는 널리 알려져 있고 또 잘 알고 있다고 생각하는 자바지만 의외로 잘 알려지지 않은 진면목과 코딩 스타일을 살펴보고자 합니다. 특히 가장 최근에 발표된 혁명계 버전인 자바 8이 가져올 변화, 이른바 모던 자바로의 능동적 이행에 대한 내용을 중점적으로 살펴봅니다

자바의 버전 업 - 진화계(evolution)와 혁명계(revolution)자바의 버전 업은 크게 두 가지로 구분하는데, 기능적인 부분의 개선이 주를 이루는 버전업을 진화계(evolution)라 하고 언어 자체의 형태에 변화가 오는 버전업을 혁명계(revolution)라 칭한다. 자바 6, 7이 전자에 속하며 제네릭(Generic)과 어노테이션(Annotation)이 포함된 자바 나 이번에 함수형 프로그래밍 패러다임이 포함된 자바 8이 후자에 속한다.

자바의 목표

프로그래밍 언어로서의 자바를 이야기할 때 빼 놓을 수 없는 것이 언어 설계자들이 설정한 목표입니다. 자바의 공식 홈페이지에 소개된 다섯 가지 설계 지향점은 다음과 같습니다.
It must be "simple, object-oriented and familiar".
It must be "robust and secure".
It must be "architecture-neutral and portable".
It must execute with "high performance".
It must be "interpreted, threaded, and dynamic”.

단순하고 객체지향에 대해 친화적이어야 한다.
견고하고 안전해야 한다.
아키텍처에 중립적이며 어디서나 쉽게 동작시킬 수 있어야 한다.
고성능을 추구한다.
인터프리트적이며, 스레드로 동작하고 동적이어야 한다.


하지만 이보다 더 간결하게 자바를 설명하려 한 시도도 있습니다. 바로 "한 번 작성으로 모든 곳에서 동작한다 Write Once, Run Anywhere”라는 문구로 널리 알려진 자바의 철학(또는 마케팅 문구)인데, 일부 API가 기종이나 OS에 따라 동작이 달라지는 경우가 없지는 않지만 대부분의 PC와 서버환경에서 재컴파일 없이도 잘 작동하는 모습을 보여줌으로서 자바의 인기를 견인한 요소로서 꼽지 않을 수 없습니다.
실제로, 자바가 등장하기 전까지 대부분의 서버환경에서 작동하는 애플리케이션은 코딩은 로컬 PC에서 하더라도 컴파일과 배포는 서버에 원격으로 접속하여 실시한 후, 테스트도 원격 환경을 통해서만 진행이 가능했던 것이 일반적인 모습이었지만 자바의 등장 이후는 작업자의 PC에서도 서버에서 수행했던 작업이 가능해지게 된 것 입니다.

자바의 발자취

이야기는 자바가 세상에 처음 모습을 드러낸 1995년으로 거슬러 올라갑니다. 제임스 고슬링의 자바개발팀은 당시 최고 인기 언어이던 C/C++를 바탕에 두고 OOP를 구현하기에 좋은 모습으로 자바를 만들려 했습니다. 새로운 모습으로 시장에 나타나는 언어인 만큼 기존의 언어 사용자를 최대한 끌어 안으려 한 것이죠. 문법적인 부분과는 별도로 자바 개발팀은 여기에 새로운 시도를 합니다. JVM이라는 가상 머신 위에서 동작하는 언어라는 개념이죠. JVM 덕분에 자바는 기존의 컴파일 언어들이 가지지 못했던 메모리 관리 측면에서의 편리성이나 인터프리터 언어와도 닮아 있는 동적 바인딩과 같은 특징을 지니게 되는데, 이러한 특징은 이후 JVM 언어들이 탄생하는 초석이 됩니다. 자바 4(1.4)부터 8까지의 주요 변경 사항은 다음과 같습니다.

  1. J2SE 1.4
    • JAXP API(XML Processing)
    • 보안관련 API 추가
    • 로깅 API
    • IPv6를 포함한 네트워킹 관련 API 추가
    • NIO(Non-Blocking I/O)
    • 정규표현식(java.util.regex)
    • Assertion
  2. J2SE 5
    • 제네릭 프로그래밍
    • 어노테이션 (메타데이터)
    • foreach 루프
    • 타입 안전 열거형(Type-safe Enums)
    • 정적 임포트(Static Import)
    • Concurrent API (java.util.concurrent)
    • 스레드 우선순위 변경
    • StringBuilder class
  3. J2SE 6
    • JAX-WS (Web Services Client)
    • javac에 의한 어노테이션 처리
    • 모니터링 및 관리기능 강화
    • 스크립트 언어 지원
  4. J2SE 7
    • G1 가비지 콜랙터
    • 바이너리 리터럴
    • Strings을 이용한 switch 구문
    • try-with-resource 구문
    • 타입 인터페이스 추론
    • NIO 2.0
    • Fork-Join에 의한 병렬처리
    • JVM의 동적 언어 지원
  5. J2SE 8
    • 함수형 프로그래밍
      • 람다식
      • 함수형 인터페이스
      • 메소드 참조
    • 제네릭 타입 인터페이스 개선
    • java.util.stream의 함수형 조작지원
    • Collections API의 확장
    • Concurrency API의 확장
    • IO/NIO API의 확장
    • 리플렉션과 어노테이션의 변경
    • Nashorn JavaScript엔진

자바의 성공 요인

자바의 성공 요인으로 가장 크게 꼽히는 것은 기존 프로그래머는 물론 새로운 개발자도 쉽게 배울 수 있는 간결한 문법을 꼽을 수 있습니다. 예를 들어 포인터를 보이지 않게 래핑해 더 쉽게 문법을 배울 수 있었습니다. 여기에 잘 정비된 표준 API를 제공하여 구현해야 할 코드양을 크게 줄일 수 있다는 점 또한 큰 매력으로 작용했습니다. 마지막으로 오늘날 현실 세계의 추상적 구현에 가장 적합한 모델이라 불리우는 객체지향 언어로서의 특징을 꼽을 수 있습니다. 자바는 상속과 구현, 인터페이스와 같은 객체지향 언어의 특징을 처음부터 가지고 있었지만 한편으로는 구조적 프로그래밍 방식으로 구현할 수 있었기에 등장 당시 가장 인기있었던 C 언어의 사용자도 빠르게 흡수할 수 있었습니다.

구조적 프로그래밍의 잔재와 도메인 주도 개발

자바가 처음 등장했던 시기에는 객체지향 프로그래밍의 패러다임이 그리 널리 퍼져있지 않았습니다. C++이 있기는 했지만 C++는 C 언어 사용자를 끌어 안기 위해 구조적 프로그래밍과 객체지향 프로그래밍이 모두 가능했기 때문에 대부분의 개발자들은 이전 20여 년간 프로그램 세계를 지배했었던 구조적 프로그래밍의 패러다임 위에서 프로그래밍을 해오고 있습니다. 이는 자바의 경우도 사정이 비슷해, 언어가 세상에 나온 지 20년이 되어가는 오늘날에도 곳곳에서 구조적 프로그래밍의 잔재를 확인할 수 있습니다. 예를 들면 상수 클래스를 따로 만든다든지 OOOManager와 같은 처리용 클래스를 별도로 두는 것 말입니다. 에릭 에반스가 주창한 도메인 주도 개발(DomainDrivenDedign)은 순수 객체지향 패러다임으로 소프트웨어를 구현하는 데 유용한 원칙과 패턴의 조합으로, 복잡한 현실 세계를 객체지향적 사고의 틀 안에서 더 잘 구현할 수 있게 해줍니다.

자바의 성공에 있어서 오픈소스의 역할

초창기 여러 언어들의 틈바구니 속에서 자바를 원톱의 자리로 끌어올린 것은 무엇보다도 오픈소스 커뮤니티의 전폭적인 지원을 꼽을 수 있습니다. 초창기부터 자바는 만들어진 API를 편리하게 재사용할 수 있도록 Javadoc이라는 문서화 플랫폼을 제공했고, 언어 사양을 정하는 데 외부 개발자의 의견이 충분히 반영되도록 자바 커뮤니티 프로세스를 1998년부터 운영하여 오픈소스 진영에 각별한 배려를 했습니다.
실제로 오늘의 자바를 있게 한 일등 공신으로 손꼽히는 서블릿 컨테이너 톰캣으로 대표 되는 아파치의 각종 프로젝트들과, 자바의 표준 개발 툴로 자리잡은 이클립스, 스트럿츠에서 스프링으로 이어진 애플리케이션 프레임워크에 이르기까지 거의 대부분이 오픈소스 입니다.

쇠퇴의 징조?

이렇게 20년 가까이 절정의 인기를 구가하던 자바지만 2000년 대 초반 정점을 찍은 이후 그 위세가 점차 수그러들고 있는 것이 사실이기도 합니다.

위의 그래프는 2015년 6월 시점에 작성된 tiobe.com의 프로그래밍 언어 인기도 그래프입니다. 2002년 25%를 넘어서던 인기도가 꾸준히 떨어져 2015년에 들어와서는 1위의 자리를 놓고 C 언어와 근소한 차이로 경쟁하고 있습니다.

왜 이렇게 자바의 인기가 줄어 들어가는 것 일까요? 필자는 다음과 같은 세 가지를 자바 인기의 하락 원인으로 꼽습니다.

첫째, 스마트폰이나 타블릿PC, 웨어러블의 등장으로 다양해진 플랫폼과 그에 따라 다양한 언어의 등장을 들 수 있습니다. 소프트웨어 시장 전체가 커지고 있다 보니 더 많은 언어가 각각의 영역에 자리를 잡게 된 것이죠. 그러니까 전체 소프트웨어 생태계가 자바의 독점을 허용하지 않을 정도로 커졌을 뿐이지 단순 점유율의 비교로 자바가 쇠퇴하고 있다고 보기엔 어렵습니다.

둘째, 같은 기간 뚜렷한 성장세를 기록한 C#이나 파이썬과 같은 경쟁 언어들에 비해 다소 더딘 프로그래밍 패러다임의 도입과 행사코드를 줄이기 위한 언어 문법적 개선 속도를 꼽을 수 있습니다. 아무래도 가장 많이 쓰이는 언어이다보니 그만큼 이해 관계자도 많을 수밖에 없고 투표를 통해 언어 사양을 정해나가는 Java Community Process의 특성상 변화를 수용하는 속도가 떨어질 수밖에 없을 듯합니다.

마지막으로 JVM 언어의 약진입니다. JVM 언어란 자바는 아니지만 자바처럼 바이트코드로 컴파일이 가능하여 JVM위에서 동작이 가능한 언어로, 대표적인 언어로서 함수형 언어인 스칼라, 스크립트 언어 루비의 장점을 받아들여 만든 그루비,  애플 Swift의 원형이라 할 수 있는 코틀린이 있습니다. 이러한 JVM 언어들은 자바와 API 레벨에서의 호환성을 지니면서도 함수형 프로그래밍 패러다임이나 스크립트 언어의 간결함을 갖추고 있어 자바가 쌓아놓은 거대한 언어 생태계 안에서 빠르게 자신만의 영역을 구축해나가고 있습니다. 하지만 이러한 JVM 언어들은 단일 프로그램을 자바와 혼용하여 작성할 수도 있다는 점에서 자바의 경쟁자라기 보다는 자바의 단점을 보완해주는 협력자에 가깝습니다.

JVM 언어의 역사

행사코드란?뉴욕의 프로그래머로 유명한 임백준 님의 <“폴리글랏 프로그래밍 : 새로운 자바 언어를 기다리는 히치하이커를 위한 안내서>에서 ceremony code를 번역한 개념으로 프로그램의 실행과 직접적으로는 관계가 없는 프로그래밍 문법적 서식을 말합니다. 이러한 행사코드는 코드의 생산성과 품질에 큰 영향을 미치는 것으로 알려져 있으며 모던 언어들의 공통적인 발전 방향은 이러한 행사코드를 최대한 제거해나가는 데 있다고 할 수 있습니다.


모던자바의 역습

  1. 프로그래밍 언어 자바
  2. 자바를 둘러싼 진실 혹은 거짓말
  3. 자바 코딩 스타일 변천사
  4. 모던 자바의 등장 - Java8
  5. 섹시한 자바 개발자로 거듭나기


2015년 7월 14일 화요일

구글만의 특별함 - GCE의 라이브마이그레이션의 대단함에 대하여

많은 클라우드 서비스 프로바이더들이 제공하고 있어서 거기서 거기인듯한 IssA형 클라우드지만 구글에서 제공하고 있는 Google Compute Engine(이하 GCE)에는 VM의 리부트 없이도 각종 업데이트의 적용이 가능한 라이브마이그레이션 이라는 특별한 기능이 있다.
국내에는 잘 알려져 있지 않은 이 라이브마이그레이션 기능에 대해 Qiita에 상세히 소개하는 기사가 올라왔기에 번역하여 소개해 보고자 한다. 번역을 흔쾌히 허락해 주신 사토 카즈노리씨에게 감사의 말씀을 전한다.

GCE의 라이브마이그레이션의 대단함에 대하여

Google Cloud Platform(GCP)의 영어 블로그에 GCE의 라이브마이그레이션 기능에 대한 해설 기사가 포스팅 되었다. 개인적으로도 몇건의 대규모 프로젝트에서 이 기능의 능력에 감동하여, 과연 구글은 구글이구나 라고 생각 하였고, GCP팀에서 실제 만든 사람들과 만나 보니 열정적으로 설명해 주였다. 해서, 위에 소개한 블로그기사 + 개인의 경험을 바탕으로 간단히 정리해 보고자 한다.
그럼, 지금부터의 내용은 개인으로서의 감상 입니다!
역자주 : 이 글의 필자인 사토 카즈노리씨는 일본 구글 클라우드 플랫폼 부문에서 Developer Advocate(테크놀러지 에반젤리스트)로 재직중이다.

Heartbleed버그 당시에도 VM재기동은 없었다

GCE에서는 2013년12월부터 라이브마이그레이션을 이용한 Transparent Maintenance (자동 메인터넌스)라고하는 운영을 개발하고 있다. 이것은 말하자면 VM을 멈추지 않고 동일한 존내의 다른 물리서버로 이동시켜주는 기술이다. 메인터넌스를 위해서 “VM이 정지하므로 재시동해 주세요”라는 메일을 더 이상 받지 않아도 되게 해 주는 기술인 것이다.
실제로 2014년 4월에 일어났던 Heartbleed버그때에도, 타사의 클라우드처럼 호스트OS의 패치를 적용시키기 위해 전VM을 재기동하는 사태는 GCE에서는 전혀 일어나지 않았고, VM리부트가 제로까지는 아니지만, 하드웨어 갱신이나 패치적용과 같은 메인터넌스 목적의 계획적 리부팅은 크게 줄었다.

구글의 데이터센터는 끊임 없이 메인터넌스 된다

구글에게 있어서, GCE를 정식서비스로서 공개할것인지 말것인지는 이 라이브마이그레이션 기능을 실현에 걸려 있었다고 말해진다. 왜냐하면 구글의 데이터센터는 언제나 하드웨어나 호스트OS의 메인터넌스가 벌어지고 있었기 때문이다. 예를들면,
  • 서버, 네트워크,전원설비등의 갱신
  • 호스트OS이미지, BIOS, 호스트의 시스템구성등의 변화
  • 긴급 세큐리티 패치의 적용
등의 작업이다. 구글의 다양한 서비스는, 이렇게 빈번한 메인터넌스에도 견딜 수 있는 페일오버/다중화 설계가 되어져 있다. GCE에 있어서도, 라이브마이그레이션이 구현된것으로, 다른 구글서비스와 마찬가지로 항시 최신 인프라위에서 VM을 운용하는것이 가능하게 되었다.
여기에 구글최신의 SDN인프라인 Andromeda덕에 GCE인스턴스간 3Gbps통신과 같은 메리트도 덤으로 얻을 수 있다.

고장의 사전감지시에도 마이그레이션

라이브마이그레이션은 계획적 메인터넌스뿐이 아니라, 하드웨어고장이나 소프트웨어 결함을 사전에 감지한 경우에도 사용된다. 구체적으로는,
  • 네트워크카드의 상태가 좋지 않아 에러 발생율이 올라갔다
  • 베터리나 전원이 가열되어 서버 온도가 상승했다
  • 호스트OS의 결함이 발견되었다
  • 메모리 소비가 비정상적으로 늘었다
와 같은 고장의 징후를 검출하여, 다운이 일어나가 전에 예방적으로 VM을 다른 서버로 이동시킨다. 마이그레이션후에는 GCE의 시스템로그에 타임스템프가 기록된다. 단, 유저측으로부터 명시적으로 마이그레이션을 기동하는것은 불가능하다.

동작중인 VM을 0.5초만에 이동, 패킷로스 제로

여기까지의 설명을 읽고, 다음과같은 의문을 가진 사람이 많을것이다:
  • 타사VM의 라이브마이그레이션과 같이 몇초정도는 멈추지 않을까?
  • 움직이는 VM을 다른 서버에 이동하게되면, 서비스가 멈춘다던지 네트워크가 끊기지는 않을런지?
이것은 나에게 있어서 큰 문제로, 솔직히, 나온지 얼마 되지 않았던 당시에는 반신반의 했었다. “걱정이 되어서 라이브마이그레이션을 끄고싶다”라는 의견도 당연하다(GCE에서는 라이브마이그레이션을 끄는것이 가능하다).
정말로? 라고 생각할지도 모르지만, 실제로 GCE에서 움직이는 엄청난수의 VM에 대하여 수많은 마이그레이션이 실시되었고, 문제 없이 운영되고 있다. Rightscale이 실시한 대규모 로드테스트에서도
로그파일이나 DB내부를 전부 살펴보아도 아무런 이상이 별견되지 않는다.
만약 구글이 마이그레이션을 실시하였다고 알려주지 않았다면 눈치챌 수 없었을것이다.
라고 평가하고 있다.

출처: Rightscale
실제 나 자신이 참가했었던 국내 적용사례에서도, GCE상에서 가동중인 DB클러스터에 대해서 국내 최고 수준의 실 트레픽을 퍼부으면서 마이그레이션을 진행하는 로드테스트를 실시해, DB에러나 접속끊김과 같은 장애는 일체 발생하지 않았다. 관측된것은 극히 일부분의 레플리케이션 지연 뿐이였다. 뭐 이런 기술이 다 있나… 라는 생각이 들 정도였다.

마이그레이션의 메커니즘

그럼, 이 마이그레이션은 어떠한 구조로 실현되고 있는것일까?
마이그레이션 시작 60초 전이 되면, VM상의 게스트OS에 대하여 마이그레이션 개시가 사전에 통지된다. 그 다음엔, 이동할 대상의 새로운 VM이 준비되고, 다음과 같은 3단계의 마이그레이션이 개시된다.
  • 브라운아웃기간 : 새로운 VM이 기동된 상태로, 메모리상의 데이터등 VM의 내용을 새VM에 카피한다
  • 블랙아웃기간 : 구VM의 모든 동작을 일순간만 정지시켜, 브라운아웃 대기중에 받은 네트웍 패킷을 새로운 VM에 전송한다
  • 마이그레이션후의 브라운아웃기간 : 구VM은 이후에도 남겨, 블랙아웃 기간중에 받은 네트웍 패킷을 새로운 VM에 전송한다
먼저 언급한대로, 여기서 말하는 블랙아웃 기간은 나의 경험상 보통 0.5초 정도면 끝난다. 그 기간에 도착한 네트웍 패킷은 모두 새로운VM으로 도착하기 때문에 TCP연결도 문제 없이 유지되는 구조이다.

GCE는 여러모로 놀라워

이 GCE의 라이브마이그레이션은 타사의 크라우드서비스의 유저에게 있어서는 상당히 매력적인 기능의 하나로, 설명할 수록 놀라게 된다. 이것에의해 GCE가 정지하는 가능성이 제로가 되는것은 아니지만, 유저에게 있어 클라우드의 편리함이 하나 더 늘었다고 말할 수 있을것이다.
초당1만건의 리퀘스트를 손쉽게 처리해내는 GCE의 로드벨런서를 시작으로, 이번에 소개한 라이브마이그레이션등, 슬슬 “구글다운 클라우드”의 특색을 드러낸 GCE. 연내에는 또 하나, 이것 또한 과연 구글이다 라는 생각이 든 서비스가 나온다 하니 기대해 주었으면 한다.
이 기사는 개인적인 글 입니다. 여기서 언급한 것은 사적인 의견에 근거한 것이며 회사와는 관계가 없음을 밝혀둡니다.