경험과 실패

출판단지에는 목이 긴 새들도 날아다닌다. 황새인지 두루미인지, 이름은 모르겠고.

목이 긴 새들은 어떻게 날아다닐까? 상상을 해보자면 여러 가지 방법이 가능하다. 목을 쭉 펴고 날아갈 수도 있겠고, 위로 살짝 굽히던가, 아래로 살짝 굽히던가, 목에 착 붙이던가. 실제로 날아가는 모습을 보니, 목을 S자 모양으로 접어 몸에 착 붙이고, 고개는 정면으로, 긴 주둥이는 바람의 방향으로 뻗고 날아가더라.

그 광경을 보며, 생각하는 것과 경험하는 것은 다르다는 사실을 다시 깨달았다.

일을 계획할 때는 상상하고 결과를 시뮬레이션하고, 바로잡고 다시 결과를 시뮬레이션하고 – 이 작업을 반복한다. 하지만 경험할 때는 시뮬레이션과 비교할 수 없는 다양한 결과를 여러 감각으로 느끼게 되고 많은 변수에 대응해 방향을 바로잡을 수 있다. 계획할때는 상상하지 못했던 변수들도 다수 나타나기도 하고.

물론 그러다가 성공할 수도 있고, 실패할 수도 있다. 하지만 결과가 성공이건 실패건 간에, 경험해봤다는 사실은 굉장히 중요하다.

우리 사회는 승자에게 열광하지만, 성공 여부에 관계없이 필사적으로 시행착오를 경험해본 사람에게는 그걸 해보지 않은 사람은 모르는 배울 점들이 있다.

경험의 가치가 존중받는 사회가 되길 바란다.

근황

기록 겸 남겨놓은 근황과 관심사.

반년동안 파주 출판단지에서 전자출판 관련한 프로젝트에 참여하고 있습니다. 스마트폰과 소셜. 굳이 카테고리를 좁히자면 그렇게 좁힐 수 있으리라 봅니다. 5년 전 쯤에도 전자책과 관련한 일을 했는데, 세상은 돌고 도는가 봅니다. 아무튼 근황은 이러하고, 전자책 사업, 나름 흥미진진합니다. 이쪽도 춘추전국시대.

블로그도 재정비해야 하려나봅니다.

Ubuntu 10.04에 Python 2.5 설치하기

구글의 AppEngine을 이용해 개발해보려했더니, Python 2.5 버젼을 이용해야 한단다. Snow Leopard도, Ubuntu 10.04도 Python은 2.6.x가 기본으로 설치되어있고, 특히나 Ubuntu에서는 python2.5 패키지 자체가 없어져버렸다. 그래서 소스코드를 찾아서 컴파일하는 방법도 찾아봤으나 실제로는 여러부분에서 오류가 나고, 결국 Installing Python 2.5 on Ubuntu Linux 10.10 라는 곳에서 해결책을 찾았다. 외부 소스저장소를 등록하고 패키지로 설치하는 참 쉬운 방법!

$ sudo add-apt-repository ppa:fkrull/deadsnakes
$ sudo apt-get update
$ sudo apt-get install python2.5

AppEngine 개발을 위한 SDK를 설치하고 실제 개발하는 것은 다음에!

오늘의 링크

Memcached 서버를 Cacti를 이용해 모니터링하기 위해,
mysql-cacti-templates
에 포함되어있는 SSH-Based Templates를 사용해봤지만 정상적으로 동작하지 않았다. 아래 링크들을 참고하면 다시 세팅해볼 수 있을 것 같다.

그리고 cacti에 메일수신 그래프추가 페이지에는 Cacti를 이용해 커스텀 데이터를 그래프로 만들 수 있는 방법이 있다. 참고해봐야겠다.

작년에 배운 것.

새해를 시작하면서 여러 계획들을 적어봐야겠지만, 지난 해에 배운 것을을 잊지 말자는 의미에서 여기에 적어보겠습니다.

  1. 실패한 경험도 경험이다. 실패를 두려워하지 말자.
  2. 생각하고 있는게 있다면, 빨리 행동에 옮기자.
  3. 신뢰할 수 있는 동료들을 만들자.

… 이것들은 작년에 봤던 실리콘밸리에서 IT 사업을 한다는 것은? 라는 동영상에서 배운 것들인데, 내가 경험한 것들과 많이 겹칩니다. 그래서 이것을 실천하는 것이 올해의 계획중 하나입니다.

