System Compleat.

Cloud Build? Build in Cloud?

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


이제는 대세라 부르기도 뭣하다.  작년 KT가 야심차게 기업의 사활을 걸었다며 아마존 클라우드 서비스와 같은 IaaS 를 목표로 뜀박질 하기 이전까지만 해도 국내에서의 클라우드는 그게 뭥미?  또는 그거 지금 필요 없삼 의 반응이 지배적이었다.

하지만 KT로 부터 촉발된 클라우드 사업 경쟁의 시작은, 올해 초부터 호스트웨이의 Flex Cloud 서비스를 필두로 SK 의 T Cloud, LG CNS Cloud 등 수많은 클라우드 플랫폼들이 등장하면서 바야흐로 춘추전국시대를 앞두고 있다.  하지만 2011년 중반 현재까지, 아마존의 클라우드에 필적할 만한 인프라스트럭쳐 클라우드는 국내에는 없어 보이며, 만약 아마존이 국내 시장에 등장한다면 ( 그럴일은 별로 없지만 ) 아마 다른 모든 클라우드들은 초라해 지지 않을까 생각한다. 


예전의 클라우드사마


이제는 아무도 이런 블로그에서 클라우드 하면 이 파이널 판타지 7의 클라우드를 떠올리지 않는다. 

클라우드란건, 궁극적으로 서비스를 만들어서 제공해야 하는 입장에서는, 즉 아마존과 같은 클라우드를 서비스 하겠다 하고 퍼블릭 클라우드 사업에 뛰어들 기 위해서는 기술적으로 심각하게 고려되어야 하는 것들이 몇가지 있다.
요즈음 옥션의 광고에서 처럼, 당신이 고객이 되어 본다면 이러한 IaaS 클라우드 서비스에서 고객의 입장으로 클라우드를 사용할 때 고려할 것들은 다음과 같다.

  • 인스턴스의 생성/삭제가 허용할 만한 범위내의 시간에서 이루어지는가.
  • 내가 원하는 경우 어떠한 형태로든 인스턴스의 데이터에 대한 백업이 가능한가.
  • 내 인스턴스를 우리 서비스에 맞는 어플리케이션을 설정하고, 이를 템플릿화 하여 재사용이 가능한가.
  • 내가 사용한 트래픽/프로세싱파워/스토리지 공간 등에 대한 과금이 정확하며 합리적인 것인가.

이는, 내가 매번 내부 교육이나 PT에서 강조하는 클라우드의 가장 큰 특성인 "신축성"에 더하여, 퍼블릭 클라우드가 가져야 하는 최소한의 성능 및 요구조건을 이야기 한다.  위의 넷중 하나라도 제대로 동작하지 않는다면, 클라우드는 클라우드로서의 경제성/기능성을 잃게 되고, 고객은 떠날 것이다.

이러한 요구 조건들을 당최 어떻게 충족시킬 것인가? 
다시 클라우드를 만드는 사람의 입장에서,

  • 고객 인스턴스의 충분한 사용성을 확보하기 위해서, 다음의 리소스에 대해 수많은 테스트와 적절한 플랫폼/아키텍쳐에 대한 고민이 필요하다.
  • 스토리지 I/O 성능
  • 네트워크 구조 및 구간별 대역폭
  • 전체 시스템 내에서 고객 인스턴스들의 오케스트레이션
  • 클러스터 노드들의 스펙
  • 보다 쉬운 개발 및 관리를 위한 자동화 방법/구조 선택
  • 효율적인 모니터링 시스템의 구현
  • 사용자 계정별 적절하고도 비교적 정확한 과금방법 구현 
  • 경쟁사 대비 보다 저렴한 구축비용 
  • 고객 사용성과 서비스 제공에 대한 적절한 Trade off

위의 몇가지에서 파생될 수 있는 수많은 가능성은 굳이 언급하지 않아도 골치 아파질 것이다.  이렇게 고려해야 할 것들이 많을진데, 우리나라 클라우드들은 조금 써보면 궁금해 지는 부분이 없지 않아 있다.  아직 상용화 하기엔 이른 부분들이 있어 보이고, 경쟁사를 인식해 너무 서두르는 감이 있지 않나 싶다.

클라우드는, 내부에서 실험적으로 사용하고자 할때 비용과 자원만 있다면 반나절만에도 구축 가능한 플랫폼이다.  하지만 이런 클라우드를 "고객이 사용해 보고 만족할 만한" 플랫폼으로 만드는 것은 수많은 전문 인력들이 수개월 동안 애자일과 같은 모든것이 공유되고 모든 코드가 내부에 공개된 고도의 협동조직이 만드는 것이 아니면 안된다.  전문화된 스토리지 엔지니어와 서버개발자, 백엔드와 프론트 엔드 개발자, 가상화 전문가 등 각 분야에 매우 전문적인 서로다른 인력들이 팀으로 조화되지 않는다면 사실 클라우드 만들기는 돈지랄 하는 소꿉장난이 될 수 밖에 없을 것이다.

우리나라의 기업 및 IT 조직 구조는 사실 이런 형태가 아닌  시스템 하는 사람 모임 시스템 팀, 개발해서 기능 추가하는 사람들의 모임 개발팀, 데이터베이스 관리하는 DBA팀 과 같이 같은 직무를 수행하는 사람들로 이루어 진 경우가 많이 있다.  이러한 구조는 기존의 구조를 "유지" 하는데는 좋을지 몰라도, 클라우드와 같은 "대주제" 를 소화하기에는 이미 너무 구시대적이며, 맞지 않는다.  조직은 기본적으로 다른 조직과 경쟁 할 수 밖에 없는데, 이러한 조직의 형태는 이미 경쟁이 될 수가 없다.  경쟁이 되지 않는데 경쟁을 붙여 놓으면 ( 고가평가) 당연히 싸움이 나고 프로젝트는 산으로 간다.

뭐, 조직내로 숨고 싶어하는 사람들이 많은 국내의 많은 직장인들은 사실 내가 노출되어 능력을 발휘해야 하는 포지션이 되는것이 두려운 분들이 많다는 것도 잘 알고 있다.  이런 분들은 나중에 OP 교육해서 원래 하던대로 하시도록 하고, 그런 성향이 아니며 충분히 능력이 있는 분들을 플랫폼 개발 일선으로 배합해야 하는 것도 매우 중요한 과제 되겠다. 글고 울나라는 아이비 리그 같은 좋은 학교 졸업하신 분들이 ( 꼭 언급된 특정 대학을 비난하고자 하는 의도는 없음 ) 이런 일 잘 할것으로 기대하는데, 사실 꼭 그렇지만은 않다.  이런 분들은 대개 더 높은 곳을 바라 볼 수밖에 없고, 비용이 굉장히 높을 수 밖에 없다.  뭐 그렇다 할 지라도 잘 만들어 주면 좋은데, 이게 또 그렇지 않은 경우가 대부분이랄까.  사실 이런 하이스펙의 인력으로 TF 를 채우는것은 상부로의 보고를 쉽게 만들고 프로젝트 실패를 "원래 할 수 없었던 것" 으로 만들기 위한 회피기동의 최우선 과제 일 뿐이다.  물론 다른 이유들이 더 있겠지만,  이런 부분들이 클라우드 완성을 위한 필요 요소가 되지 않음은 당연지사 일 것이다.

정리하면, 클라우드를 만드는 것은 매우 비용이 많이 들고, 인력의 관리 및 확보가 쉽지 않으며 경험있는 사람이 많지 않기 때문에 이 사람들에게 실패를 통해 기술을 축적할 시간을 주어야 하고, 이를 통한 대다수의 관리자들에가 충분한 교육이 될 수 있도록 하지 않으면 안될 것이다.  이런 과업을 수행하기 위해서 조직의 구조와 문화가 변경되어야 하고, 기존의 조직과는 분리가 되어야 하며, 그 인원의 충원에 있어서도 이전과는 다른 기준을 적용해야 한다.  이런 모든 것들 때문에 클라우드의 실현이 쉽지만은 않은 것이라 생각한다.




예전 Cloud Connect Event 에 갔을때 어떤 사람이 이런말을 했다. 

"자동차가 처음 나왔을때, 많은 사람들은 자동차가 순식간에 말과 마차를 대체할 것이라고 생각했습니다.  하지만 당시의 사람들은 그저, 보다 조금 빠른 말과 마차를 원했을 뿐 입니다."

또는, 만약 전쟁사를 좋아한다면 베트남 전쟁시 미군이 최신무기인 미사일에 대한 무한 신뢰로 팬텀 전투기에서 기관포를 아예 제거해 버림으로서 조종사들에게 원성을 샀던 일화를 알고 있을 것이다.

