System Compleat.

Netduino, the great toy for .NET developers

Techs

( younjin.jeong@gmail.com, 정윤진 ) 


블로그에 Beagle Bone 을 소개하고 아는 사람은 다 아는 Arduino 를 포스팅 한 지도 벌써 몇 개월이 흘렀다. Beagle Bone 두세트와 7" LCD, 그리고 Beagle board C4 가 프로젝트에 밀려 사무실 구석에서 홀대를 받고 있다. 조만간 이뻐해 줘야 하는데... 


프로젝트와 관련하여 이것 저것 찾아보다가 문득 다음의 제품을 발견 했다. 

http://artrobot.co.kr/front/php/product.php?product_no=545&main_cate_no=4&display_group=1


오호라~ 하면서 조금 더 찾아 보니

http://netduino.com/


이를테면 닷넷 프로그래머가 아두이노를 쓸 수 있도록 만든 보드가 된다. 


아두이노를 아는 사람이라면 모두 알겠지만, 닷넷 키워드 검색을 통해 이 블로그가 얻어 걸린 분들에게는 다소 생소 할 수도 있는 이 장치의 사용에 대해 말해 보자면, 


1. 각종 이런 저런 일을 하는 무지하게 많은 종류의 센서 ( 입력 ) 

2. .NET Micro framework 를 사용하여 신나게 C# 으로 뭔가 로직 코딩 

3. 코딩의 결과를 다시 이런 저런 일을 하는 무지하게 많은 종류의 액츄에이터나 모터와 연결 ( 출력 )



간단한 장난감으로는 


1. 무인 RC 자동차, 헬리콥터, 비행기 

2. 마이크로 마우스 

3. 짝퉁 달 탐사 로봇 


을 만들 수 있다. 



맨날 LED 사다가 깜빡이 만들어 보고 아 지겹다 해서 접지 말고, 재미를 붙였다면 


http://artrobot.co.kr/front/php/product.php?product_no=522&main_cate_no=4&display_group=1

이런 비슷한 프로젝트를 달려도 얻는게 많을 듯. 


아니면, 

http://artrobot.co.kr/front/php/product.php?product_no=41&main_cate_no=48&display_group=1

http://artrobot.co.kr/front/php/product.php?product_no=578&main_cate_no=48&display_group=1


Arduino + Android 조합도 꽤 많이 있으므로, Netduino 도로 충분히 가능 할 듯. 


나는 닷넷 개발자는 아니지만 C 가 아닌 다른 언어의 개발자가 이런 재미진 임베디드를 할 수 있다는 사실은 즐거운 일이지 않은가. 



어릴때 딱딱한 성적표 만들기 이런 거로 프로그래밍 하다가 질린적이 한두번이 아닌데, 이런 장난감이 그 시절 있었다면 지금쯤 난 아마도 우주선을 만들고 있지 않을까. 여러모로 좋은 시절인 것 같다. 







이건 FPV ( First Person View ) 영상.  영상을 보면 알겠지만, 기존의 RC 처럼 날리는 것이 아니라, 안경과 같은 고글에 나오는 실시간 비디오 이미지를 보고 ArduCopter 를 날리는 모습이다. 



이런 개인 시점화 된 FPV 를 날리는 것이 가능한 것은, 바로 이 장비로 가능한 것. 



Fat Shark RCV922 Aviator Edition Full FPV KIT- 2010


조종사의 느낌으로 비행이 가능 하도록 지원 해 주는 것. 당연히 FPV 에는 카메라 장치와, 이미지 전송을 위한 장치가 필요하다. 관심이 있다면 여기서 원큐에 구매하는 것도 가능. 구글링 해 보면 판매 하는 사이트가 더 많은 것 같기도. 


http://fpvsystems.com/index.php?main_page=product_info&cPath=5&products_id=5



최근 여러가지 방송에서는 RC 에 카메라를 붙여서 영상 이미지를 얻는데 사용하는 경우가 많아지고 있다. 하지만 이렇게 얻어진 영상의 경우 대체적으로 RC 가 만들어 내는 미세한 진동 때문에 보기 불편한 경우가 있는데, 이럴때는 자이로를 이용한 Stabilizer 를 사용한 마운트로 카메라를 고정 시키는 방법도 있다. 아무튼, 여기에 5D Mark II 를 붙이면 어떻게 될까 






여기서 이제 카메라를 조금 더 오버 스펙으로 가 보자면, 

http://www.alibaba.com/product-gs/524756128/UAV_electro_optics_search_system.html


이런걸 붙이게 된다는.... 


하지만 저만한 하중을 견디려면 더 큰 사이즈의 비행체가 필요하게 된다. 이제 단순 방송 장비의 규모를 벗어나게 되면, 


1. 조종 시스템과 관찰 시스템의 분리 

2. 킬로미터 단위의 low latency radio control 

3. 킬로미터 단위로 비행 해야 할 만큼의 Long range flight 


뭐 대충 이런 요구 조건을 충족하다 보면 군사용 UAV 가 된다. 이를 테면, 

http://www.fas.org/spp/military/docops/defense/actd_mp/MAE.htm



image from: http://www.dfrc.nasa.gov/Gallery/Photo/Altair_PredatorB/HTML/ED06-0208-1.html 



해성이가 발사나무로 RC 비행기 잘 만드는데, 재미로라도 UAV 만들어 보고 싶다. 뭐 언제나 그렇지만 돈이 문제지 +ㅁ+ 

netduino 설명인데 덧이 너무 많이 붙어 버렸네. 


뭔가 날라다니는건 언제나 추락 할 위험이 있다. 그런게 싫다면, 이런거도 좋지 않을까. 



image from: http://en.wikipedia.org/wiki/File:NASA_Mars_Rover.jpg


뻘글이 넘 길어졌다. 암튼 일단 질러야 할듯. 


( younjin.jeong@gmail.com, 정윤진 ) 



Silicon Valley 에 대한 감상..

Techs

( younjin.jeong@gmail.com , 정윤진 ) 


요 몇년 새에 참 많은 업체와 사람들, 그리고 솔루션을 만났더랬다. 물론 아주 좋은 업체도 있었고, 당시에는 좋은 것 같았는데 지나고 보니 안그랬던 것 같은 업체도 많았던 듯. 한가지 강하게 느끼는 것은, 내가 뭔가를 생각해서 검색해 보면 항상 누군가는 이미 만들어 놓고 입을 벌리고 있다는 사실이다. 세상은 그렇게 부지런하기만 한데, 대체 나는 무엇을 하고 있나. 


작년에는 Cloud.com 이 Citrix 에 인수 되더니, 올해는 Nicira 가 VMware 에 인수 되어 버렸다. 게다가 Nicira 의 인수 금액은 1.5 billion 에 달하는 엄청난 돈이어서, Network virtualization 이 가지고 있는 어마어마한 가능성을 보여주지 않았나 싶다. 수형형이 언제나 이야기 했던 대로, 비슷한거 했던데는 많지만 제대로 하는데가 없었는데. 작년 KT 에서 테스트 해 보고자 했을 때만 해도 그다지 좋은 분위기의 업체라고는 생각하지 못했는데, 이렇게 떼돈 버는거 보니 참 인생 한순간이구나 싶은 생각이 들기도. 


http://www.enterprisenetworkingplanet.com/netsysm/vmware.html

http://nicira.com/


오늘 이순간에도 내가 알고 있는 회사들 중의 한군데는 내일 모레 몇천억에 팔릴지도 모른다는 생각을 하게 된다. 누구나 말할 수 있는, 남들과 엇비슷한거 만들어 봐야 어쩌구 하는 이야기 따위, 같이 메일 주고 받고 갈구던 애가 어느날 백만장자가 되어 "잘 지내냐" 하고 물어오는 걸 들어 보지 않으면 모를 일이다. 


Processing / Storage / Connectivity 3개 기본 요소 중 2개는 결판이 났네. 이제 다음은 어딘가에서 하고 있는 Elastic Storage 인가.. 아니면 어거지로 Elastic Security 하나 끼위 넣어야 하나. 