그나저나… 실리콘밸리에서 일해보고 싶어요. :(

Cacti 설치 성공기

지난번, 시스템에 Cacti를 설치하고, 정작 그래프는 출력이 안되서 결과적으로 실패한 경험을 했습니다. 지난번 설치시에, Ubuntu의 aptitude를 이용한 설치를 했었는데, 그것때문에 데이터 디렉토리의 권한 등에 문제가 있지 않았나 하는 생각이 좀 들었지요. 그래서 다음으로는 수동설치를 해보았습니다. (수동 설치도 어렵지 않습니다. 문서도 많고요.)

결론부터 말하자면, 그래프가 출력되지 않은 이유는 SNMP 프로토콜의 권한 설정때문이었습니다. 그래서 SNMP 프로토콜의 권한을 v1, public 으로 설정하고 그래프 출력까지 제대로 나오도록 완료했습니다.

우선 참고한 문서는 SNMP + RRDTool + Cacti on Debian Lenny mini-HOWTO 입니다.

SNMP 설정을 바꾸는 것이 중요했지, aptitude를 이용한 설치냐 수동설치냐는 중요하지 않았기때문에, aptitude를 이용한 설치법을 알려드리겠습니다.

서버에 ssh로 접근해서, 아래 명령을 실행하면 됩니다. (PHP, MySQL, Apache2가 설치되어있다고 가정합니다.)

$ sudo apt-get install cacti*

이 명령으로, cacticacti-spine이 설치됩니다. cacti-spine은 데이터를 수집할때, PHP 스크립트(cmd.php)를 돌리는 대신 설정할 수 있는 바이너리 실행파일입니다. (속도 향상이 있다고 하네요.)

그리고 나서, http://localhost/cacti 에 접속해보면, 처음 설치에 따른 몇가지 설정을 하게 되지요.

그 다음은 서버에 snmpd와 각종 snmpwalk 같은 SNMP 유틸리티를 설치하는 것인데, 아래 명령으로 설치하면 됩니다.

$ sudo apt-get install snmpd snmp

그 후 고쳐줘야 할 부분이, 외부 서버에서 이 서버의 SNMP 정보를 취득할 수 있도록 해주는 것인데요, /etc/snmp/snmpd.conf 파일과 /etc/default/snmpd 파일을 수정해야 합니다.

우선 /etc/snmp/snmpd.conf 파일을 다음처럼 수정…

#com2sec paranoid  default         public
com2sec readonly  default         public
#com2sec readwrite default         private

기본값은 paranoid인데, readonly로 수정했습니다. 그리고 /etc/default/snmpd 파일을

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid'

이렇게 수정해서, 다른 서버에서 들어오는 요청에도 응답하도록 수정합니다. 다만, 이렇게 수정한다면 서버가 잘 동작하는 firewall 아래 있어야겠지요. 아니면, SNMP v3로 사용자 계정을 설정한다던가 하는 다른 방법을 선택해야 합니다.

서비스를 재시작합니다.

$ sudo service snmpd restart

아래 명령을 실행해서 출력이 제대로 나오는지 확인해보세요.

$ snmpwalk -Os -c public -v 1 localhost system

Cacti는 잘 설치되어있고, 서버에 잘 접속했다면 기본적으로 device에 현재 서버(localhost)가 등록되어있을텐데, 그 서버를 삭제하고, 새로 작성합니다. device에서 add로 서버를 추가하는데, Host Template를 ucd/net SNMP Host를 선택하고, SNMP Version을 Version 1. 그리고 나머지 부분은 기본값으로 잘 동작합니다.

설치하고 나면, 왼쪽 메뉴중 New Graphs를 선택해서 기본적인 Graph들을 추가하고, 10분쯤 새로고침 해보면 예쁜 그래프가 나와있을겁니다. 이제 Graph Log는 작성되고 있으니, 본업으로 돌아가 코딩을 해야겠군요.

다음에 할일은..

  • SNMP v1 인증을 v3 인증이나, ssh tunneling을 이용한 것으로 바꾸기.
  • Apache2, MySQL, Memcached에 대한 템플릿 추가하기.

Zend_Search_Lucene에서 Multiple Indexes Search

개발하고 있는 SNS에 Lucene을 이용한 검색기능을 추가하고 있습니다.

Lucene을 이용해 검색이라면, 뒷단에서 문서를 파싱하고 index->addDocument() 를 이용해 추가하고, index->optimize()를 이용해 인덱스를 최적화하고… 그리고 그렇게 생성된 인덱스를 이용해 앞단의 검색을 구현하는게 일반적입니다.

여기서, 문서를 어떻게 파싱해서 인덱스에 추가할 것인가, 인덱스를 어떻게 관리할 것인가 … 등이 문제가 되는데, 현재 프로젝트의 특성상, 파싱쪽에는 별로 문제될 여지가 없고 대신 인덱스 관리쪽에는 고민할만한 여지가 많더군요.

문제를 꼽자면,

  • 전체 인덱스를 생성하자니, 시간이 너무 많이 소요된다.
  • 32bit 상에서는 2GB, 64bit 시스템을 사용하더라도 NAS나 SAN 위에 인덱스를 올려놓을 수 없다는 제한 때문에 인덱스의 크기도 관리해야 한다.

이런 문제들.

그래서 생각한 계획은 “최종 인덱스 생성 시각 이후의 글들만을 별도로 인덱스하고, 그걸 기존의 인덱스와 merge 하는 작업을 주기적으로 실행한다”였습니다.

그런데, 또 여기서 닥친 문제가, Zend_Search_Lucene이 Lucene API 중 일부만 지원하다보니, 레퍼런스를 찾아봐도 Index를 merge하는 방법을 찾을 수 없더군요. (물론, Java나 Python 버젼의 Lucene을 사용하면 간단한 문제지만요)

그래서 방향을 변경해서, Multiple Indices에서 검색하는 방법을 찾아봤고, 그것은 Zend_Search_Lucene 에서도 지원한다는 것을 확인했습니다. 출처는 stackoverflowSearch multiple indices at once using Lucene Search 입니다.

$index = new Zend_Search_Lucene_Interface_MultiSearcher();
$index->addIndex(Zend_Search_Lucene::open('search/index1'));
$index->addIndex(Zend_Search_Lucene::open('search/index2'));
$index->find('someSearchQuery');

그래서 변경된 계획은 “글들을 기간별로 partition해서 여러개의 인덱스로 보관하고, Lucene의 Multiple Indices Search를 이용한다”가 되었습니다.

PHP를 메인으로 사용하는 프로젝트라, Zend_Search_Lucene을 사용해서 할 수 있는 것들 위주로 알아보고 있지만, 앞으로의 계획은 이렇습니다.

  • Java나 Python 버젼의 Lucene도 적극적으로 사용해서 검색 서버를 세팅해보기.
  • Hadoop 등을 이용해, 분산 서버에서 인덱스를 만들고 merge하는 것으로 인덱스 생성 속도를 높이기.

RRDTool, CACTI, and …

웹서비스를 제작하면서 Memcached 로 캐싱문제를 해결하고 있는데, 여러가지 궁금한게 많이 생겼습니다. 이게 잘 동작하고 있는지, 얼마나 많은 데이터를 캐싱하고 있고, 언제 가장 많은 HIT가 발생했는지 등등.

그래서 어떤 방법이 있을지 생각해보다가, 예전 웹호스팅 업체에서 웹서버의 트래픽과 Load를 보여줄때 사용하던 MRTG가 떠올랐고, 약간의 구글링 끝에 요즘은 MRTG보다 Cacti를 더 많이 사용한다는 것. 그리고 Cacti용으로 만들어진 Memcached Template를 이용하면 Memcached 서버의 상태도 로그 차트를 만들 수 있다는 걸 알게 되었습니다.

Ubuntu Desktop으로 운영하고 있는 로컬 가상머신에 Cacti를 설치했고, 결론적으로 말하자면 잘 동작하지 않았습니다. 다만, 어느 부분에서 실패했는지 알고 있으니 조금만 수정하면 잘 동작하겠고 다양하게 활용할 수도 있겠다 생각하고 있어요. 대신, 첫번째 설치시에 실패했기 때문에 Cacti의 구조에 대해 좀 조사해보게되었고 또 다른 좋은 툴 RRDTool과 SNMP 에 대해서 알게 된게 성과라고 할 수 있겠습니다.

우선 Cacti에 대해 설명하자면, PHP와 MySQL 기반으로 작성된 RRDTool의 wrapper라고 할까요. RRDTool은 시간+값 형식의 데이터를 독자적인 바이너리 포맷으로 저장할 수 있는 유틸리티이고, RRDGraph 라는 또 다른 유틸리티를 이용해 이미지 차트를 만들 수 있습니다. 특징으로는 전체가 C++로 작성되어있고 최적화가 잘 되어있어 속도가 빠르다는 점.

Cacti는 여러종류의 로그를 설정할 수 있는 템플릿과 인터페이스를 제공하고, 그걸 서버에서 cron으로 실행할 수 있는 별도의 커맨드라인 스크립트를 제공합니다. cmd.php 파일 말고도, 바이너리 실행파일인 spine도 제공하고, 그걸 사용하면 네배 이상 속도가 빠르다고 하네요. Cacti 는 시스템의 CPU 사용량이나 네트웍 트래픽 등을 저장할 수 있는 템플릿도 제공하는데, 그것들은 대부분 SNMP 를 사용합니다. Simple Network Management Protocol 의 약자인데, SNMP 를 지원하는 원격서버에서도 정보를 가져와 Cacti 서버에 로그를 저장할 수 있고요. (제 경우에는 원격서버의 SNMP 로그를 저장해보려고 하다가 인증쪽에 문제가 생겨서 해결하지 못했습니다.) 이밖에도 Apache의 상태를 로깅한다던가, MySQL, Memcached 서버의 상태를 저장하는 등등 여러가지 템플릿이 제공됩니다. 여러대의 서버를 클러스터로 연결하고 상태를 한곳에서 관리할때 유용하게 쓸 수 있으리라 생각합니다. 오늘 겪었던 문제들을 해결하게 되면 다시 성공기를 포스팅하도록 할께요.

정리할 것:

  • Cacti의 수동 설치방법.
  • Cacti의 cron 스크립트가 잘 작동안되던 이유 찾기.
  • SNMP 인증문제 해결하기.

링크:

새해!

새해에는 블로그라도 열심히 하겠다는 계획을 세웠습니다.

여러가지 섞어서 모둠블로그(?)로 운영하는게 성에 차지 않기도 해서, http://yoophi.com 에서 운영하는 블로그에는 개발에 관련된 이야기를 주로 하려고 했습니다. 하지만 시간이 남을때는 블로그에 글을 쓸 마음의 여유가 없고, 일을 열심히 하고 있을때는 스트레스와 피로때문에 키보드로 손이 가질 않네요.

이렇게나마 짧게 뭔가 써보는 것도 “새해에는 블로그라도 열심히 하자!” 라는 계획의 첫번째 약속이라도 지키기 위해서입니다.

이 블로그는 제가 개인적으로 운영하는 블로그이긴 하지만, 사실 살펴보면 블로그 주인장 소개도 없고, 뭐에 관심있는 블로그인지 알길도 없고 … 참 성의없는 블로그구나 싶습니다. 게다가 요즘은 회사 사람들도 이 블로그를 보겠구나 하는 생각에 더 신경쓰이기도 하고 말이예요.

뭐, 아무튼 그래도 올해에는 열심히 해볼 생각입니다.

홈페이지도 현재 쓰고 있는 워드프레스를 버리고, 새로운 CMS를 사용할 예정 — Croogo 라는 CakePHP 기반의 CMS 를 사용할 생각이예요 — 이고, GitHub 라던가, Google Code 에 개인적으로 운영하고 있는 오픈소스 코드들도 정리를 해볼까 합니다. 국내에는 사용자가 많지 않지만, 요즘 아주 인기 많은 PHP 프레임웍인 CakePHP 강좌도 열어볼 생각이고, Amazon Web Service 를 이용해서 웹사이트를 elastic 하게 스케일링 하는 것, Hadoop MapReduce, NoSQL, Node.js 등 제가 관심을 가지고 있는 여러가지 것들을 제가 아는 만큼 나눠볼까 해요.

한해가 지났을때 1년동안 많은걸 배웠구나 하는 뿌듯함이 들 만큼 많은 공부를 하는 한해가 되었으면 하는 바람입니다.

이 글을 보는 불특정 소수… 모두 새해 복 많이 받으시길 바랄께요!

Ubuntu Server에 GDM 설치하기.

VMWare에 Ubuntu Server를 설치해 작업을 하는데, 다른건 상관없는데 Gnome Terminal이 그립다. 역시 GUI에 길들여진 인생.

가볍게 Gnome Desktop을 설치하려면, 아래 명령을 사용하면 된다.

$ sudo -i
# apt-get update
# apt-get install x-window-system-core xserver-xorg gnome-desktop-environment gdm
# sudo /etc/init.d/gdm start

또는

$ sudo apt-get install ubuntu-desktop

하지만, ubuntu-desktop을 설치하면, openoffice라던가 부가적으로 설치되는게 너무 많아서 조금 피곤!