이제, 클라우드를 이용하는 고객의 관점에서 생각해 보자. 클라우드는 이제 시작되었고 ( 물론 실리콘벨리에서는 5년 전 즈음에 시작되었다. )  이 클라우드에 대한 이론적 사업모델과 실제 아마존/랙스페이스/고그리드 같은 기업들도 생겨났다.  또는 우리는 클라우드에요 라고 말하고 있지는 않지만 그 서비스 구성의 알려진 일부 모델이 클라우드 또는 어플리케이션 클러스터의 형태를 띄는 구글의 서비스, 또 막대한 데이터 양을 처리하는 Flickr 나 Twitter, Facebook 과 같은 서비스 모델들도 생겨났다.  이들은 모두 일종의 선구자들이고, 자동차 산업의 벤츠, 포르쉐, 페라리와 같은 존재들이다.  그들은 그와 같은 모델을 만들기 위해서 어떠한 부분에 가장 많은 자원을 투자했는지 조차 비밀에 부치며 그들의 경쟁력을 유지하고 있다.

 


하지만 그러한 비밀의 핵심 내용은 사실 간단하다.  현대의 웹 어플리케이션은 많은 부분에서 예전의 도스시절 C로 작성한 어플리케이션 보다 어플리케이션 자체로서의 비밀의 비중이 낮다.  이말은 쉽게 말하면 도스시절보다 현대의 웹세상이 프로그램 만들기가 보다 쉽다는 말이다. 여기에 전제를 달아야 하는것이 바로 '기능 구현 면에서는' 이 될 것이다.  그런데 도스 시절보다 어려워진 것이 웹 세상에 있는데, 웹 세상에 있는 사람들은 보통 이런 부분을 많이 생각하지 않는다. 적어도 국내에서는.  그 부분이 바로, '분산을 위한 어플리케이션 구조' 일 것이다.  다른말로 이런 아키텍처링은, 위에서 말한 모든 회사의 비밀의 핵심이다.  이러한 비밀이 풀리는 순간, 아류의 서비스는 순식간에 등장하여 경쟁력을 약화 시킬것이 분명하다.  하지만 아이러니하게도, 국내에서 이런 부분에 관심을 가지는 분들은 각 기업 연구소에 계신분들은 안계신 듯 하다.  사실 큰 관심도 없어 보인다.  그래서 벤처들이 좋은 기회를 맞이하는 부분도 있을 수 있겠지만, 역시 국내의 여러가지 환경에서 이런 부분에 대한 고려를 해 달라 라는것은 현실적으로 무리가 따르는 것도 사실 아닌가.

클라우드란건 이제 페이스북과 같은 서비스를 시작하려는 불특정다수의 사업가들과 또 이러한 사업가들에게 네트워크 대역폭과 컴퓨팅/스토리지를 판매하려는 일종의 기간사업가 양측 모두에게 매우 매력적인 플랫폼이라 인식되고 있다.
하지만, 난 이런 이야기를 하고 싶다.  서비스의 단위리소스, 즉 웹서버라던가 디비서버, 스토리지 등을 1로 만드는건 그 개발기간이 2로 만드는 것보다 짧고 쉽다.  2로 만드는것은 1로 만드는 것보다는 어렵지만, 3으로 만드는 것 보다는 쉽다.  하지만, 진정한 클라우드의 마법은 3으로 만들었을때 시작되며, 3으로 만들 수 있도록 고려된 서비스는 n 으로 확장 가능할 것이다.  이러한 기술적 또는 클라우드의 특성에 대한 고민 없이 클라우드에 기존 서비스를 그저 "올려" 만 놓는 형태의 클라우드 사용은, 페이스북을 꿈꾸는 당신의 사장님에게 좌절을 안겨다 줄 뿐이다.

뭔가 주제없는듯 글만 길어지는 듯 한데,  클라우드를 만들려고 하는 사람이던, 클라우드를 사용하려고 하는 사람이던 클라우드는 사람과 조직에게 그에대한 경험을 익힐 시간을 필요로 할 것이다.  이러한 시간에 충분히 마이그레이션, 어플리케이션의 구조에 대해 고민하지 않는다면, 클라우드의 사용은 오히려 당신의 조직에 관리하기 어려운 비용만 많이 나가는, 골칫덩이 시스템이 될 것임을 보장한다.

그리고 여담이지만, 기술 매니저가 반드시 그 조직 내에서 정리를 해야 할 사람이 있다면, 그건 클라우드와 가상화 이야기를 듣자마자 그 플랫폼에 오라클 RAC 를 구성하자고 떠드는 사람일 것이다.


 
세상은 브라우저를 중심으로 빠르게 발전하고 있다.  클라우드만큼 중요시 보아야 할 것들이 바로 모든 플랫폼에서 동작하는 브라우저의 발달이다.  결국 클라우드 - 브라우저 발달은 서로 불가분의 관계로 결합되어 있어,  웹의 어떠한 형태가 다수의 플랫폼에서 접근하는 서비스성이 있는 수많은 고객들이 브라우저의 형태로서 제품을 체험하게 될 것이고, 이러한 웹의 형태에 대해 이해를 하고 클라우드에 대해 이해를 하여 이 맞물리는 접점에 대한 설계에 대한 고민을 할 줄 아는 사람들이 모여야만 수많은 그야말로 수억의 데이터를 처리 할 수 있는 모델이 나타나게 될 것이다.  사실, 사업하는데 처음부터 이런 기술적 고려를 할 필요는 없다.  사업성과 고객유치가 우선이며, 이러한 것들이 충족되고 기획단계에서 이런 확장성에 대한 고려를 마일스톤에 넣기만 한다면 문제 될 것은 많지가 않다.  다만 내가 말하는건, 개념없이 요새같은 세상에 오라클 웹로직 때려박을 생각은 좀 자중하고, asp 코딩하는것도 좀 참아 주길 바랄 뿐이며, 웹에 종사하는 사람이면 적어도 CDN 과 NoSQL, Reddit 같은 것들만 조금 고려해 주면 된다는 말이다.

삼천포로 빠졌는데,  브라우저는 역시 중요하다.  그리고 각 플랫폼 별 공통으로 동작 가능한 어떠한 형태의 코드나 프레임웍들도 중요하다.  이런 기술들이 클라우드와 연계되는 것도 중요하다.  당신이 Comet 으로 설계된 백그라운드 트랜젝션 로직을 RESTful 하게 구현했으면, Jetty 같은 웹 서버를 클라우드에서 어떻게 돌려줄 것인가 하는것도 고민해야 한다는 말이다.  그렇기 때문에 서로다른 직군이 클라우드를 만드는 사람들 처럼 클라우드에서 돌릴 서비스를 만드는 사람들에게도 중요하게 되는 것이다.


글재주가 많이 없어져서, 전체 글을 관통하는 주제를 통일성있게 설명할 능력도 없는것 같다.  굳이 말하자면, 클라우드라는것은 모두에게 중요하고, 클라우드에서 돌릴만한 대용량 서비스를 만드는 부분이나 클라우드를 만드는 부분이나 이제는 새로운 형태의 협업을 요구하고 있다.  이러한 협업과 기술에 대한 이해없이는, 국내에서는 절대로 Amazon / Facebook 서비스가 나타 날 수 없을 것이다.  아류는 판 칠 수 있을지라도.


클라우드는 기업 경제/기술/문화 등 많은 측면에서 다룰만한 주제가 많은 핫 아이템이다.  모두 다 다룰 수는 없는 일이고, 그럴만한 글재주도 되지 않지만,  그 구현의 방법처럼 많은,  말 그대로 '구름처럼 많은' 무엇을 만들기 위해 또 그런 양의 데이터가 움직이는 세상에서 당신이 뭘 해야 할지는 생각해 볼 필요가 있지 않나, 싶다.


몰래_똥싸는_IT인.jpg



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




HPC in the KT Cloud, and CHEF

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


개인적인 사정과 몇몇가지 머리 복잡한 일들이 최근에 겹치게 되면서 블로그에 많이 소흘했었다. 지난회에 연재하기로 한 Chef 코드도 작성하다가 말아버리고 끈을 놓아 버리게 되어서 다시시작하려면 한동안 시간을 투여 해야 본 궤도에 올릴 수 있을 것 같다.  뭐, 그다지 어려운 코드들은 아니지만...