Nicira 의 소식에는 박수를!  잘하고 선두면 좋은 가격에 인수 되야 하는것이 인지상정.



투자 할 돈 따위 없으니 뭐라도 만들어야지... 

뭐라도 되겠지 하고 살다가 위궤양 걸리겠다. 


( younjin.jeong@gmail.com, 정윤진 ) 

Node.js dev on Cloud9 + Heroku

Techs

( younjin.jeong@gmail.com, 정윤진 ) 


최근에는 클라우드를 사용한 온라인 개발 도구가 늘어나고 있다. 이미 좀 오래 되었지만 github 라던가, Cloud9IDE, 그리고 최근 firejune 에 의해 커스터마이즈된 JSbin 과 같은 도구들은 클라우드의 기능성과 더불어 언제 어디서나 개발이 가능한 환경을 만들어 주고 있다. 


국내 클라우드 업체들에서는 모두 아마존 꽁무니 쫒아 가느라 가랑이가 찢어지는 사이에, 이러한 도구들은 개발자들에게 가뭄의 단비와 같은 솔루션이 되고 있지 않나 싶다. 기실 조금만 생각 해 보면 서비스로서의 가치가 충분한데도, 아마존은 쫒아가려 하면서 구글은 쫒지 않는, 즉 바꿔 말하면 호스팅 서비스 그 이상의 무엇이 없지 않나 생각 해 볼 일이다. 


호스팅 서비스 역시 지난날의 웹 콘솔을 통한 관리를 넘어, 이제 oAuth 나 OpenID 등을 통한 인증, 그리고 이 인증을 바탕으로 한 API 의 지원이 필수적인 요소가 되어가고 있다. 클라우드로 만드는 서비스를 이제 서비스 업체의 웹 브라우저 콘솔만으로 제어하는 것은 이제 바가지에 밥떠먹는 것과 같은 시대가 되어 버렸다. 


오늘 소개할  Heroku, 그리고 Joyent 와 같은 클라우드 기반 호스팅은 사용자가 서버를 설정 할 필요 없이, 제공되는 클라이언트 도구 또는 다른 서비스와의 연동을 통해 온라인으로 언제 어디에서나 코드를 작성하고, 이를 배포하여 서비스 동작 여부의 확인이 가능하다. 따라서, 기존 node.js 또는 기타 여러가지의 서비스를 온라인에서 사용하려는 경우, 서버를 설치하고, 코드 저장소를 설정하는 등의 노력 없이 그저 서비스에 로그인하고, 사용하다가 일정 수준 이상의 사용량이 되면 금액을 지불하면 된다. 


사실 개발자에게 개발이 가능한 전체 환경의 설정은 매우 피곤한 일이 아닐 수 없다. 물론 내가 개발자는 아니지만, 대다수의 많은 개발자 분들이 환경 설정하는데 꽤 애를 먹으며, 이게 코드가 문제인지 인프라가 문제인지 알쏭달쏭한 경우에 빠지는 경우도 많다고 생각한다. 이러한 난제를 해결하는데 클라우드만큼 좋은게 없으며, 사용자 또는 개발자는 그저 서비스 신청, 개발환경 접근, 배포의 과정을 아주 쉽게 처리 할 수 있어 개발에만 전념 할 수 있도록 도와준다. 


오늘 소개할 조합은 바로 온라인 개발도구 Cloud9IDE ( http://c9.io ) 와 일종의 PaaS 서비스 Heroku ( http://www.heroku.com )  이다. 일단 사용량이 많지 않은 경우에는 무료로 사용 할 수 있으며, 처음 가입시 별도의 카드 정보와 같은 결재 정보도 필요 없다. 환경을 설정 해 보고, 코드를 개발 하면서 개발 된 코드가 정상적으로 동작 하는지 확인 하는데 사용하면 좋을 것 같다는 생각에 포스팅 해 본다. 물론, 이미 알고 계신 분들도 많겠지만. 


먼저, Heroku 에 가입한다. 가입 절차는 매우 간단하며, 메일 주소와 비밀번호 정도만 입력 하면 된다. 홈페이지에 접근하면 한 가운데 떵그머니 있는 Sign Up 버튼을 이용하자. 가입이 완료되면 로컬 머신에서의 환경 설정이 나타나는데, 이건 필요하면 하고 Cloud9 의 서비스와 연동할 거라면 굳이 하지 않아도 된다. 개발자에게는 골치 아픈 일일 뿐이다. 


가입을 완료 했으면 일단 두고, 이제 Cloud9IDE 에 가입하자. 역시 동일하게 계정을 생성하고, 로그인 후에 대시보드를 통해 프로젝트를 생성해 본다. 프로젝트를 생성했으면 "Start Edit" 을 살포시 눌러 실제 코드의 작성이 가능한 브라우저로 이동한다. 


이제, 아래와 같은 화면을 볼 수 있다. 



Cloud9IDE Project Page


화면 구성을 보면 일반적인 IDE 환경과 크게 다르지 않다. 가장 왼쪽에는 파일 브라우저, 배포, 설정, 테스트 등의 기능의 선택이 가능하고, 나머지는 온라인 코드를 수정하기 위한 공간이다. 새로운 파일은 왼쪽 상단의 파일 메뉴에서 생성이 가능하며, 원하는 경우 각종 코드 템플릿을 선택하여 사용 할 수도 있다. 생성된 코드는 일반적인 에디터의 저장 단축키와 같은 Cntl+s, 맥에서는 command+s 로도 잘 동작한다. 


여기까지는 일반 개발환경의 설정이며, 이제 Heroku 서비스로의 연결이 가능하다. 먼저, 왼쪽 기구 모양의 Deploy 버튼을 누른다. 

파일 브라우저의 모양이 바뀌면서, 상단에 -, + 버튼이 생긴다. 여기에서 + 버튼을 눌러 보면 다음과 같은 화면을 볼 수 있다. 



C9IDE, Select deploy site


위의 버튼을 눌러보면, Cloud9 이 지원하는 클라우드 기반 서비스를 확인 할 수 있다. 다른것은 모르겠는데, Windows Azure 를 지원한다. 이는 곧, 기존의 닷넷 개발자 분들도 git, Azure 에 대한 가벼운 이해만 있다면 C# 코딩을 그대로 하실 수 있다는 말이 되겠다. 아직 안해봐서 나는 모르겠지만, 아무튼 지금의 목적은 Heroku 로의 연결이므로, heroku 를 선택하고 아까 만들었던 Heroku 의 계정을 입력한다. 그리고 오른편의 Create New 버튼을 누르면, heroku 로 부터 코드 배포에 사용할 인스턴스를 만들 수 있다. 원하는 이름을 주고 하나 만들어 두자. 


생성을 완료하고 페이지에서 나오면, 이제 Deploy 탭에 Heroku 에서 생성한 인스턴스의 이름이 나타나는 것을 볼 수 있다. 이 인스턴스 이름을 클릭하면, 배포가 가능하다. 하지만 아직 배포할 코드가 아무것도 없으므로, 하나 작성해 보도록 하자. 



코드를 작성하기 전에, 다음과 같은 주요 내용을 이해해야 한다. 


1. Heroku 는 git 를 사용하여 동작한다. 코드를 생성하고, git push heroku master 와 같은 방법으로 동작하지만, Cloud9 에서는 그런 별도의 과정 없이 Cloud9 의 로컬 저장소에 commit 한 후에 인스턴스에 Deploy 하면 쉽게 적용 된다. 


2. Heroku 에서 Node.js 를 동작하기 위해서는 필요한 패키지, 실행 할 인스턴스의 수량 또는 종류 등을 지정해야 한다. 이는 Heroku 의 문서에 잘 나와 있으므로 여기를 참조 하도록 한다. 

https://devcenter.heroku.com/articles/nodejs


3. 기본적으로 Node.js 의 동작에 대해 이해하고 있어야 Heroku 를 손쉽게 사용 할 수 있다. 



Cloud9IDE 의 왼족 상단의 Project Files 를 클릭하고, 신규 파일을 다음과 같이 저장하자. 


파일: .gitignore 

 node_modules 



package.json

{
    "name": "node-example",
    "version": "0.0.1",
    "engines": {
        "node": "0.6.15",
        "npm": "1.1.9"
    },
    "dependencies": {
        "express": "2.5.9"
    }
}


Procfile

 web: node web.js


web.js

var express = require("express");

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
    response.send('Hello Firejune!');
});

var port = process.env.PORT || 3000;
app.listen(port, function() {
    console.log("Listening on " + port); 
});


대충 보면 감이 잡힐지도 모르겠다. 

.gitignore 는 git 로 작업할때 무시할 디렉토리이다. 여기에 node_modules 가 지정된 것은 node_modules 디렉토리를 heroku 에 업로드 하지 않아도 되기 때문이다. 업로드 하지 않아도 되는 이유는 바로 package.json 에서 필요한 패키지를 명시하였기 때문이며, 여기에 필요한 패키지 리스트를 잘 지정하였다면 별 문제 없다. 물론 여기서 애플리케이션 동작에 필요한 각종 모듈 및 node, npm 의 버전 명시가 가능하다. 사용 가능한 버전은 Heroku 페이지를 통해 공개되고 있으니 구글링을 통해 참고 하면 된다. 사용 방법은 위에 명시된 것과 같다.  Procfile 은 Heroku 에서 구동할 애플리케이션의 용도와 파일을 지정한다. 마지막으로 web.js 는 실제 node.js 를 사용하여 작성한 코드가 된다. 


Cloud9IDE 의 아랫쪽을 보면, console 이 있다. 이는 각종 커맨드의 사용을 위해 존재하는데, 여기서 우리는 npm 으로 필요한 모듈의 설치가 가능하다. 위의 예제는 heroku 로 부터 제공된 것으로서, express 모듈을 사용하고 있다. 따라서 이 콘솔에 다음과 같이 입력한다. 


npm install express@2.9.5 


이후 설치 메세지가 나타나는 것을 확인 할 수 있으며, 만약 현재 Cloud9IDE 의 버전과 맞지 않는다면 npm info 등을 통해 적절한 버전으로 변경 해 주면 된다. 


이제, 작성한 코드가 잘 동작하는지 확인 할 필요가 있다. Cloud9IDE 의 아랫편에 보면 Console 이 있는데, 여기에 커맨드를 입력하여 원하는 작업을 할 수 있다. 다른건 됬고, git 관련 커맨드만 넣도록 한다. 


git init
git add .
git commit -m "First commit for Heroku"


모두 다 실행이 완료 되었다면, 다시 제일 왼편의 Deploy 를 클릭한다. 생성된 애플리케이션 인스턴스를 클릭하면 Deploy 버튼이 나타난다. 클릭하자. 


자, 그러면 이제 Cloud9IDE 의 로컬 repo 에서 Heroku 로 코드가 업로드 되고, 이후 애플리케이션이 준비되는 과정을 로그로 볼 수 있다. 정상적으로 잘 수행하였다면, 다음과 같은 화면을 볼 수 있을 것이다. 





제일 아래 나타난 링크를 클릭하면, 배포된 애플리케이션이 동작 하는지 아닌지를 잘 알 수 있다. 


만약 기존에 개발한 애플리케이션이 다른 버전의 node 와 npm 을 사용한다면, 아래의 링크를 통해 현재 Heroku 에서 지원하는 버전의 지정이 가능하다. 



node.js version manifest


npm version manifest



아마 클라우드라는 환경을 가장 생산적으로 사용이 가능한 사용자군은 개발자들일 것이다. 적절한 방법과 사용성만 있다면, 아이폰의 앱 결재 하듯 한달에 1~2 만원 지불하면서 본인의 자가 발전을 위해 사용해도 아깝지 않을 정도이다. 다만 Cloud9IDE 가 현재 국내에 서버가 없으므로 망의 영향을 받을 가능성이 충분하긴 하지만. 


이런 서비스를 만들어 내는것은 아무것도 아니다 라고 말하기는 좀 그렇지만, 그렇다고 엄청나게 어려운 것은 아니다. 원하는 기능을 적절히 믹스하고, 한번에 잘 동작하게 만든다면 쓸데없이 VM 생성해 두고 뭐할까 고민하는 일은 없을 것이다. 


국내의 각종 클라우드 서비스들도 미국에 비해 일반인의 클라우드에 대한 인식이 현저히 떨어지는 한국에서 매출이 안나온다고 고민하고 있을게 아니라, 위와 같은 서비스의 런칭이 필요하지 않나 생각 해 본다. 


아무튼 준호형과 관련된 재미진 프로젝트를 해 보면 어떨까 한다. 이와 비슷한, 그러나 뭔가 다른. 


( younjin.jeong@gmail.com, 정윤진 ) 

Things about Openstack Swift implementation

Techs

( younjin.jeong@gmail.com, Younjin Jeong )


This is first time that writing blog post in English. There might be some wrong senses, so please read this post in favor. 


The Swift, from Openstack project, is one of the simplest storage cluster in the world. Like any other cloud solutions in nowadays, it's quite young project, and tries to follow Amazon service, which is called as "S3". The project is supported by vendors who wants to take lead in cloud market. It has a quite simple architecture to understand, easy to install and use. There's tons of blog posts about its benefits that you can find on internet, so I'll not explain those things on this. 


What I want to mention about Swift is, it looks easy to build up, but it isn't for enterprise service in my personal opinion. I've been worked for this storage cloud from early of last year for KT, and some other companies in Korea. Actually, the Swift system for KT is built by Cloudscaling, and I've been worked for it's hardware issue support first. After then, I wrote some automation codes for it with chef, and it's working on some services. So, I think I can speak something about its infrastructure, and it may helps your concern about how to build Swift infrastructure. 


In perspective of infrastructure, it has to be scaled-out as maximum as it can. That means, the network has to be designed for it. Not only for the network, we have to consider about commodity also. More important fact is, scale-out does not mean high performance every time. Here's the key factors to consider when we build Swift cluster. 


a. Low SSL performance of Swift proxy. 

b. Network design - Management, Service, and Storage. 

c. Number of disks per processor.  

d. Spec of each nodes. Network, CPU, memory, network. 

e. How to balance the load. 