뭐 쉬어가는 페이지 처럼, 금일은 조금 뚱딴지 같지만 조금 있으면 런칭될 KT 의 클라우드 서비스가 잘 사용될 수 있을만한 분야 중 하나를 소개하고자 한다.  구체적인 런칭 일자가 언제일지는 모르겠지만, 아마존의 EC2 와 비슷한 스타일의 컴퓨팅 클라우드를 제공 할 예정이다.  물론, 여기서 소개하는 내용은 아마존 EC2 에서 사용 될 수 있거나, 이미 사용 되고 있는 내용이다.


우리가 주변에서 쉽게 접하지만 실제 일반 고객에게는 잘 알려지지 않은 분야들 중에는 굉장히 높은 컴퓨팅 리소스를 요구하는 분야들이 있다.  이를 테면 "쿵푸팬더", "슈렉" 등과 같은 3D 실사 애니매이션이라던가, 수집돤 온도, 습도, 대기압 등의 자료를 기반으로 수학 모델로서 시뮬레이션 하는 일이라던가, 정유/화학 또는 신소재 개발 부분등에서 사용되는 분자/화학 시뮬레이션 및 기타 전통적으로 컴퓨터가 사용 되어야만 하는 모든 분야들이 소위 말하는 HPC , 즉 High Performance Computing 의 범주로 넣을 수 있는 분야들이겠다.  

기존의 일반적인 서비스 시스템을 사용하는 기업 입장에서도, 또 위와 같은 일반적이지 않은 시스템을 구비하고 있는 기업 입장에서도 클라우드는 매력적일 수 밖에 없다.  전자에게는 기업이 직접 운용 하는 것 이상의 시스템 가용성과 확장성을, 후자에게는 단시간 내에 저렴한 비용으로 최대한의 컴퓨팅 파워를 얻을 수 있는 점이 바로 그렇다.  이전에는 기상청에서 슈퍼컴퓨터를 어마어마한 규모의 비용으로 구매를 해야 했지만, (라이브러리 및 기존 어플의 포팅이 가능하다는 전제하에) 이제는 시간당 몇백원 또는 몇십원 하는 클라우드의 인스턴스를 계산에 필요한 시간만큼 필요한 수량으로 생성하여 계산에 사용하고, 종료 되면 인스턴스를 끄거나 지워 버리면 된다.  Compute Node 는 그 자체로 이미 Temporary 한 성향을 가지고 있기 때문에, Master Node 및 계산 결과 등이 저장되는 노드를 적절히 배치 하였다면 이런식의 저렴한 컴퓨팅 파워의 사용이 이롭지 않을리가 없다.

실제 이러한 HPC 컴퓨팅의 특성은 다음과 같다고 할 수 있다.

1. 시스템 구조적 모델이 비교적 단순하다.
2. 결과값을 만들어 내는 어플리케이션의 최적화에 효율성과 비용이 연계되어 있다.
3. 시스템적 구조 보다는 컨텐츠 ( 계산식 또는 렌더링 하게 될 Scene ) 가 매우 중요하다.
4. 어플리케이션에 따라 컴퓨팅 노드에 요구되는 구조가 다를 수 있다.


또한, 이러한 HPC 클러스터들은 단순하게 보면 다음의 구조적인 공통점을 가지고 있다.

1. Job Queuing 또는 Job Orchestration 이 중요하다. 보통 이런 역할을 담당하는 노드를 마스터 또는 메인노드라 한다.
2. 마스터 노드와 연계되어 실제 죽어라 계산만 담당하는 컴퓨팅 노드들. 컴퓨팅 노드의 적절한 수량 산정 및 필요에 따라 MPI 와 같은 형태로 컴퓨팅 노드간에 적절한 수량으로 클러스터를 구축 해 줄 필요가 있을 수 있다.
3. 결과 값을 저장하기 위한 공용 스토리지.
4. 어플리케이션에 따라 결과값을 파싱하여 Db 화 할 필요가 있을 수 있다.

위에서 이야기한 기능을 구현하기 위해서는, 고전적인 베오울프 프로젝트를 따라해 보자면 다음과 같은 것들을 준비해야 했다.

0. 계산에 필요한 물리적 서버. ( 필요에 따라 수십 ~ 수백 또는 그 이상 )
1. PXE Boot / DHCP
2. system image ( Optimized for application / Hardware )
3. Bootstrap
4. NFS / DB / PBS like Queuing System.

다른 것들은 고사하고 물리적 서버의 준비에 어마어마한 비용이 들어간다는 것은 잘 알것이다.  여기에 각종 라이센스.

분자/화학 분야에서 사용되는 어플리케이션의 경우 예를 들기가 다소 곤란하므로 일반적으로 생각 할 수 있는 렌더링 팜이나 MPICH 클러스터, 또는 HDR ( High Dynamic Range ) 이미지를 수만장을 생성/ 자료화 해야 하는 경우등을 생각 해 볼 수 있겠다.  시스템의 구조가 단순하며, 동일 목적의 노드가 많은 동시에, 해당 노드들의 라이프 사이클이 짧고 재사용성이 요구되는경우, 우리는 이러한 시스템의 구현에 무엇을 생각 할 수 있는가?  바로 그렇다. 자동화 툴, Chef.
물론 CFEngine 이나 다른 툴을 사용하여도 무방하다.  다만 나는 Chef 가 편하기 때문에. 
이러한 경우에는 심한경우 Cookbook 1개로도 처리가 가능하다.


예를 들자면, 일반적으로 많이 사용되는 3Ds MAX 의 경우, Windows 만을 지원한다. ( WINE 은 접어두도록 )  물론 내가 지금 3DS MAX 의 라이센스를 가지고 있는 것은 아니어서 스크린샷을 찍게 되지는 못하겠지만, 보통 다음의 순서로 환경의 구성이 가능해진다. ( MAYA 및 기타 다른 툴도 대부분 동일한 구성 )

0. 렌더러 및 배치 또는 큐잉 또는 오케스트레이션 설치 및 설정을 위한 Chef 코드 및 서버를 준비한다.
1. 돈내고 Instance 를 필요한 수량만큼 만든다.
2. 작업용으로 사용하는 워크스테이션에 VPN 환경을 구성한다. 물론 서버는 클라우드 안에 있다.
3. 생성된 인터페이스에 Chef 구동을 위한 환경을 준비한다.
4. Computing 노드에서 적절히 Chef 를 구동한다.
5. 사용한다.

위의 0 ~ 5 와 같은 작업은 만약 3D 툴로 Blender 를 사용한다면 쉽게 오픈소스만으로 구성이 가능하다.
렌더링 팜이 아니라, 계산식을 위한 노드의 사용으로서도 위의 0~5 의 시스템 구성 순서에는 큰 차이가 없다.

예전에는 1대의 워크스테이션을 구매하여, 포트폴리오 또는 양질의 영상을 만들기를 원하는 개인 또는 영세 사업자가 1분 이상의 동영상을 만드는건 굉장한 일이었다.  렌더링 시간을 위해 프레임을 아껴야 했고, 플러그인 등 각종 화려한 기법들을 눈물을 머금고 삭제해야 했으며 그렇게 힘들게 만들어낸 영상은 당연히 맘에 들지 않을 수 밖에 없었다.  어마어마한 비용과 쓰러지는 감가상각비를 가진 서버로 구성된 렌더링 팜을 소유하는 대신, 이제 쉽게 "클라우드" 라는 자원을 활용함으로서 약간의 지식만 있으면 수억원을 들이지 않고도 양질의 결과를 얻게 될 것이다.

실제 서비스를 런칭 해 보면 알 일이지만, Amazon 의 EC2 와 같은 컴퓨팅 서비스가 국내에 대규모로 런칭 되는것은 매우 환영할 만한 일이다.  물론 기존의 호스팅 업계에서는 문제가 될 수 있긴 하겠지만,  개인 및 각 기업의 다양화 되어있는 서비스 요구사항을 충족하기에는 기존의 호스팅이 다소 버겁거나 제한적인 요소가 있어왔던 것도 사실이기 때문에, 충분한 성능및 사용성에 대한 부분들만 검증 된다면  많은 기업에 비용을 획기적으로 줄일 수 있는 서비스가 될 것이기 때문이다.

다만, "오~ 클라우드 죽이는데" 하는 태도로 자신들의 솔루션에 대한 검토없이, 즉 마이그레이션에 대한 사전 준비 및 고려 없이 무작정 달려든다면, 분명 2중으로 지출되는 비용에 클라우드는 마법의 양탄자가 아님을 깨닫고 물러서게 될 수 밖에 없다.  마찬가지로, HPC 에는 수많은 어플리케이션이 있고, 경우에 따라서는 그 구조 자체가 다소 복잡 해 지거나 추가적인 어플리케이션의 개발이 필요 할 수 있다.  이런점을 모두 인지 하고 가능성을 충분히 검토한다면,  클라우드는 저비용, 고성능, 고가용성으로 사장님 및 팀장님을 미소짓게 만들 수 있을 것이다.