f. Number of zone ( it's different with compute cluster ) 

g. Account, Container service load. 

f. Automation 

...and more and more.. 


To be honest, it's not easy  to archive all of those things yet. because there's many things are not proved yet. And those factors cloud be differentiated by service use cases. In other words, most factors shown are depends on type of services, because the most basic performance is based on disk I/O. So, if we are building this Swift cluster for A service, not for public such like Amazon's S3, then we can aim it's best performance architecture by type of service. I might can say, it can be adjusted by number of disks per processor. If the service is used for larger objects, then we can put more disks per processor. If not, then we can reduce the number of disks per processor, and can see how it effects to the performance. One another way to improve disk performance in Swift is, using Raid controller which has Cache memory for write back and BBU for maintain cache information. Basically, Swift recommends to do not use Raided volumes, so you might have some curiosity for this mention. The way to implement this, make every single disk as Raid 0, and creates volumes on it. So, if you have 12 disks on storage node, then you have to build each one as Raid 0, then you'll have 12 Raid 0 volumes which is not stripped. The reason why using this is, to use "write back" function. If we use this way, then a storage node will writes to the Cache memory of Raid controller, instead of actual disk ( or buffer on disk ). This will gives many performance effect for disk I/O. But remember this, put Raid controller to every single node will make higher costs. Here's some good article for this kind of issue, but it's based on S3. http://improve.dk/archive/2011/11/07/pushing-the-limits-of-amazon-s3-upload-performance.aspx    


Not only for the number of disk per node, the network is great pain point when we build this. Currently, most cloud services are using MLAG for non-blocking network. Well, it cloud be ok for Swift clusters. However, as we all know, the MLAG is vendor specific, and it needs layered architecture when we want cluster to be scaled-out massively. It also needs more expensive switches for top layer ( which can be called as "backbone" ), based on chassis, which is very expensive thing.  And more, a single node's network status change effects to the core network also because it's based on L2. As an example, if there's huge number of nodes, then the core network should have all of the information of each node's mac-ip map. In various MLAG architecture, it's not flexible for its status change, so it makes serious problem sometimes. And as you can easily imagine, there's more possibility of failure when number of server increases, then the network cloud be slower because of the actions such like update, reference on the table. And there's some MLAG doesn't support active-active, means the bandwidth utilization cloud not be maximized. So, I would like to suggest to use L3 from ToR architecture, such like an iBGP/OSPF with ECMP. Dan Mihai Dumitriu from Midokura and I are figured out how it works for cloud network, and it's effect is exactly same as we wanted. Faster fault tolerance, single node's status change does not effect to core network, not hard to expand, and can be massively scale-out. It's explained in old post at this blog, but unfortunately, it's wrote in Korean. But you can easily understand because it has diagram, and actual switch configurations. Anyway, it solves most problems of MLAG or L2 based architecture, and we can archive more good model for enterprise services.


One more important thing is, the problem of SSL. Swift is based on REST API, and it means the authentication / authorization information are flow through HTTP header. It means we need to secure every single HTTP request with SSL, so the HTTPS is basic thing to make service secure. However, the Swift proxy is built with python, so it's SSL performance is terrible. Therefore, we need to put something else to make it work faster. That is, process SSL with reverse-proxy or software based load-balancer, then pass the requests to Swift proxy which runs without SSL. If you are an infrastructure engineer, then you 'll have some ideas about how to solve this issue. There's some ways to solve this, but one thing that I want to notice is do not use hardware based load balancer which has OpenSSL hardware integration feature. Well, it could be better than single machine's performance, but it's more expensive than software. Don't forget you're building a cloud service, which means there's possibility that every components of service could be added or expanded. 


The last thing is ( even if there's much more things ), about the zone. All of the Swift document says the "5" zone is needed by default. If you have a good understand of Swift, then you already know about what the zone is, which has strong relationship with cluster expansion. And more, it's related with every single rack ( cabinet ) design. This is about how to make expansion model, and also how to make fault tolerance model. As I raise this issue, so you can think about why the "5" is considerable number, and how it effects to the cluster when we change the number to another. 


Not like many other open sources, this solution cloud not be used with "default" options. If you can remember how the linux worked in late '90, then you may understand what this means. There was "no" defaults, and sometimes we need to change some source codes before we compile, and use it. Back to the Swift, I didn't say about DB updates when massive requests comes into Swift cluster yet, because it's needs to figure out by your hands, for your services. There are many decision points exists, it means sometimes it's too hard to go on with this. It's strongly needed to do many tests to build this cluster for right service, then you can solve many of this issues. In my experience, if you build this cluster in production level without PoC or massive tests, then you'll fall into deep problem that cannot escape.  


Many contributors are working hard for Openstack, and I give thanks to them. It's get better and better as time goes by, and I believe that all of its component will be stabilized with more features in not far distant future. Swift is considerable solution when someone want to build huge size storage cluster which will used through Web. But there's always tuning point exists, so our major job to figuring out "butterfly effect" in cloud. The small change will makes huge difference for performance, and costs.


Thanks for reading this post in ugly English, and please feel free to write your opinion about this. 




( younjin.jeong@gmail.com, Younjin Jeong )  



Things that you have to concern when you build CLOUD.

Techs
( younjin.jeong@gmail.com , 정윤진 ) 



클라우드는 이제 관심을 넘어, 이 업계의 사람들에게 실제 비용을 주고 어떻게라도 접근 해야 뒤쳐지지 않는, 마치 패션과 같은 무엇이 되어 버렸다. 이는 어떠한 일반적인 사용자에게는 애플의 "포토스트림" 과 같은 서비스를 해 주는 무언가로 인식 되기도 하고, 개발자들에게는 "저렴한 개발 플랫폼" 으로 인식되기도 하며, 누군가에게는 "어디서나 접근 가능한 저장소" 의 개념이 되기도 한다. 

바야흐로 Everything as a Service 의 시대를 맞이함에 있어, 위에 소개한 개념들을 내포한 대부분의 서비스들이 우후죽순 처럼 생겨나는 시대가 되었다. 누구나 Post Facebook 에 대해 생각해 보고, 좋은 사업 아이디어를 가지고 저렴한 비용으로 서비스를 시작해 볼 수 있는 시대이기도 하다. 아이디어만 있다면, 사업을 시작함에 있어 적어도 인프라에 있어서는 기존의 1/10 도 안되는 비용으로 가능하다.

하지만 언젠가는, 사업이 일정 규모 이상으로 커지고, 데이터 보안에 대한 압박이 커져 갈 수록 기존의 Public Cloud 서비스는 비용과 보안에서 커다란 문제를 가진다. 또한 서비스를 구성하는 각 모듈화된 컴포넌트를 구현함에 있어 제약 사항이 발생하게 되고, 이러한 제약 사항을 해결하기엔 너무 획일적인 구조를 가진 기존의 서비스로 인해 한계에 봉착하기도 한다. 이러한 한계로는 주로 네트워크의 대역폭, 사용 가능한 IP 의 제한, 심각할 정도로 낮은 I/O 성능, 서비스 공급자의 장애 발생에 의한 서비스 중단 및 Flat Network 구성으로 인해 인스턴스에서 1개의 네트워크로 외부 연결 및 내부 연결을 처리해야 하는 구조적인 제약을 가지곤 한다.

Image from: http://softwarestrategiesblog.com/2011/07/27/gartner-releases-their-hype-cycle-for-cloud-computing-2011/

이러한 제약으로 인해 빠르던 느리던 각 기업은 기존과 같이, 직접 운용해야 하는 클라우드 인프라를 소유하고자 하는 경우가 발생하게 된다.  하지만 이러한 클라우드 시스템은 오픈 소스로 구현 하였을 경우, 또 적절한 운용 인력이 있는 경우에 최대한의 성능을 발휘하지만 국내에서는 이 두가지 모두 쉬운일이 아니다. 따라서 많은 기업은 "이미 구현되어 사용법만 알면 되는 클라우드 플랫폼" 에 관심을 가지게 된다. 하지만 이건 구현에 있어 "엄청난 비용" 이 필요하므로, 처음부터 가격 경쟁력을 무시하겠다 라고 정의하고 시작하지 않는다면 향후 큰 난관을 맞이하게 된다. 

금일 포스팅은 이러한 "클라우드 플랫폼" 구성에 있어 반드시 고려해야 하는 요소들을 몇가지 적어보려 한다. 이는 물론 이 포스팅을 읽는 어느분께는 유용할 수도, 유용하지 않을 수도 있지만, 가장 궁극적인 목적은 나 스스로 이러한 것들이 중요하다고 정의/정리 하는 것이 필요함을 느껴서 이다. 따라서 관심이 없는 분들은 언제든 닫아 주셔도 좋다. 또한, 이제부터 정리하는 내용들은 모두 오픈소스 또는 가장 저렴한 방법을 통해 클라우드를 구성한다고 의사 결정이 완료 되었음을 가정하고 설명한다. 


0. 개념 

개인적으로 클라우드의 정의는 클라우드란 사실, 클러스터의 특화된 개념으로 볼 수 있다. 특정 서비스의 구현을 목적으로 동일한 형상의 시스템 다수를 네트워크를 통해 묶는 것을 말한다. 최근에 많이 사용되는 서비스를 기준으로 가상화된 인스턴스를 제공하는 클라우드는 하이퍼바이저 클러스터로 볼 수 있으며,  무한대의 확장을 제공하는 스토리지 클라우드를 디스크 클러스터로 볼 수 있다. 다시 이 위에 서비스를 구현 한 것들은 DB 클러스터, Queue 서비스 클러스터로 볼 수 있다. 

결국 엔드유저 또는 기업이 원하는 것은 하이퍼바이저 클러스터인 컴퓨트 클라우드와, 디스크 서버 클러스터인 스토리지 클라우드로 이루어진 IaaS 클라우드가 되며, 이 위에 DB, Queue, Load Balancer, CMS, CDN 등의 서비스를 덧입힌 것을 REST API 를 통해 컨트롤 하게 만들면 바로 클라우드가 된다.  

클러스터라고 부르면 보통 컴퓨팅에서는 수퍼컴퓨팅 또는 자연과학, 물리학 등에서 계산을 목적으로 사용하는 컴퓨터의 묶음 또는 거대한 Cray 컴퓨터로 할 수 있는 무엇을 상상하곤 한다. 클라우드라 불리는 이 특수목적용 클러스터는 결국, 세분화 한다면 가상화 인스턴스 클러스터, 파일 및 오브젝트 저장 클러스터의 확장에 다름 아니다. 

IBM이 문서 정리는 참 잘하는데, 다음의 링크를 한번 읽어보는 것도 좋다. 
http://www.ibm.com/developerworks/kr/library/os-cloud-anatomy/



1. 네트워킹 

클라우드가 곧 일종의 클러스터이므로, 용도와 목적에 맞는 네트워킹의 구조 설계가 하나의 중요한 포인트이다. 하지만 이 네트워크 구성에 다소 어려움을 겪는 것이 일반적인데, 이는 기존에 사용하던 단일 서비스 네트워크 구조와는 그 모양새가 다르기 때문이다. 왜 다르냐고 묻는다면, 바로 듣기에도 생소한 하이퍼바이저의 클러스터링을 해야 한다 라는 요구조건 때문인데, 이 클러스터링이 요구하는 형태가 그 클러스터 소프트웨어에 따라 조금씩 상이하기 때문에며, 또한 하이퍼바이저 역시 조금씩 다른 성향을 가지고 있기 때문이다. 

물론 그렇다 하더라도, 모든 클라우드 클러스터는 다음의 내용을 충족해야 한다는 조건을 가진다. 

- Scale-out 의 형태로 거의 무한대에 수렴하게 증설이 가능한 구조여야 한다. 
- 필요에 따라 FCoE 즉 iSCSI 트래픽의 처리에 중점을 두어야 할 필요가 있다. 
- 하이퍼바이저 또는 스토리지 클러스터가 원하는 요구조건을 충족해야 한다. 
- 보통 서비스/관리/스토리지/가상 네트워크의 종류를 가진다. 
 
예를 들어, 랙 하나를 가지고 컴퓨트 클라우드를 구현하고자 하는 경우, 다음의 옵션을 사용 할 수 있다.
- Option A :  Cloudstack  +  # of Xen server +  iSCSI Storage + Logging/etc.
- Option B :  Open Stack Nova + # of KVM server + iSCSI Storage + etc.

Option A 를 선택한다고 가정 할 때, 랙이 단 1개만 구성되는 경우라면 별 고민없이 대부분의 컴포넌트에 기본 옵션을 사용 할 수 있다. 예를 들어 Xen server 의 최대 클러스터 수량인 16대를 Compute Node 로 묶어 하나의 공유 스토리지를 가지는 형태로 구성이 가능하다. 이러한 시스템의 준비 및 설치는 장비만 있다면 필자의 경우 수십분 내로 구성이 가능하다. 이러한 단순한 구성에도 네트워킹을 위해서는 사설 관리 네트워크 / 공인 네트워크 / 사설 스토리지 네트워크의 적어도 3가지가 필요하게 되며, 이 랙을 Public 클라우드 처럼 사용하고자 한다면 Router VM 에서 각 고립된 계정에 할당되어 사용할 별도의 사설 IP 대역 및 스위치 레벨에서의 tagged VLAN 구성이 필요하게 된다.

랙 1개에 구성하고자 하는 경우에는 이처럼 큰 구조만 짜 맞추어 주면 별 문제가 안된다. 대부분을 기본값을 사용해도 무방하다. 만약 기업에 필요한 인스턴스의 숫자가 200개 미만이고, 높은 가용성을 요구하지 않는다면 손쉽게 만들어 사용 할 수 있다.

하지만, 만약 사설 클라우드를 ( 이 글의 기본 요구조건인 기업 고객이 그들의 서비스를 위해 사용하고자 하는 경우이므로 ) 엔터프라이즈 레벨, 즉 적어도 랙 500개 이상을 구현하고자 할 때는 간단한 네트워킹으로 해결 할 수 없다. 이는,  다음과 같은 요구조건을 가지게 된다.

- 모든 랙은 서로 통신이 가능해야 한다.
- 서브네팅을 하지 않는다면, 하나의 하이퍼바이저 또는 스토리지가 전체 클라우드를 말아먹을 수 있다.
- 손쉬운 설치를 위해, 모든 랙의 관리 네트워크는 DHCP 가 가능해야 한다. 
- EBS와 같은 기능을 구현하고자 하는 경우, 모든 랙에서 접근 가능한 스토리지 네트워크의 구현이 가능해야 한다.  
- 이 모든 네트워크는 확장 또는 추가에 일정한 "법칙" 또는 "체계" 를 가지도록 해야 하는 것이 좋다. 그렇지 않은경우, 디스크/서버 장애가 발생한 경우 교체를 위해 OP는 책 한권 분량의 매핑 자료를 들고 다녀야 할 것이다. 

언뜻 보기에는 쉬운 요구조건 같지만,  무엇이 베스트 모델인지 추려내는 것은 경험 없이는 쉬운일이 아닐 것이다. MLAG 기반의 L2 형 확장이 답인지, 아니면 각 랙을 L3 기반으로 만들어 백본에 추가하는 것이 나은지는 오직 서비스 요구 조건과 규모, 그리고 비용에 따라 다를 수 있다. 다음을 보자. 

MLAG 을 사용하기로 결정 한 경우
- Enterprise 보다는 Midsize 에 권한다. 
- 백본의 성능이 중요한 이슈가 된다. 
- 벤더마다 다르지만, MALG 구성시 양쪽의 회선을 동일하게 Active - Active 형태로 제공하는 제품을 사용하는지 확인 할 필요가 있다. 
- Backbone 의 포트 수량에 따라 클러스터의 크기가 결정되는 경우가 많다. 

L3 기반의 네트워킹을 사용하기로 결정 한 경우 
- OSPF/BGP 등의 프로토콜이 전사적으로 지원 되어야 한다. 
- ToR 의 물리적 Uplink 수량에 따른 ECMP 지원 여부를 확인/테스트 해야 한다. 
- 실제 장애를 발생시키는 테스트에서 Route Path 의 업데이트를 명확하게 체크하도록 한다. 


공통 
- Flat Network 를 구성하는 경우, QoS 사용 여부를 적극 검토하도록 한다. 
- 서비스에 따라 MTU 구성에 대한 최적의 값을 찾아보도록 한다. 물론, 하이퍼바이저에 따른 MTU 의 지원여부는 확인해 보아야 한다. 
- Provisioning 을 위한 DHCP Relay 의 동작을 구성하도록 한다. 

본 네트워킹에 대한 부분에서는, 이전에 포스팅한 iBGP 관련 내용을 확인 해 보도록 한다. 
네트워킹은 클러스터의 젖줄이기 때문에, 그 설계에 있어 클러스터에 필요한 모든 요구사항을 반영할 수 있어야 한다. 이 말은 바꾸면 클러스터에 대한 요구 조건을 파악하는 것이 클라우드 네트워크 설계의 핵심이며, 따라서 다음의 내용은 클러스터에 대해 알아 보도록 한다. 

아시다시피, 각 클러스터의 리소스에 연결되는 대역폭 또는 Latency 와 같은 이슈도 중요함은 굳이 추가로 설명하지 않는다. 



2. 하이퍼바이저. 

어떠한 하이퍼바이저를 사용 할 것인가 결정하는 문제는 그렇게 쉬운 것이 아니다. 그 이유는 첫째, 직접 원하는 환경에서 구동해 보지 않으면 알아낼 수 있는 사실이 거의 없고, 문제가 한번 발생하면 상용이던 오픈소스던 해결이 쉽지 않으며, 가상화를 이해하는데 필요한 기본 개념이 제법 많기 때문이다. 

한가지 더 중요하게 고려해야 할 사항은, 과연 하이퍼바이저가 필요한가의 여부이다. 물론 대부분의 가상화된 인스턴스를 제공하고자 하는 클러스터는 당연히 하이퍼바이저를 사용해야 하지만, 경우에 따라 하이퍼바이저가 없는, 즉 기존의 일반적인 물리 서버를 그대로 사용하고자 하는 경우도 있을 수 있다. 가상화를 사용하기 시작한 이유는 대부분의 서버가 서비스 하는 시간동안 peak 상태를 유지 하는 것 보다, idle 상태가 더욱 많기 때문에 물리적 자원을 극대화 하여 사용하기 위해 이를 독립적으로 쪼개어 사용하고자 하는 이유에서 비롯된 것이다. 하지만 서비스가 대부분의 시간동안 Peak 를 치는 경우, 이는 하이퍼 바이저를 사용하지 않거나, 또는 인스턴스 생성의 기본이 되는 서비스 오퍼링을 극대화, 즉 DomU 의 수량을 줄이는 형태의 구성도 때로는 필요하게 된다. 아마도 HPC 분야에 사용하려는 클라우드의 경우 이러한 구성을 생각해 볼 수 있겠다. 

상용으로 많이 사용하는 것은, VMWare 와 Xen 이며, Xen 의 경우에는 오픈소스로도 가져다가 사용이 가능하다. 통상 KVM, VMware, Citrix Xen, OSS Xen 중 하나를 선택하여 클러스터를 구성하게 되는데, 각 클러스터 별로 인스턴스의 통제를 지원하는 범위 및 API 의 사용성등이 상이하므로 충분한 테스트를 통해 기업의 서비스에 맞는 하이퍼바이저를 선택하는 것이 중요하다. 

예를 들자면, 
- VM에 대한 BIOS 제어 범위 
- Redundancy 구성의 가용 범위 ( 예를 들면 802.3ad 구성시 MTU 변경 적용 가능 여부 등 ) 
- vCPU, 메모리 할당의 한계와 VM 수량에 대한 적정 비율. 
- API 
- VM 의 백업 지원 방법 
- 공유 스토리지 필요여부 
- 이미지 / 템플릿을 통한 Deploy 
- Thin Provisioning 
- 필요한 경우 GPGPU 와 같은 기능을 위한 PCI Pass-through 
- 필요한 경우 Software 기반 스위치 ( ex. Open vSwitch ) 와의 연동 여부 
- Dom0 로 통칭되는 가상화 OS 의 변경 적용 범위 
- 사용하고자 하는 클라우드 통제 시스템 ( 통칭 클라우드 스택 ) 과의 부드러운 연계 

등등의 내용이 있을 수 있다. 이러한 하이퍼바이저의 선택과 사용은, 벤더의 제품인 경우에도 벤더에 의지하기 보다는 내부의 경험있는 기술자에 의해 검증되는것이 필요하다. 일반적으로 논의되는 Vendor Lock-in 의 문제를 피하기 위해 다양한 하이퍼바이저가 검토되어야 할 필요가 있지만, 이 하이퍼바이저는 하드웨어와도 직접적으로 연계되는 부분이 제법 있으므로 보통 한번 선택하면 변경될 가능성이 거의 없다. 

하이퍼바이저라는건 기본적으로 VM 또는 인스턴스가 돌아가는 기본 장소이며, 이에 필요한 기능만을 선택하여 사용하는 것이 중요하다. 예를 들면, Citrix Xen server 는 공유 스토리지를 기반으로 클러스터링 하여 사용하는 것이 가능하지만, 별도의 클라우드 관리 스택을 사용하는 경우 공유 스토리지 없이 사용 하는 것도 가능할 수 있다. 이렇게 되면 XAPI 를 사용한 클러스터간 통신이 없어지게 되며, 별도의 라이브마이그레이션 등의 기능을 사용하지 않게 되므로 VM을 "만들고", "켜고", "끄고", "지우는" 기본 동작이 엔터프라이즈의 규모에서 보다 빠르고 안정적이게 동작 하는 것이 가능하다. 물론, 이는 여러가지 상황을 함께 고려해야 하므로, 단순히 본인의 의견을 수용하는 것 보다는 사용하고자 하는 오케스트레이션 도구, 즉 클라우드 스택과의 연동을 함께 살펴보는 것이 중요하겠다. 


3. 클라우드 관리 도구 

사실 각 클라우드의 특성은, 이 관리도구를 어떻게 구성하는가와 밀접한 관련이 있다. 이 관리 도구의 특성과 각 구성에 있어 지원하는 범위에 따라 컴퓨트 클라우드는 그 기능이 정해진다고 해도 무리가 없다. 이를 테면 다음의 핵심 기능들이 꼭 구비 되어야 컴퓨트 클라우드가 원하는 기능을 수행하는 클라우드 스택이라고 말할 수 있다. 

- 사용자 관리 도구. 
- 사용자가 가진 인스턴스에 대한 메타데이터 생성/보존/변경 
- 하이퍼바이저 클러스터의 전체 리소스 균등 분배 
- 골드 이미지/템플릿 등을 통한 리눅스/윈도우 등의 인스턴스 생성/삭제/종료/시작 
- 사용자 키 기반의 인스턴스 보안 설정 지원 ( 패스워드 및 admin 계정 등 ) 
- 필요한 경우 사용자 단위의 추가 Volume 생성/삭제/인스턴스 연결/해제 지원 
- 사용자 이미지 생성/백업을 위한 다양한 스토리지 연결 지원 
- 각 인스턴스 또는 리소스에 대한 헬스체크를 사용, 문제 발생시 메타데이터를 통한 VM 이동, IP/Volume 등 기존 자원의 자연스러운 매핑 
- VM 콘솔 
- 빌링이 필요한 경우 각 리소스 사용량에 대한 측정 지원 
- 위의 모든 기능을 사용 할 수 있는 API ( REST API ) 지원 

클라우드 스택이란건 ( cloud.com 의 제품만을 말하는 것이 아님 ) 결국 컴퓨트 클라우드에서 가상화 자원에 대한 "이동", "생성", "삭제", "연결", "중지", "시작", "접근", "백업", "복구" 등의 핵심적인 기능을 지원하는 도구를 말한다. 이러한 모든 동작은 하이퍼바이저를 제어하는 기능과, 현재 가지고 있는 자원에 대한 적절한 계산을 통한 분배 등을 지원하는 기능을 포함해야 한다. 

예를 들어, 처음 인프라를 구성하게 되는 경우 5개의 랙으로 시스템을 구비하였다가, 향후 20개의 랙으로 확장 했을때 기존 5개의 랙에서 동작하던 VM이 자연스럽게 나머지 20개의 랙으로 골고루 퍼질 수 있어야 한다. 현재 상용및 오픈 소스로 구성이 가능한 클러스터 모두 이러한 부분에 있어 제한 사항을 가지고 있는데, 어떠한 제약이 있는지는 직접 테스트 해 보는 것이 좋을 듯 하다. 

내 생각에 가장 좋은 구현의 방법은, 메타데이터를 통한 API 명령을 조합하여 위의 기능들을 구현한 관리 스택을 기업의 개발팀이 직접 만들어 내는 것이다. 물론 개발 그룹이 없는 기업의 경우에는 힘들겠지만, 국내 대부분의 클라우드를 위한 대규모의 자금을 사용할 수 있는 기업의 경우 자력으로 구현이 가능한 자회사를 가지고 있다고 생각한다. 물론, 여러가지 이슈로 쉬운 일이 아니긴 하지만, 그런 부분을 제외하고 개인적인 견해를 피력해 보자면, 다음과 같은 컨셉을 반영한 도구면 된다. 

- 기본적으로 하이퍼바이저 레벨에서 지원하는 클러스터링은 하지 않는다. 이는 클러스터 규모를 제한함으로서 확장 단위 구성에 난점이 있다. 
- 기존의 대규모 계산용 클러스터와 같은 구성을 취하도록 한다. 각 하이퍼바이저는 랙 내에서 독립적으로 동작하며, 이들 리소스에 대한 관리는 클라우드 스택에서 한다. 
- 클라우드 스택은 서비스를 위한 데이터베이스를 가지고, 이 데이터베이스에는 사용자 VM이 동작하는 위치, VM 생성에 사용된 서비스 오퍼링, iSCSI 또는 SAN 에서 해당 VM에 연결된 가상 Volume 의 위치, 네트워크 정보 및 인증 정보 등을 가진다. 또한 별도의 헬스체크 모듈을 통해 일정 시간 단위로 VM의 상태에 대해 파악한다. 
- VM에 문제가 발생한거나 사용자가 원하는 경우, 미리 계산된 리소스 ( 하이퍼바이저의 vCPU, RAM ) 등의 가용성에 따라 적절한 호스트에 VM을 신규로 생성하고, 기존의 VM은 삭제 처리 한다. 물론, 데이터베이서의 정보를 바탕으로 기존의 Volume 연결을 지원해 준다. 
- 백업이 필요한 경우 별도의 스토리지 또는 오브젝트 스토리지등의 클라우드로의 백업 경로를 지원한다. 보통 동일한 이미지를 사용하도록 강제하는 정책을 사용함으로서, 스냅샷 기반의 백업/복구를 보다 쉽게 처리하도록 한다. 


위와 같은 구조를 채택한다면, 아마존의 EBS와 같은 사용성을 제공함과 동시에 클라우드 스택이 지원하는 모든 하이퍼바이저를 어떠한 구조적 제약 없이 사용하는 것이 가능 할 것이다. 기본적으로 우리는 항상 VM에 하이퍼바이저를 통한 Volume 연결을 생각하지만, VM에 직접 iSCSI 또는 FCoE 와 같은 기술을 통해 직접 연결을 구성한다면 필요한 Volume 의 확보 및 인스턴스(VM) 의 장애에 대한 데이터 복구가 훨씬 자유로울 수 있을 것이다. 

이러한 클라우드 스택의 동작은 하이퍼바이저를 통제하는, 즉 가상화 시스템 상위에 위치하지만, 기업이 직접 구현해야 할 사용자 포털 및 관리 포털 보다는 하위에 위치한다. 따라서 클라우드 스택은 이러한 연계를 위해 API 및 포털로 부터 할당받은 커맨드 실행을 위한 Queue 등을 구현해 줄 필요가 있게 된다. 이 말이 의미하는 바는, 즉 클라우드 스택의 기능 범위를 제한 할 필요가 있다는 것이다. 아마존을 빗대어 이야기 해 보자면, SQS, EMR, RDS, ELB 와 같은 서비스를 모두 클라우드 스택 내에 녹여낼 필요는 없다. 물론 함께 동작 할 수 있다면 좋겠지만, 각 서비스별로 구분된 클러스터를 독자적으로 만들고, 이를 포털에서 API 로 통제하는 것이 더 좋다는 말이다. 이해를 돕기위해 추가적으로 설명 해 보자면, 

- 클라우드 스택은 VM 및 Volume 의 관리 및 (사설 또는 공인) IP 의 할당 까지만 관여한다. 
- ELB 와 같은 기능은 별도의 밸런서 팜을 구성하고, 여기에 포털에서 스택과의 연계를 통해 밸런서에 인스턴스를 등록 할수 있도록 한다. 
- SDB와 같은 서비스는 고객의 인스턴스가 위치하는 컴퓨트 클라우드 외에, 별도의 독립된 컴퓨트 클라우드 팜을 구성하고, 여기에 CouchDB / MongoDB 와 같은 서비스 클러스터와 API 를 구현, 역시 포털에서 사용자 별로 독립적으로 할당하도록 한다. 

뭐 당연한 이야기 같지만, ELB 와 같은 서비스의 경우 클라우드 스택 내에서 해결하려는 경우가 많다. 극단적인 예로 단일 기업이라면, 컴퓨트 클라우드를 구성하고 각 인스턴스에 공인 ( 또는 공인 처럼 취급되는 사설) IP 를 직접 연결, 상위 별도의 망에서 밸런싱 처리를 하는 구조를 취하는 것이 가능 할 수 있다. 


이처럼, 컴퓨트 클라우드를 위한 관리 스택은 바로 EC2 의 관리를 위한 모듈처럼 취급 되어야 하며, 그 자체로 적절한 기능의 제한이 있어야 한다. 한가지의 보다 더 극단적인 예는, Cloud.com ( 이제는 Citrix ) 의 구조를 사용한 작은 클러스터를 랙 별로 할당하고, 이를 상위 포털에서 Cloudstack 의 API 를 통제하는 형태로 구현하는 것도 가능할 것이다. 물론, 여기에서 발생하는 네트워크 문제는 여러분이 직접 해결 해야 할 것이다. 기회가 되면 소개하겠지만, 이미 이 주제에 대해 너무 많이 쓴 것 같다. 



4. 스토리지 

대부분의 현재 동작중인 퍼블릭 클라우드가 I/O 성능을 병목 구간으로 가지고 있다. 사실 컴퓨트 클라우드를 더 잘 사용하려면 가급적이면 I/O 접근을 사용하는 부분을 줄이는 것이 좋은데, 아무리 이 부분을 강조 하더라도 기존의 단일 서버처럼 사용하도록 개발을 하는 패턴을 전체 개발자에게 금지 시킬 수는 없다. 하여, 기본적으로 어느 정도까지는 그 I/O 성능을 보장해 줄 필요가 있는데, 이에 대한 요구 조건을 충족 하려면 다음과 같은 내용을 고려 해야 한다. 

- 클라우드에서 사용되는 스토리지는 대부분 네트워크를 통한 원격 스토리지이다. 
- 하이퍼바이저 내에서 동작하는 VM의 수량과 관계가 있다. 이는 또 물리적으로 다른 랙에 타겟 스토리지를 구성한 경우 랙간 레이스 컨디션이 발생 할 수 있다. 
- 클라우드 클러스터에서는 대부분의 I/O 가 랜덤하게 발생한다. 따라서, 스토리지의 성능이 매우 중요한데, 요청이 과다하게 몰리는 경우에도 timed out 이 발생하여 스토리지 세션이 끊어지지 않도록 관리하는 것이 매우 중요하다. 
- 따라서 분산이 매우 중요하다. Commodity H/W 의 개념에서, 한대의 스토리지가 분산을 지원하는 것 보다는 수많은 스토리지를 별도의 네트워크에 분산하고, 이를 클라우드 스택에서 관리하도록 하는 것이 현명 한 방법이 될 수 있다. 
- 성능 이슈로 분산했다면, 장애 극복을 위한 복구 및 복제 방침이 마련 되어야 한다. DRBD 와 같은 구성이 요구 될 수 있다. 
- 하나의 랙 또는 한대의 스토리지에 너무 많은 디스크 자원을 분배하지 않아야 한다. CPU 당 디스크, I/O 성능을 기반으로 한 네트워크 한계점 설정이 중요하다. 
- 이러한 형태의 클라우드 스토리지에서는 캐쉬빨이 별로 받지 않는다. 
- 비용이 허락한다면 Write Back 을 지원하는 HBA 를 사용하도록 한다. 


스토리지는 참으로 귀중한 자원이다. 특히 오브젝트 스토리지와는 다르게 일반 Volume 의 사용성을 가지며 인스턴스에 직접 연결되는 이러한 스토리지는, 반드시 사용자의 필요에 의해 요청된 경우에만 인스턴스에 연결해야 한다. 이 말은 기본 스토리지는 휘발성을 가지도록 구성해야 하며, 꼭 필요한 경우에만 이러한 원격 스토리지를 할당해야 부하를 줄일 수 있다는 말이 된다. 

만약 인스턴스의 로컬에 격렬한 계산을 통해 스크래치 파일 ( 일반적으로 삭제되도 되는 파일 ) 을 만들어 내는 경우, 이는 하이퍼바이저 로컬에 thin provisioning 된, VM이 살아 있는 동안에만 유지되는 가상 파일시스템을 사용하는 것이 맞다. 만약 이렇게 격한 I/O 를 원격 스토리지를 사용하도록 한다면, 아마존에서 발생했던 것과 유사한 장애를 경험하게 될 확률이 높다. 

이 부분의 설계시 중요하게 고려되어야 할 부분은, 원격 스토리지 볼륨의 사용은 Persistency 를 가지는 데이터에 한하며, 각 가상 인스턴스는 꼭 필요한 경우가 아니면 이러한 원격 스토리지를 할당하지 않도록 서비스를 설계 해야 한다. 이를테면, 인스턴스가 처음 생성되거나 재부팅 시에 항상 업데이트된 코드를 저장소로 부터 다운로드 받도록 구성하는 것과 같은 기법 말이다. 

아마존 서비스의 많은 부분이 미스테리이긴 하지만, 중요한건 기업용 사설 클라우드가 반드시 아마존과 동일한 형태로 모든 서비스를 구축 할 필요는 없다는 것이다. 그들의 주 목적은 모든 사용자를 위한 "Public" 클라우드 이며, 기업용은 거의 대부분의 경우 "Private" 클라우드 이기 때문이다. 

EBS 시스템에 관해 재미있는 번역 포스팅이 있는데, 한글도 있으므로 관심이 있다면 읽어보는 것도 좋을 듯 하다. 
http://jmlab.tistory.com/19

결국은, 클러스터 된 네트워크 스토리지이며 확장을 위해 L3 레벨로 구성되었음을 알 수 있다. 



5. 자동화 

이 부분을 의외로 쉽게 보는 분들이 많은데, 위의 0,1,2,3,4 가 모두 아키텍처로 녹아 있는 것이 바로 이 자동화가 되겠다. 하지만 시작부터 겁낼 필요는 절대 없다. 이는 하나의 거대한 어플리케이션을 만드는 것이 아닌, 요소별 필요한 파트를 지속적인 코드 테스트를 통해 구현해야 하는 것이다. 하드웨어 별로 다른 코드가 필요할 수 도 있으며, 향후 인프라 아키텍처의 변경으로 인해 수정되어야 할 필요가 있을 수 있다. 처음부터 완벽한 클라우드 또는 클러스터를 만드는 것은 현재로서는 거의 불가능하며, 반복된 자동화 코드의 수정을 통해 보다 안정된 서비스를 만들어 낼 수 있게 될 것이다. 

클라우드용 클러스터 구현을 위한 자동화는, 보통 다음과 같은 내용을 구현 해야 할 필요가 있다. 

- Internal Resources ( NTP, TFTP, DHCP, DNS, Package Mirror-site, Code repository, etc ) 
- PXE Boot  Support 
- OS Install 
- First-boot scripts
- Interface setup
- File system
- SSH keys
- Cluster setup
- Storage server 
- Log / Meetering / Monitoring , etc 

서비스에 따라 더 구성해야 할 것들이 있을 수 있지만, 기본적으로는 위와 같은 구성요소를 자동화 해야 할 필요가 있다. 클라우드의 용도에 따라, 그리고 하드웨어의 변경에 따라 코드의 변화가 필요할 것 같은 부분들은 변수처리를 통해 구현하는 것이 유리하다. 

자동화에 대해서는 별도의 책을 출간 준비중이므로, 조만간 좋은 내용을 소개 할 수 있지 않을까 한다. 




6. 클라우드 개발에 대한 인식 

사실 앞의 내용들 보다 이 부분이 가장 중요 할 수 있다. 기본적으로 상용 클라우드를 직접 덩어리째 사서 들고올 생각이 아니라면, 일정 부분 이상은 오픈소스를 사용해야 할 수 있다. 심지어 오픈소스가 아닌 상용을 구매하여 사용하는 경우라도 각 컴포넌트를 충분히 경험한 엔지니어가 많지 않다. 이 말은, 어떠한 경우에라도 문제가 발생했을때 올바른 지원을 받을 가능성이 낮아진다는 말이 된다. 게다가 이 클러스터는 수많은 요소가 서로 결합된 것이기 때문에, 스토리지와 하이퍼바이저의 벤더가 다른 경우 문제가 발생 했을때 서로 손가락질 할 가능성이 있다. 이는 네트워크도 마찬가지이며, 국내 벤더사들의 특성상 벤더 엔지니어는 벤더 제품에 종속적인 경우가 많고, 만약 다른 부분에 장애가 발생한 것을 명확히 파악 하더라도 입밖으로 내기 쉬운 환경이 아니다. 

이러한 환경적 제약은, 바꾸어 말하면 클라우드를 구현하려는 기업이 스스로 능력을 축적해야 한다는 말이 된다. 컨셉을 확인 할 수 있는 최소한의 규모의 랙을 가지고, 수많은 테스트를 통해 무엇이 최선인지, 그리고 어떻게 사용해야 하는지에 대해 내부 인력이 학습해야 한다. 그것을 바탕으로 자동화코드를 만들고, 만들고 부수는 작업을 반복했을때 비로소 동작하는 클라우드를 만드는 것이 가능해 진다. 

바로,  

아키텍처 디자인 --> 개발 환경 구성 --> 자동화 코드 개발 --> 설치 및 배포 --> 테스트 --> 재 디자인 --> 코드 개발 --> 배포 --> 테스트 

의 순환을 가급적 빠른 속도로 잘 짜여진 스케줄 안에서 진행해야  개발, 운영에 대한 노하우의 내재화가 가능 할 것이다. 
물론 이러한 구성에 있어 경험자의 리딩이 매우 중요하며, 전체 과정이 일반적인 기업 연구소에서 진행 되는 것 처럼 루즈하게 늘어져서는 안된다. 그러기 위해서는 현재 실무를 담당하고 있는 인프라와 개발진이 적절한 리더에 의해 협업해야 하며, 인프라가 개발을 무시하거나 개발이 인프라를 무시하는 일 없이 서로가 서로의 일이 어떻게 시스템에 반영되는지 긍정적인 자세에서 이해하는 것이 필요하겠다. 


사실, 국내의 모든 클라우드는 바로 이 부분이 쉽지 않기 때문에 문제가 발생하지 않나 싶다. 개발과 운영이 협력하면 참 좋을텐데, 이게 쉽지 않더라는...  아무튼. 


엄청나게 긴 포스팅이 되었는데, 실질적으로 코드는 하나도 없어서 좀 그런 것 같다. 또한 너무 컴퓨트 클라우드에 종속적인 이야기가 많은 듯 하지만, 결국 기업이 원하는 사설 클라우드에 필요한 구성은 컴퓨트와 스토리지 클라우드가 거의 대부분이다. 이 두개 클러스터의 아키텍처가 올바르다면, 나머지 아마존like 한 서비스를 올리는 것은 시간의 문제일 뿐이다. 다만, 굳이 아마존과 비슷한 서비스를 만들어야 할 필요가 있는지는 자문해 보아야 한다. 

각 개인에게 클라우드 서비스를 판매 할 것이 아니라 서비스를 클라우드 위에서 구현하는 것이 목적이라면, 해당 서비스에 맞는 "적절한 클러스터의 구현" 이 오히려 올바른 개발 방향이 될 것이다. 굳이 아마존 따라서 개발 하느라 가랭이 찢어지지 말고, 먼저 구현해야 할 올바른 클러스터를 준비하는 것이 맞지 않을까 생각해 본다.


( younjin.jeong@gmail.com , 정윤진 )