위에서 대략 설명한 내용들에 대한 구성을 실제 문의 받고 싶다면, 본 블로그에 적혀진 메일 주소로 이메일 주시면 가용한 범위 내에서 충분히 설명 드리겠다.


다음의 Amazon EC2 페이지 참조 및 관련 Case Study 를 찾아보면 많은 자료를 얻을 수 있다.
http://aws.amazon.com/ec2/hpc-applications/

NASA JPL  Image Processing in the Cloud
http://aws.amazon.com/solutions/case-studies/nasa-jpl/

Ushering Biotech Firms into the Cloud ( from hpcinthecloud.com )
http://www.hpcinthecloud.com/blogs/Ushering-Biotech-into-the-Cloud-115020599.html?utm_source=twitterfeed&utm_medium=twitter

설명 하려던 바와 비슷한 형태의 HPC 솔루션
http://www.cyclecomputing.com/products/cyclecloud/overview

Molecule Related Work case in Cloud
http://aws.amazon.com/solutions/case-studies/pathwork-diagnostics/

그나저나 코드 쓰던거 마저 써야 하는데... 이게 시간이 영...;;;

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

Build Automated Infrastructure with Chef - Chapter 2

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

지난번에 이야기 한 대로, 금일은 다음과 같이 구성된 시스템을 chef 를 통해 자동화 하는 과정을 살펴보겠다. 
빠른 코드 작성을 위해서 대부분의 코드는 OPSCODE ( http://www.opscode.com ) 으로 부터 가져왔으며, 가져오는 방법은 아래에 설명한 대로 진행하면 쉽다. 



지난번에 설명한 초간단 쇼핑몰의 인프라의 추상화는 대략 아래와 같은 모양일 것이다. 물론 성능의 향상이나 사용하고 있는 코드의 구조에 따라 자잘한 구성은 충분히 변경 될 수 있으며, 물론 이것보다 훨씬 좋은 구성도 얼마든지 존재한다.

Figure 1



이제 우리가 준비해야 할 내용은 다음과 같다.

1. opscode.com 의 chef 서버를 사용하거나, stand alone 서버를 만들어 망 내에 설비한다. ( chef 서버의 설치는 3호에 다루도록 한다. )
2. 필요한 package 별로 cookbook 을 다운로드 하여 서비스에 맞도록 수정하고, 필요한 것들은 만들도록 한다.
3. knife 툴을 사용하여 생성된 cookbook 을 업로드 하고, 이를 테스트를 수행할 노드에서 이상이 없는지 코드를 실행, 서비스가 정상적으로 동작하는지 확인한다.
4. 각 서버에 OS 를 설치하고, chef-client 구동 환경을 준비하여 미리 지정된 role 을 사용하여 서버를 셋업한다.


1. 번의 내용을 진행하기 위해, 다음을 수행한다. ( opscode 의 chef server 를 사용하여 진행하는 경우 )
설명되는 절차는 다음의 wiki 페이지에서 그대로 따라 할 수 있다.
 - http://wiki.opscode.com/display/chef/Quick+Start#QuickStart-SetupanewChefClient

a. Cookbook 개발 및 배포에 사용할 VM 을 준비한다.  현재 사용하고 있는 데스크탑 또는 노트북의 VMWare 또는 VirtualBox 등으로 준비하면 된다.  사용하는 Linux 배포판은 Ubuntu 나, CentOS 등 일반적으로 많이 사용하는 배포판으로 준비 하도록 한다.  지난번에 Ubuntu 로 설명 했으니, 이번에는 CentOS 한번 간다. ㅎ

b. http://www.opscode.com 에 계정을 등록하고, 가입한다.
   - https://cookbooks.opscode.com/users/new

c. 가입 후, 우측 상단에 보이는 ID 를 클릭하면 나오는 페이지에서 key 를 다운 받는다.
  

ID Section



Get a new Private key


d. http://manage.opscode.com  으로 이동하면, Organization 탭이 보일 것이다.  적당한 이름으로 생성하고, 역시 동일하게 key 를 다운 받는다.  또한, 바로 옆에 있는 knife.rb 파일도 다운 받도록 한다.

e. 다운 받은 세개의 파일이,  id.pem  //  organizationname-validation.pem // knife.rb  인지 확인한다.

f. 설치해 둔 CentOS VM 에서, root 계정으로 다음을 실해하여 chef 가 구동 될 수 있는 환경을 구성한다.

# sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

# sudo rpm -Uvh http://download.elff.bravenet.com/5/i386/elff-release-5-3.noarch.rpm

위의 패키지 인스톨은 적절한 ruby 버전을 설치하기 위한 몸부림으로 보면 되겠다.

g. FQDN 을 요구하는 경우가 많으므로, /etc/hosts 를 수정하여 훼이크를 준다. vi /etc/hosts
..
...
10.0.0.111   someone.hohoho.com


h. 안락한 사용을 위하여 yum 으로 필요한 패키지를 설치한다.
# yum install git chef -y

i. 모든 패키지의 설치가 끝났다. 이제 루트가 아닌 적절한 사용자 계정으로 전환하고,  기본 chef-repo 를 opscode.com 의 github 로부터 가져온다.
# su - USERID
# cd ~
# git clone git://github.com/opscode/chef-repo.git ~/chef-repo

j. 자, 이제 아까 받아 두었던 3개의 파일을 다음의 위치에 집어 넣는다.
@ mkdir -p ~/chef-repo/.chef
@ cp -r OPSCODE_USERID.pem VALIDATION.pem ~/chef-repo/.chef/
@ cp -r knife.rb ~/chef-repo/.chef/

k. 모든 절차가 정상적으로 진행 되었다면, 다음과 같은 커맨드를 때려 다음과 같은 메세지가 잘 나오는지 확인한다.
@ knife node list
[

]

위와 같이 나온다면, 일단 사용자 인증에는 문제가 없는 것이다.  여기서 Authentication Error 를 밷어 낸다면, 받아 온 사용자아이디.pem 파일이 정상인지 확인하도록 한다.

l. 위의 내용이 정상 동작 한다면, 이제 client 로서의 등록을 위해 다음의 과정을 진행한다.
@ cd ~/chef-repo
@ knife configure client ./client-config
@ sudo mkdir -p /etc/chef
@ sudo cp -r ./client-config/* /etc/chef/
위의 커맨드는 client 등록을 위한 validation.pem / client.rb 파일을 생성하며, 이 파일들은 chef-client 의 기본 설정파일 참조 위치인 /etc/chef 디렉토리에 넣어 준다.

m. 위와 같이 모두 준비 되었다면, 다음의 커맨드로 정상적으로 클라이언트 등록이 되는지 확인하도록 한다.
@ sudo chef-client

[Wed, 13 Oct 2010 18:39:26 +0900] INFO: Client key /etc/chef/client.pem is not present - registering
[Wed, 13 Oct 2010 18:39:31 +0900] WARN: HTTP Request Returned 404 Not Found: Cannot load node localhost.localdomain
[Wed, 13 Oct 2010 18:39:36 +0900] INFO: Starting Chef Run (Version 0.9.8)
[Wed, 13 Oct 2010 18:39:37 +0900] WARN: Node localhost.localdomain has an empty run list.
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Chef Run complete in 3.40439 seconds
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Running report handlers
[Wed, 13 Oct 2010 18:39:39 +0900] INFO: Report handlers complete
모두 정상적으로 수행이 되었다면, Report handlers complete 라는 메세지를 확인 할 수 있다.
또한, /etc/chef/client.pem 파일이 생성되는데, 이는 validate.pem 키를 기반으로 서버에서 인증을 받고 생겨난 새로운 클라이언트 키이다.   이 키는 해당 노드에서 계속 사용되므로, 실수로 지워먹거나 하지 말도록 하자.

역시 이 부분에서도 인증 관련 문제가 발생 하는 경우를 많이 봤는데, 이는 매번 똑같이 설정해도 잘 안되는 경우가 있고, 또는 기존에 한번 등록했던 노드를 다시 등록 하려는 경우 등 몇가지 쉽게 발생하는 휴먼에러들이 있다.
이럴떄는, manage.opscode.com 에 가서 Organization 의 키를 다시 생성하여 다운 받고, 해당 키를 .chef 디렉토리에 넣어 준 후에 다시 knife configure client DIR 을 수행하여 발생한 키를 /etc/chef 에 넣어 준다.  이때, client.pem 파일이 /etc/chef 디렉토리에 있다면 반드시 지워주도록 한다.

o. 위의 모든 과정이 완료 되었다면, 다음의 커맨드로 본인의 VM 의 내용이 나타나는지 확인해 본다.
# knife node list
[
  "domU-12-31-38-04-6C-92.compute-1.internal",
  "localhost.localdomain"
]
# knife client list
[
  "domU-12-31-38-04-6C-92.compute-1.internal",
  "localhost.localdomain",
  "younjinjeong_org-validator"
]

p. 역시, http://manage.opscode.com 에 자신의 계정으로 로그인 하면 현재 붙어있는 노드 및 해당 노드에서 수행하는 프로세스 및 MAC 정보 등 많은 시스템 정보를 확인 할 수 있다.  이는, 향후 관리를 용이하게 하며 각 노드에서 수행해야 할 cookbook 및 run_list 를 서버측에서 관리함으로서 필요시에 원하는 형태로 패키지 설정 및 노드 검색 등이 가능하다.
이는, ohai 라는 chef 가 설치 될 때 함께 설치되는 util 에서 나타나는 output 과 같으며, 쉘에서 수행 가능하므로 직접 수행하여 어떤 내용을 나타내 주는지 확인 해 보면 되겠다.



자, 이제는, knife 를 통해 opscode.com 에 생성된 나만의 chef 서버와 api 통신이 가능해 진 것이다.  이후 opscode 로 부터 이미 생성된 cookbook 을 자유롭게 받아 수정하고, 업로드하여 새로운 노드에 반영하면 될 것이다. 위에 일부러 굵게 볼드체로 해 놓은 2번의 내용은 제법 기니깐, 한두어 가지의 cookbook 을 knife 를 통해 다운로드 하고, 이를 수정하여 노드에 직접 적용해 보는 것으로 마무리 하며, 나머지는 향후 3부에 올려 놓을 github.com 링크를 통해 코드를 확인 하시면 되겠다.


a. cookbook 의 download.  다운 로드 가능한 cookbook 의 리스트는, 다음과 같이 확인이 가능하다.
# cd ~/chef-repo
# knife cookbook site list
마치 yum search 한 것마냥 쿡북이 줄줄이 나오는데, 이는 OPSCODE 에서 미리 작성해 둔 코드들이다.  이 코드들의 라이센스는 각 소스에 적혀있으므로, 미리 확인하도록 하자.  Aaron Peterson씨 의 말에 따르면 아파치 라이센스라지만, 각자 확인하여 미리 문제가 없도록.

b. 확인한 cookbook 은 다음과 같은 형태로 다운로드가 가능하다.
# knife cookbook site vendor COOKBOOK_NAME -d
커맨드 설명만 하는  것 같아서 기분이 좀 그런데, knife 커맨드의 각 2열까지는 type 후 그냥 엔터를 쳐도 대략적인 help 정보를 볼 수 있으며, 이후에는 --help 를 붙여 주시면 되겠다.

c. 다운로드 한 Cookbook 은 아직 각 노드에 배포 될 수 있는 형태가 아니며, 이를 위해서는 다음과 같은 작업이 필요하다.
/* Upload  All Cookbook */
# knife cookbook upload -a

/* Specify a cookbook to upload */
# knife cookbook upload COOKBOOK_NAME 

d. 이렇게 업로드된 쿡북은, run_list 또는 role 로 정의되어 선택된 노드에서 동작 할 수 있게 된다. 노드의 추가 및 run_list 추가는 조금 이따가 보기로 하고,  여기까지 그냥 따라 했다면 이제는 이 Chef의 Server - Client 시스템 및 쿡북의 생성 및 적용, 배포에 관한 사이클에 대해 이해 할 필요가 있다.

Cookbook Life cycle


대략 이런 흐름으로 Cookbook 을 유지한다.  PPT 를 발로 그린건 너그러이 용서를 바람.  집에 가고 싶어서 ㅠㅠ

실제 업무를 한다면, 이런 그림이 되지 않을까 싶다.
어쨌든 개발 및 배포 프로세스는 위와 같으며, 이제 실질적으로 cookbook 을 살펴 보기로 하자.

knife cookbook site list 해서 나온 것 중, 이번 쇼핑몰 구성에 필요하거나 있는 쿡북은 모두 내려 받는다.
# for i in apache2 cron eaccelerator heartbeat iptables mysql nagios nginx rsyslog rsync ; \
do cd ~/chef-repo ; knife cookbook site vendor $i -d ; done
이상한 현상중의 하나가 어떨때는 tar.gz 으로 쿡북이 오거나 또는 압축이 풀린상태로 cookbook 디렉토리에 이쁘게 잘 들어가기도 한다.  아마, knife 의 옵션에 뭔가 있을 것 같은 생각이므로 궁금하신 분들은 wiki.opscode.com 을 참조.

위의 목록에서 빠졌거나 또는 기본으로 실려오는게 좀 부족하거나 볼륨이 너무 큰 감이 있다면 다음과 같이 비어있는 쿡북을 만들도록 한다.
# knife cookbook create COOKBOOK_NAME

e. 자 이제 많은 부분이 준비 되었다.  이제는 Cookbook 자체를 수정하는 일만 남았다.

Cookbook 을 수정하기 위해서는, 먼저 chef 의 디렉토리 구조를 알아야 할 필요가 있다.
쓰다보니 제법 길어져서, 이제 3회를 향해 가야 할것 같은 분위기. ㅋ


KT 회의실에 혼자 쭈그려 있기 좀 민망하므로 오늘은 여기까지.


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


Build Automated Infrastructure with Chef - Chapter 1

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

최근 클라우드가 부각되면서 자연스럽게 이슈가 되고 있는 것이 바로 자동화된 인프라스트럭처의 구성이다. 이미 지난번에 CHEF-101 코드를 통해서 한번 소개 한 적이 있는데, 이렇게 다시 소개하게 된 데에는 여러가지 이유가 있지만 일단 요모 조모 사용해 본 결과 아주 쉽게 시스템을 빌드 할 수 있고, 루비 기반으로 작성된 코드의 적응 시간도 매우 짧아 그 사용이 매우 편리함에도 불구하고 국내에서는 아직 넓게 사용되지 못하고 있는게 안타깝기 때문이다.

물론, 예전부터 사용하던 고전적인 cfengine 과 같은 툴 또는 상용이라면 IBM 의 Tivoli 를 기반으로한 z/OS 시스템 오토메이션을 필두로 각종 시스템 자동화를 모토로 하는 다양한 가격의 상용 시스템 자동화 툴이 있다.  이 툴들의 특징은 하나같이 써먹기가 어렵거나, 또는 설정의 변경이 용이하지 않은 시스템 관련 업무 그 자체의 특수성 등으로 인해 도입이 쉽지 않은 것이 사실이다.  또한, 일부 대규모의 호스팅 업체 또는 수백, 수천의 서버를 동일 목적으로 구현할 필요가 없다면 굳이 열대 스무대 돌리는 업장에서 시스템 관리자 섭외도 쉽지 않을 진데 자동화야 당연히 소원할 수 밖에 없다.

현실이 비록 이렇다 할 지라도, 엔터프라이즈 레벨의 인프라 또는 각종 대기업 환경, 대규모 HPC 클러스터 및 클라우드 인프라에서는 자동화를 빼고서는 할 말이 없다. 자동화가 가져다 주는 BOX (서버) 자체의 서비스에 대한 Plug & Service 및 Hot swap 의 특혜는 5대의 서버만 구성하게 되더라도 어마어마 한 것이다.  하물며 수천대의 서버를 항상 가동시키거나, 또는 계속 deploy 해야 하는 상황이라면 이런 자동화 툴은 아니라도 적어도 OS 이미지 복사 또는 자동 설치 CD 정도는 만들어서 사용해야 하는게 정신건강 및 관리에 이롭지 않겠는가.

이런 경우도 생각 해 볼 수 있다.  수백/수천여대의 서버가 위치한 센터가 어떠한 이유로 사용 불가능 하게 되었을 경우, 동일한 용도의 시스템군을 다시 빌드 해야 한다고 하면 과연 당신이 지금 운용중인 서비스는 몇일이 소요되겠는가.
전통적인 방식으로 생각 해 보면,  ( 적어도 배포서버는 있는 경우 ) 하드웨어 및 네트워크 구매, 설치, 케이블링 시간을 제외하더라도 십수여일 또는 IP 변경으로 인한 개발팀등과의 확인/연동이 필요한 경우 길면 수개월도 걸릴 수 있다.
이러한 경우 공통적으로 적용 할 수 있는 자동화 툴이 있다면, 케이블링이 끝난 시점에서 적어도 수시간 내에는 완전히 다른 지역에 서버의 deploy 가 가능하며, 이때 신경써야 할 것은 오로지 DB 데이터의 무결성과 같은 크리티컬 한 부분일 뿐이다.

이런 자동화 툴의 필요성에 대해 이미 인지하고 계실진대 굳이 졸린 눈 부벼가며 영 어색한 문장으로 다시 끄적이는 이유는 Chef 만 보거나 또는 시스템/서비스를 미시적 관점에서 접근하게 되면 결국 이런게 왜 필요하게 되었는지를 모른 채 시스템 변경 사항이 발생 될 때마다, "아 이거 그냥 적용하면 되지 뭘 이렇게 만들어 놓았나" 하는 생각을 떨칠 수 없을지도 모르지 않겠나 하는 노파심 때문이라 치자.  ( >.< )  어차피 내 블로그 내맘... ;;;


우야 둥둥 잡설이 길었다.  본론으로 들어가자면,

다음과 같은 쇼핑몰 서버를 오픈 소스 솔루션을 통해 가상화 또는 실제 물리적 서버군으로 구성했다 치자. 싸니깐. ;;

- 웹 서버 몇 대.
- 웹 어플리케이션 서버 몇 대.
- 결재 전용 서버 두어 대.
- 이미지 전용 서버 몇 대.
- 데이터 베이스 서버 또는 서버 군.
- 웹 서버 또는 웹 어플리케이션 서버 간 세션 공유를 위한 memcached / repcached 서버 두어 대.
- 웹 소스 및 이미지 공유를 위한 NAS 두어 대.
- 로그 및 모니터링 서버

쇼핑몰 잘 나가나 보다. ;;;

뭐 어쨌든, 위와 같은 서버군을 생각 해 보았을때 오픈 소스로 구성한다면 대충 필요한 패키지는 다음과 같으시겠다.

- nginx / lighttpd   :  이미지 또는 단순 파일 배포 서비스  또는 reverse proxy
- httpd ( apache2 ) / php5 / resin / web logic / zeus :  java, php 등을 사용하는 각종 어플리 케이션 중 1종. (물론 일부는 오픈소스 아님 ㅋ )
- nexenta 또는 opensolaris 기반 또는 일반 리눅스의 NFS 
- repcached
- mysql / PostgreSQL , 돈 많거나 DB구조, SQL 구리면  Oracle RAC
- L4 를 사지 못할 정도로 가난할 경우 LVS / ipfwadm  /  heartbeat
- 방화벽을 구매하지 못할 정도로 가난한 경우 iptables 및 openvpn
- rsyslog / nagios
- notification sms 발송 솔루션 ( 이건 업체에서 제공하는걸 쓸 밖에. 일본에서는 폰메일이 있으므로 postfix 로 쉽게 가능 ㅠㅠ )
- notification email 발송 솔루션
- 가상화로 구성하는 경우  Xen 꽁짜/상용 서버 또는 vSphere , 또는 kvm
 

리소스를 대충 늘어놓고 보니 수량이 좀 된다. 하지만!  우리가 필요한 또는 많은 업체에서 사용하는 대부분의 오픈 소스들이 전부 들어있다.  오픈소스 많이 없다고 걱정 안해도 된다.  구성도를 그려서 올리면 더 좋을텐데, 그건 나중에 하겠다.  집에서 쓰는 맥에 구성도 그릴 만한 툴이 대략 없다. ㅠㅠ

자, 원래는 chef 로 간단히 파일 생성 및 패키지 설치만 보여줄려고 했는데 일이 너무 커져 버렸다.  모른다. 오늘 다 못쓰면 내일 써도...;;  어차피 구성도나 그림도 없... ;;;


Chef 를 자동화 툴로 사용하기로 했다면, 또는 Chef 이외의 것들까지 생각해 보자면, 다음과 같은 계획을 준비해야 된다.

1. pxe boot 및 dhcp 등을 굴려서 쌩 하드웨어에 자동으로 OS 를 올릴 것인가.
2. Chef 를  Server - Client 모델로 굴릴 것인가 Chef-solo 를 사용 할 것인가.

서버 수량의 증가 가능성이 거의 없거나 또는 매우 드물어 관리자가 OS 설치를 재미로 해도 된다면 굳이 OS 자동 설치까지는 신경쓰지 않도록 한다.  이건 나중에 화학 계산을 위한 PC GMESS 를 사용한 HPC 클러스터용 마스터 노드 제작때 보여주기로 한다.  역시 대규모가 되어서 MAC 주소가 걔가 뭐였더라 할 정도 아니면 Chef 도 서버 클라이언트는 필요 이상으로 복잡 해 질 수 있다.  그래도, 하는게 하지 않는 것보다는 좋으려나. 보안 이슈도 있으니깐.

1번을 무성의 하게 지나쳤으므로, 순식간에 chef 단계로 넘어간다.  이때 결정해야 할 사항은 다음과 같은것들이 있다.

1. 각 서버는 어떤 용도로 활용 될 것 인가. ( Role 정의 )
2. 각 용도에는 어떠한 패키지가 필요할 것인가. ( Cookbook listup )
3. 각 서버는 서로 자주 사용되어야 할 Attribute 가 있는가. (  예를 들면, mysql 패스워드 또는 모든 서버에서 참조 될 수 있는 ssh rsa 키  또는 서버 패스워드 등 )

1번 및 2번은 위에 열거한 서버 리소스별로 다음과 같이 정리 될 수 있겠다.

Role :  webserver ,  proxy_server , image_server , db_master , db_slave , log_monitor , session , nfs_master , nfs_secondary , billing , web_application

음.. 꽤 많다.  자 이제 필요한 요리책을 펴 보면,

Cookbook :  http , nginx , mysql , rsyslog , nagios , repcached , nfs , bill, php5 ( was 는 이것으로 한다 ) , iptables , common ( 모든 서버에서 셋업 되어야 하는 공통 사항 )  , pgsql , openvpn , heartbeat , lvs

처음 접하시는 분들은 당삼 그런 생각 들꺼다.  이게 다 뭐야?  그런 생각이 드신 분들은 다음의 내용을 주시한다.

* chef 는, 기본적으로 각 호스트별로 지정된 role 을 호출하여 서버를 구성한다.
* role 은  cookbook 의 조합으로 구성되며, Cookbook 하위에는 해당 패키지를 서비스에 맞게 설정하기 위한 각종 리소스가 포함된다.  recipe , attribute , file, template , metadata 등의 리소스는 관리자에 의해 생성, 변경 되어 입맛에 맞게 구성이 가능하다.

물론, 서비스 구성에는 이러한 조건 이전에 다음과 같은 계획이 수반 되어야 할 것이지만, 여기서는 내가 대충 정한다.

- ip 및 네트워크 구성 계획
- nfs 마운트 디렉토리 위치
- 방화벽 및 vpn access 구성 계획
- DNAT 또는 SNAT 사용 여부
- 로드 밸런싱 및  용도별 이중화 계획
- 각 하드웨어 스펙 또는 가상화 서버 스펙


좋다.  다 끝났다. 

이미 시간이 밤 12시를 가르키고 있으므로,  실제 chef 코드의 작성에 대해서는 다음호에 계속...;;; 하기로 한다.
아마 3부작 정도 되지 않을까 싶다.  이런 장기 포스팅 약한데..



급하신 분들을 위해 직접 삽질이 고픈 분들 께서는 다음의 링크들을 참고 하신다.

* chef : http://wiki.opscode.com/display/chef/Home , http://www.opscode.com/
* http : http://httpd.apache.org/
* lvs  : http://www.linuxvirtualserver.org/
* repcached , memcached : http://repcached.sourceforge.net/ , http://memcached.org/
* iptables : http://www.netfilter.org/ 
* postgresql :  http://www.postgresql.org/
* nginx :  http://wiki.nginx.org/Main

나머지 php 나 mysql 등은 원체 많이 접하실 걸로 예상되어 별도의 링크는 읍다.
다음회에는, chef server 설치 및 client 설정,  실 코드 작성 및 github 를 통해 코드를 업로드 하도록 하겠다.

아 물론, 쇼핑몰 서비스를 위한 "인프라" 만을 다루며 실제 몰 서비스를 위한 코드는 알아서 해결 하시도록 한다.
난 웹 개발자가 아니니깐 ㅠ   음... 현희형이랑 준호형을 섭외 해 볼... ;;;   솔루션 하나 나올기세 ㅋ


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


Solve your IO problems with Nexenta

Techs
( younjin.jeong@gmail.com )

굉장히 오랜만의 포스팅이다.  이직도 있었고, 이직 이후 워낙 정신 사납게 달리다 보니 포스팅은 커녕 내가 내 블로그 들어오는 일도 주말의 행사가 되어버렸다.  대신, 클라우드의 구성에 대한 큰 그림과 어지간한 구조는 잡았지만. 훗;

어쨋든 오늘 소개하고자 하는, ( 이미 여러차례 소개는 했었지만 ) 이 Nexenta 라는 운영체제는 이미 알려진 바와 같이 오픈 솔라리스 기반이며, 역시 알려진 바와 같이 솔라리스 기반의 가장 큰 축복인 ZFS 를 메인으로 사용하는 스토리지로서의 사용에 그 주요 목적이 있는 운영 체제라 할 수 있다.  물론 우분투와 같은 apt 기반의 패키지 관리 시스템을 통해 얼마든지 원하는 형태로 확장이 가능 하지만,  어쨌든 난 얘는 무조건 스토리지로 쓰는게 좋다고 생각 한다.

본 운영체제에 대한 자세한 스펙은 http://www.nexenta.com 또는 http://www.nexenta.org 에서 참조 할 수 있다.
물론 서비스 셋업을 위한 몇가지 튜토리얼 및 매뉴얼 등은 매우 잘 정리 되어 있으나, 아직은 트러블 슈팅에 대한 사례가 많지 않아 국가별로 구글검색을 쌔워도 정수리가 바짝 서는 시원한 답변은 잘 나오지 않으므로 다소간의 삽질은 각오 해야 한다.

서론이 매우 무지 끔찍하게도 길었지만,  어쨌든 오늘은 다음의 사용 목적을 가지고 간단히 Nexenta 를 구성해 보고자 한다.

1. NFS / CIFS 로서의 사용.
2. iSCSI
3. 디스크 / 볼륨의 zfs 를 통한 관리.

금일 사용할 Nexenta 의 버전은 3.0.3 이 되시겠다.  ( http://www.nexenta.com/corp/free-trial-download )
먼저 주의 할 것은, 본 운영 체제가 언젠가 부터 유료화 되었기 때문에 최초 설치 이후 제품 키를 넣으라는 화면을 보고 당황 하지 않으려면 미리 위의 링크 사이트에 가입을 완료 해 두어야 한다.  메일 주소를 통해 해당 계정의 Activation 을 수행하므로, 구라로 메일주소 넣으면 안되시겠다.

다운 받아 씨디로 꿉고 ( 아 물론 VM 으로 하셔도 완죵 무방 ) 그동안 보아 왔던 수많은 리눅스 설치 화면과 비슷한 환경들이 지나가고 나면, 시스템이 재부팅 된다.
재부팅이 되고 나면 생성된 키를 하나 보여주며 제품 키를 넣으란다.  그러면 요기 http://www.nexenta.com/corp/free-trial-registration 로 가서 이전에 생성해둔 계정을 통해 로그인 하고 정보를 넣으면 메일로 상큼하게 키가 날아온다.

입력하고 나면, 콘솔 로그인 창이 떨렁 뜨는데, 물론 엑스퍼트라면 로그인 이후 진행 해도 되지만, 아니라면 다음과 같이 웹 브라우저를 통해 접근한다.

http://host_fqdn_or_ip_address:2000

자! 상큼한 웹 인터페이스가 나타나질 않는가!  여기서는 다음의 정보를 입력하도록 한다.
물론, 기억에 의존한 포스팅이기 때문에 스텝은 살짝 꼬였을 수 있으나 의미하는 바는 같;;;;

1. 기본 네트워크 정보
   - 호스트명
   - 네트워크 인터페이스
   - 네임 서버 및 ntp 서버 등의 정보
2. 볼륨 생성
   - 볼륨 생성할 디스크 및 redundant type  ( RAIDZ1 , RAIDZ2, RAIDZ3 ... cache disk , log disk , spare disk , etc )
   - 볼륨의 이름
   - 옵션  ( deduplication 및 기타 등등 )
3. 시스템 패스워드
4. 기타 폴더 ( 기존의 디렉토리나 윈도우의 폴더와는 개념이 살짝 다르다 ) 등등의 추가 설정.
5. 웹 인터페이스의 접근 포트 및 http / https 사용 여부.

대략 이러한 초기 설정 프로세스를 마치고 나면 다음과 같이 아름다운 페이지를 확인 할 수 있다.

Nexenta Web Mgmt login page



Dash board



이미 화면을 보면서 느꼈겠지만, 그렇다!  대부분의 기능을 웹 인터페이스로 제어가 가능한 것이다!
물론 웹 인터페이 말고 디테일하거나 즉각적인 반응 또는 빠른 작업을 위해 CLI 의 사용이 가능하다.  본 3.0.3 버전의 경우 원격지에서 ssh 를 사용해 로그인 하게 되면 nmc 라고 하는 콘솔이 나타난다. ( 아마도 Nexenta Management Console 일게다 ) 
본 콘솔의 경우, 네트워크 장비 특히 Cisco 나 Foundry 에 익숙하다면 아주 손쉽게 적응이 가능한 잇점이 있다.

show volume test-pool 
NAME                   SIZE    USED    AVAIL   CAP  DEDUP   HEALTH
test-pool              40.8T   395G    23.7T     0%   1.00x     ONLINE

show volume test-pool status

또한, 스위치나 리눅스 bash 에서와 같이  TAB-TAB 키 또는 ? 의 사용을 통해 사용 가능한 커맨드 리스트를 볼 수도 있다.  이는 매우 편리한 관리를 제공하지만, 거센 서비스 환경의 IO 로드가 걸린 상황에서는 충분히 답답함을 느낄 수도 있겠다.

만약, 이런 어플라이언스도 스위치 같지도 않은 툴들을 버려둔 채로 난 pure zfs 만 사용할꺼야 하시는 분들은 다음의 커맨드로 쉘 환경에 대한 진입이 가능하다.  단, 일부 커맨드를 통한 시스템 변경의 경우 관리 콘솔을 죽여 버릴 수 도 있음을 양지하고 마루타 해야 할 것이다.

option expert_mode=1
!bash

자 이제 그럼 소기의 목적인 볼륨을 생성 해 보도록 하자.

create volume
Volume                :
  -----------------------------------------------------------------------------------------------------
  Volume name must begin with a letter, and can only contain alphanumeric characters as well as
  underscore ('_'), dash ('-'), and period ('.'). The names 'mirror', 'raidz', 'log', and 'spare' are
  reserved, as are names beginning with the pattern 'c[0-9]'. Finally, don't use forward slash ('/') -
  volumes cannot be nested. Press Ctrl-C to exit.

볼륨 이름을 입력하고 넘어 간다.

Volume                :jbod-test
Group of devices      : (Use SPACEBAR for multiple selection)
 c0t5000C5002694D5C7d0  c0t5000C500269ABC4Cd0  c0t5000C50026AAE413d0  c0t5000C50026AEC48Fd0
 c0t5000C50026AF2AB1d0  c0t5000C50026AF4629d0  c0t5000C50026AF51FEd0  c0t5000C50026AF5295d0
 c0t5000C50026AF7335d0  c0t5000C50026AF83C8d0  c0t5000C50026AF868Bd0  c0t5000C50026AF8AC8d0
 c0t5000C50026AFAA3Ad0  c0t5000C50026AFABBCd0  c0t5000C50026AFB3DEd0  c0t5000C50026AFC653d0
 c0t5000C50026AFEC73d0  c0t5000C50026B05CF8d0  c0t5000C50026B13B01d0  c0t5000C50026B14848d0
 c0t5000C50026B1527Dd0  c0t5000C50026B15B4Dd0  c0t5000C50026B16446d0  c0t5000C50026B168EDd0
 c0t5000C50026B1912Cd0  c0t5000C50026B1A467d0  c0t5000C50026B39DBFd0  c0t5000C50026B3AA65d0
 c0t5000C50026B3AD21d0  c0t5000C50026B3F766d0  c0t5000C50026B40761d0  c0t5000C50026B43707d0
 c0t5000C50026B5BAB1d0  c0t5000C50026B7963Bd0  c0t5000C50026B95E99d0  c0t5000C50026BDBF9Cd0
 c0t5000C50026BDC9D3d0  c0t5000C50026BDCA9Fd0  c0t5000C50026BE37A7d0  c0t5000C50026BE37ECd0
 c0t5000C50026BE39ABd0  c0t50014EE00255D55Ad0  c0t50014EE0ACFBC293d0  c0t50014EE0ACFC807Ad0
  -----------------------------------------------------------------------------------------------------
  Select one or more LUNs to form a new group of devices in the volume 'jbod-test'. Navigate with arrow
  keys (or hjkl), or Ctrl-C to exit.
  lun id: c0t5000C5002694D5C7d0, size: 2TB, parent: mpxio

위와 같이 화살표로 선택/이동이 가능한 디스크의 목록이 나온다. 필요한 디스크들을 선택하여 볼륨을 구성한다.
친절하게 여려개를 고르려면 스페이스바를 누르란다.
선택 하고 넘어 가면,

Volume                :jbod-test
Group of devices      : c0t5000C5002694D5C7d0, c0t5000C500269ABC4Cd0, c0t5000C50026AAE413d0, ...
Group redundancy type :
 mirror  raidz1  raidz2  raidz3  pool
  -----------------------------------------------------------------------------------------------------
  Use either mirror or raidz configuration for data redundancy, and hot spares to automatically handle
  device failure. Note that while ZFS supports non-redundant configuration (option 'pool' in the set of
  choices), a single case of bit corruption can render your data unavailable. Navigate with arrow keys
  (or hjkl), or Ctrl-C to exit.
  In a mirror configuration data is replicated across all devices of the mirror

redundancy type 을 선택하란다.  다들 종류는 알고 있을테니 스킵.

Group of devices      : c0t5000C5002694D5C7d0, c0t5000C500269ABC4Cd0, c0t5000C50026AAE413d0, ...
Group redundancy type : raidz2
Continue adding devices to the volume 'jbod-test'?  Yes
Group of devices      : c0t5000C50026AF2AB1d0, c0t5000C50026AF4629d0, c0t5000C50026AF51FEd0, ...
Group redundancy type : raidz2
Continue adding devices to the volume 'jbod-test'?  (y/n)

불륨에 디스크 추가를 계속 할건지 물어온다.  추가할 생각이 없다면 n 을 상콤하게 눌러준다.

Create volume 'jbod-test'?  (y/n)

볼륨을 진짜 만들건지 물어본다.  y
누르고 나면, 볼륨이 생성되며 다음과 같이 summary 가 나타나며, auto-snap 서비스를 설정 할 것인지 묻는다.

volume: jbod-test
 state: ONLINE
 scan: none requested
config:

        NAME                       STATE     READ WRITE CKSUM
        jbod-test                  ONLINE       0     0     0
          raidz2-0                 ONLINE       0     0     0
            c0t5000C5002694D5C7d0  ONLINE       0     0     0
            c0t5000C500269ABC4Cd0  ONLINE       0     0     0
            c0t5000C50026AAE413d0  ONLINE       0     0     0
            c0t5000C50026AEC48Fd0  ONLINE       0     0     0
          raidz2-1                 ONLINE       0     0     0
            c0t5000C50026AF2AB1d0  ONLINE       0     0     0
            c0t5000C50026AF4629d0  ONLINE       0     0     0
            c0t5000C50026AF51FEd0  ONLINE       0     0     0
            c0t5000C50026AF5295d0  ONLINE       0     0     0

errors: No known data errors
NAME        SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
jbod-test  14.5T   418K  14.5T     0%  1.00x  ONLINE  -

Volume 'jbod-test' created successfully. Please take a moment to consider using default snapshot
policy for this volume. The defaults are as follows: keep 30 daily snapshots and 12 monthly
snapshots; take snapshots at 12am. Say No if you do not need to periodically snapshot the new
volume and all its folders, and/or if the defaults are not satisfactory. Note that you can
always decide later - see 'create auto-snap -h' for details.
Create default auto-snap services for 'jbod-test'?  (y/n)

나는 수동 설정할 것이므로 n , 궁금한 분들은 y 눌러서 진행 하면 되겠다.

PROPERTY              VALUE                                                
service             : auto-snap
instance            : jbod--test-000
frequency           : daily at 00:00
status              : offline* since 03:38:00
enabled             : true
state               : idle
comment             : default-service
exclude             :
keep_days           : 30
last_replic_time    : 0
latest-suffix       :
period              : 1
snap-recursive      : 1
time_started        : N/A
trace_level         : 1
log                 : /var/svc/log/system-filesystem-zfs-auto-snap:jbod--test-000.log
PROPERTY              VALUE                                                
service             : auto-snap
instance            : jbod--test-001
frequency           : monthly on 1st day of the month at 00:00
status              : offline* since 03:38:04
enabled             : true
state               : idle
comment             : default-service
exclude             :
keep_days           : 12
last_replic_time    : 0
latest-suffix       :
period              : 1
snap-recursive      : 1
time_started        : N/A
trace_level         : 1
log                 : /var/svc/log/system-filesystem-zfs-auto-snap:jbod--test-001.log

실수로 y 를 눌러버렸다. 젠장.  뭐 어쨌든 연습용이므로 패스~

이제 볼륨이 만들어 졌다.  이 볼륨에 zvol 을 생성하고 iSCSI 타겟을 설정하여 iSCSI 로도 사용이 가능하고, 또는 folder 를 생성하여 NFS/CIFS 의 파일 기반 서비스를 사용 할 수도 있다.

모두 비슷한 인터페이스이기 때문에 다음과 같이 zvol 도 생성이 가능하다.
nmc@xxxnodexx:/$ create zvol
zvol name    : jbod-test/test
  -----------------------------------------------------------------------------------------------------
  zvol pathname must start with a name of the volume, and can only contain alphanumeric characters as
  well as underscore ('_'), dash ('-'), period ('.') and forward slashes ('/'). The available volumes
  are: jbod-test, qpod1-pool1, nfs-pool, qpod1-pool2. Use forward slash '/' to separate existing volume
  or folder name from the (new) block device name, for instance: jbod-test/new_zvol. Press Ctrl-C to
  exit.


이후의 설정도 그대로 따라하면 되겠다.


물론 CLI 인터페이스로 소개하였지만, 웹 인터페이스에서도 모두 기능을 제공한다.
상단 메뉴의 Data Management -> Data Sets  에서 볼륨 및 폴더의 생성/삭제가 가능하며,  Data Management -> SCSI Target  의 탭에서 LUN / zvol 의 생성 및 삭제가 가능하다.


이러한 기본적인 기능 이외에 플러그인을 사용하면 서버 자체적으로 bonnie 또는 iometer 등을 사용하여 볼륨에 대한 벤치마킹이 가능하기도 하며,  여러대의 Nexenta 를 사용중이라면 zfs send/receive 의 기능을 확대한 auto-sync , auto-tier 등의 파일 시스템 복제 및 autocdp 를 통한 블럭레벨의 복제까지 가능하다.

한가지 더 알아 두어야 할 것은, Nexenta 에서의 폴더의 개념이 약간 특수한데, 이는 단순 mkdir 로 생성되는 것이 아닌 NFS/CIFS/RSYNC/FTP 등의 서비스를 손쉽게 설정이 가능하도록 하는 또 하나의 단위라고 생각 하면 된다.
단순히 NFS 서비스만 제공하고자 한다면 서버를 설치하고 볼륨 생성 -> 폴더 생성 -> NFS 탭에 체크 -> 간단한 권한 설정 을 통해 바로 NFS 서비스에 투입이 가능하다.


스크린샷을 많이 찍고 싶었으나 여건이 허락하지 않아 대충 넘어 가지만, 거의 대부분의 기능들을 커맨드 라인 인터페이스로 설정하는것이 더 재미있다.  초기 설정에 필요한 아주 간단한 것들만 적어 보자면,

# 인터페이스 설정 확인
$ show network interface igb0
# 인터페이스 설정
$ setup network interface igb0
# 인터페이스 링크 확인
$ show network devices
# 기본 게이트웨이 확인
$ show network gateway

CLI 체계는 간단해서, show 를 setup 으로 바꾸면 보기/설정 으로 변경 된다고 생각하면 매우 쉽다.



서비스를 구성하면서 언제 힘든것이 IO 이다.  아무리 고민해도 나쁘지 않은 부분이며, 통상 병목이 매우 일찍 오는 구간이므로 NetApp 또는 EMC 등의 벤더와 또 리눅스 상에서의 각종 파일 시스템, 그리고 이런 오픈 솔라리스 기반의 여러 장치를 테스트 해 보는 것은 매우 의미 있는 일이라 하겠다.

모두 재미난 테스트 하시길!


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