Author Archives: mix1009

도메인 다시 등록했습니다.

몇달전부터 블로그에 전혀 신경을 못썼었는데…

도메인 연장을 하지 않아서 mix1009.net 도메인이 아예 중지됐더군요 TT

도메인 연장할수 있는 기간(2달–)이 지나서, 바로 등록도 안되더군요.

삭제 대기 기간이 지나서, 오늘에서야 겨우 도메인 등록했습니다.

앞으로 블로그에 더 신경쓰도록 하겠습니다.

블로그에는 신경을 많이 못썼지만.. 그래도 그동안 여러가지 공부했으니

앞으로 차차 글로 옮기도록 하겠습니다.

mix1009

PYCON 2009 비디오

PYCON 2009 (Python Conference 2009) 비디오가 올라와있네요..

http://us.pycon.org/2009/conference/schedule/

몇개의 세션이 취소되서 좀 아쉽지만, 그래도 많은 정보가 있네요 🙂

저는 VM쪽 관련한 패널을 흥미롭게 봤고, CPython 이외의 다른 구현들이 이제 많은 부분을 차지하네요.

keynote중에 Reddit에 대한 내용을 재미있게 봤습니다. Reddit이 LISP에서 Python으로 소스를 옮긴 내용도 흥미롭고 서비스 최적화 관련된 내용도 건질게 많았네요.

그리고 Lightning Talks도 참 재미있더군요. Lightning Talks는 한사람에게 딱 5분만 주어지고 한 주제에 대해서 자유롭게 발표하는 것으로 짧은 시간내에 다양한 정보를 얻을수 있고, 넓고 얕은 지식 습득(–)에 도움이 됩니다.

memcachedb = memcached + Berkeley DB

memcached가 메모리에만 저장되기 때문에 서버 재시작하면 내용이 모두 날라갑니다. memcached가 캐시에 최적화되어 개발되어 있기때문에 당연한 거지만… 사용법이 간단하고, 퍼포먼스가 좋다보니 memcached의 간편함과 DB의 persistence를 모두 충족할수 있는 프로그램을 찾게되는듯하네요.

memcachedb는 memcached와 Berkeley DB(오라클이 인수했더군요)를 이용하여 만들어졌으며, 클라이언트는 memcached 프로토콜을 이용하여 접속하며, key, value는 메모리가 아니라 DB에 저장됩니다. 단순한 구조로 되어 있기 때문에 복잡한 DB에 비하면 훨씬 더 빠르게 동작합니다. 또한 replication을 지원하기 때문에, read를 분산하여 처리할수 있습니다. 다만, memcached처럼 여러개의 서버를 파티션해서 사용할수는 없습니다. replication으로 연결하면 write은 모든 서버에서 일어나게 됩니다.

memcachedb와 유사한 프로젝트로 tugela cache가 있습니다. 현재 소스가 더이상 관리가 되지 않고 있지만,  tugela cache도 memcached와 Berkeley DB를 이용하여 만들어졌습니다. memcachedb와의 차이점은 persistency를 추구하지 않는다는 점입니다. 메모리보다 많은 캐시가 필요할때 디스크에 쓰는 형태입니다. replication이 없고 memcached와 마찬가지로 read/write를 모두 분산할수 있습니다. memcached에서 캐시 사이즈가 메모리보다 클때 사용하기에는 memcachedb보다는 tugela cache가 적절합니다.

회사에서 세션정보를 저장하는 데몬을 직접 작성하여, 메모리로 세션을 관리하고, 주기적으로 세션정보를 파일로 쓰고, 시작할때
파일에서 세션정보를 읽도록 해서 관리하는데 이거 작성하는것도 일이죠. 이럴 경우 memcachedb를 이용하면 좋을듯하네요…

repcached – memcached + replication

repcachedmemcached에 리플리케이션(replication) 기능을 추가한 프로그램입니다.

memcached가 cache이기 때문에 세션정보등을 저장하기는 좀 불안한 면이 있죠. 그래서 memcached(repcached)를 두개 띄워놓고, 하나가 중단되더라도 replication을 해두면 보다 안정적으로 서비스 운영이 가능합니다.

repcached 서버를 두군데 띄우고 양쪽으로 리플리케이션 되도록 세팅하면 한쪽에 key,value를 입력하면 다른 서버에도 같은 key,value가 입력됩니다. 그리고 서버 재시작할때 다른쪽 서버의 모든 key,value를 받아오도록 되어있으니, memcached를 재시작해야하거나 서버의 문제로 종료된 경우 캐시를 전부 날리지 않아도 됩니다.

그리고 memcached 클라이언트 라이브러리를 그대로 이용할수 있으므로, 클라이언튼 쪽은 서버에 양쪽 서버 주소만 등록해주면 됩니다.

repcached는 memcached의 패치입니다. 따라서 컴파일하면 memcached 파일이 생성됩니다. 저는 혹시를 위해서 실행파일명을 repcached로 변경하여 설치했습니다.

아래처럼 두개의 호스트에서 repcached를 실행하면 모든 key,value가 공유됩니다.

10.0.0.2> repcached -m 128 -l 10.0.0.2 -p 4001 -d -x 10.0.0.3

10.0.0.3> repcached -m 128 -l 10.0.0.3 -p 4001 -d -x 10.0.0.2

한가지 불편한점은 하나의 호스트에서 리플리케이션하도록 세팅이 불가능해보입니다. -X로 replication에 사용하는 포트를 지정할수는 있지만, 상대편의 replication 포트를 지정하는 옵션이 없어서 어떻게 세팅해야할지 모르겠네요. 하지만 두개의 서버에 나누어 실행하는게 더 안전하므로 실제 서비스 적용할때는 크게 문제가 되지 않을거라 생각되네요.

memcached와 성능상의 차이가 얼마나 있는지는 테스트해봐야할듯하네요.

그리고 memcached와 마찬가지로 메모리가 부족하면 임의의 key,value를 지울듯한데, 세션정보등을 repcached에만 의존해도 되는지 의문이 드네요.

캐시가 날라가면 캐시를 채울때까지의 서버 부하 감소용으로 사용하면 좋을듯하네요. 그리고 read를 분산하는 효과도 있겠죠.

서버/인프라를 지탱하는 기술

얼마전(5월1일)에 서점에 갔다가 상당히 괜찮은 책을 발견했습니다.

“서버/인프라를 지탱하는 기술”

일본서적 번역본인데 이렇게 서버 최적화와 서버 운영에 필요한 기술들에 나온 책은 흔하지 않은듯하네요. 번역본은 더 그렇죠…

무중단 서비스를 위한 다중화 기술에 대한 설명이 자세히 나와있으며, 서버 최적화에 내용도 어느정도 나와있습니다. 리눅스, Apache, MySQL 등의 오픈 소스를 이용한 서버운영에 대한 내용이고, 각각에 대한 최적화에 대한 내용도 있습니다. 하지만, 최적화에 대한 페이지가 제한되어 있는게 좀 아쉽네요. 이름만 듣고 적용하지 못했던 여러가지 툴들에 대한 설명도 볼수 있었습니다. 제가 수동으로 스크립트를 짜서 해오던 일들도 소개된 툴들을 활용해보면 좀더 쉽게 서버관리가 가능할거 같습니다.

목차입니다…

1. 서버/인프라 구축 입문 (다중화/부하분산의 기본)
1.1 다중화의 기본
1.2 웹 서버의 다중화 – DNS 라운드 로빈
1.3 웹 서버의 다중화 – IPVS를 이용한 로드밴런서
1.4 라우터 및 로드밸런서의 다중화

2. 한 단계 높은 서버/인프라 구축 (다중화, 부하분산, 고성능 추구)
2.1 리버스 프록시 도입
2.2 캐시서버 도입
2.3 MySQL 리플리케이션
2.4 MySQL 슬레이브 + 내부 로드밸런서 활용 예
2.5 고속, 경량의 스토리지 서버 선택

3. 무중단 인프라를 향한 새로운 연구 (DNS 서버, 스토리지 서버, 네트워크)
3.1 DNS서버의 다중화
3.2 스토리지 서버의 다중화
3.3 네트워크의 다중화
3.4 VLAN 도입

4. 성능향상, 튜닝 (리눅스 단일 호스트, 아파치, MySQL)
4.1 리눅스 단일 호스트 부하의 진상규명
4.2 아파치 튜닝
4.3 MySQL 튜닝의 핵심

5. 효율적인 운영 (안정된 서비스를 향해)
5.1 서비스의 가동감시 Nagios
5.2 서버 리소스 모니터링 Ganglia
5.3 서버관리의 효율화 Puppet
5.4 데몬의 가동관리 daemontools
5.5 네트워크 부트의 활용 PXE, initramfs
5.6 원격관리 관리회선, 시리얼 콘솔, IPMI
5.7 웹 서버 로그관리

6. 서비스의 무대 뒤 (자율적인 인프라, 다이나믹한 시스템 지향)
6.1 Hatena의 내부
6.2 DSAS의 내부

CentOS 4에서 PHP 5와 XCache 소스로 설치

lighttpd와 병행하여 쓰고 있는데, CentOS 4 버전에서는 SRPM이 PHP4 버전이 디폴트로 되어 있어서, PHP5는 소스를 받아서 설치했습니다. ./configure할때 인자주는게 생각처럼 되지 않아서 좀 헤맸습니다. 오랜만에 PHP 소스를 직접 받아서 설치해봤습니다.

./configure –enable-fastcgi –enable-discard-path
–enable-force-cgi-redirect –with-mysql=/usr/bin/ –with-libdir=lib64  …기타 라이브러리 설정

앞에 –enable-fastcgi enable-discard-path
–enable-force-cgi-redirect 부분은 lighttpd와 fastcgi와 연동하기 위해서 필요한 부분입니다.

–with-mysql=/usr/bin/ –with-libdir=lib64는 mysql 모듈을 사용하도록 한것인데, 64bit MySQL 라이브러리가 깔려있어서 –with-mysql 옵션만 주면 mysql 라이브러리를 못찾더군요.

예전에 SRPM을 설치하면서 필요한 devel 패키지들은 모두 설치되어있어서 따로 yum을 통한 패키지 설치는 없었습니다 ^^

설치는 간단히 sapi/cgi/php-cgi를 /usr/local/bin 쪽에 복사하고, /usr/local/lib/php.ini를 적당히 만들어주고, lighttpd.conf에서 새로운 php-cgi 참조하도록 변경했습니다.

웹서버 재시작하여 정상동작하는거 확인하고 make install하고, 전에 사용하던 PHP관련 RPM들을 삭제했습니다. 컴파일할때 RPM도 같이 설치되어 있으면 문제가 생기더군요.

XCache 소스 받아서 압축풀고 아래대로 했습니다.

$ phpize
$ ./configure --enable-xcache
$ make
$ sudo -s
# make install
# cat xcache.ini >> /usr/local/etc/php.ini
# vi /usr/local/etc/php.ini


php.ini 파일에서 zend_externsion에서 xcache.so 참조하는 부분이 있는데 경로에서 버전정보를 수동으로 고쳐야합니다.

zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
   →
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so


웹서버 재시작하고 phpinfo() 호출해서 출력하면 xcache 정상 동작하는거 확인할수 있습니다.

ffmpeg / mencoder 이용해서 동영상에 로고 넣기

동영상에 이미지로고를 삽입할 일이 있어서 ffmpeg와 mencoder를 이용해서 테스트해봤습니다.

ffmpeg에서는 간단합니다. -vhook 옵션을 사용하면 됩니다. vhook 플러그인중에 imlib2를 사용하면 됩니다. 하지만 최근 SVN에서는 vhook 옵션이 제거되었습니다. libavfilter라는 새로운 필터링 라이브러리로 갈아타기 위해서이지만 아직은 쓸수 있는 플러그인이 없어서 SVN에 있는 버전은 로고를 삽입할수 없습니다. x 좌표, y 좌표 지정하는 곳에 expression을 사용할수 있어서 위치 조절등을 비교적 쉽게 할수 있습니다. 자세한 사용법은 http://windforce.ellil.net/d/ffmpeg/hooks.html 을 참고하세요.

$ ffmpeg -sameq -i input.avi -vhook ‘vhook/imlib2.so -x 10 -y 10 -i logo.png’ output.avi

mencoder에서는 FIFO라는 기술로 개발되었기 때문에 유닉스 계열에서만 정상적으로 동작합니다. png 포멧을 바로 지원하지 않기 때문에 변환을 위해서 ImageMagick이 필요합니다. 웹상에서 찾은 예제들은 RGB24 포맷을 사용하도록 되어 있어서 투명한 로고를 지원하지 않았었는데 ImageMagick에서 변환할때 RGBA로 변환하면 투명한 로고가 지원됩니다. bit depth는 8비트만 지원하므로 16비트로 되어 있으면 제대로 동작하지 않습니다.

$ convert logo.png -depth 8 logo.rgba
$ mkfifo bmovl.fifo
$ echo “RGBA32 80 30 10 10 0 0” > bmovl.fifo; cat logo.rgba > bmovl.fifo

다른 terminal에서 실행
$ mencoder input.avi -o output.avi -vf bmovl=0:0:bmovl.fifo … {encoding options}

위에서 로고의 크기는 80×30이고 10,10 위치에 출력하도록 설정했습니다. logo.rgba포맷은 raw 이미지 포맷으로 Red Greed Blue Alpha 8비트씩 하나의 픽셀이 32비트로 구성되어 있습니다. FIFO를 통해서 인코딩중에 지속적으로 명령을 전달할수 있으므로 로고를 바꾼다던지 위치를 바꾸는게 가능은 합니다. 하지만 프로그래밍이 필요하고 원하는 시간에 동기화하는게 쉬운 일은 아닙니다.

mencoder와 ImageMagick를 이용해서 들어온 동영상에서 screenshot을 여러개 받은후 가장 밝은 이미지를 찾고, 이 이미지를 autocrop한 다음에 인코딩하도록 python으로 작업했습니다. 동영상의 소스가 여러곳이고 크기, 파일포맷도 여러가지이고 결정적으로 상하좌우 공백이 같이 인코딩되어 있는 경우가 있어서 수동인코딩도 고려했었는데… 동영상 인코딩을 완전 자동화할수 있을거라 기대하고 있습니다 🙂

AutoIT MS워드 자동화

전에 AutoIT을 통한 자동화에 대한 글을 쓴적이 있는데, 얼마전에 자동화할때 MS워드에서 정보를 추출할 일이 있어서 AutoIT에 포함된 워드 모듈을 써볼 기회가 있었습니다. AutoIT에서 제공하는 워드 함수에 대한 문서만으로는 자동화하기는 부족하더군요. MSDN을 참고해서 워드의 객체 모델을 어느정도 이해하시고 Range 객초 참고하시면 큰 도움이 될듯합니다. MSDN이 Visual Basic 위주로 되어 있지만, 문법은 동일하게 쓰면 됩니다.

아래 예제 보시면 어느정도 감이 오실듯하네요.

#include <word.au3>

; 화면에 보이지 않고 포커스 안가져가도록 인자 전달
$oWordApp = _WordCreate(“”, 0, 0, 0)

; test.doc 문서 열기
$doc = _WordDocOpen($oWordApp, “test.doc”)

; 문단 객체 가져오기
$paragraph = $doc.Paragraphs
 
; 첫번째 문단 텍스트 가져오기 (텍스트만)
$paragraph1text = $paragraph(1).Range.Text

; 두번째 문단 클리보드에 복사 (포맷,링크,그림등 포함)
$paragraph(2).Range.Copy

; 세번째 문단부터 끝까지 클립보드에 복사
$doc.Range($paragraph(3).Range.Start).Copy

; 세번째 문단부터 다섯번째 문단까지 텍스트 가져오기

$paragraph3to5text = $doc.Range($paragraph(3).Range.Start, $paragraph(5).Range.End).Text

; 문서내 모든 링크 가져와서 출력하고 다른 주소로 변경
For $hyper in $doc.HyperLinks
    ConsoleWrite(“link=” & $hyper.Address & @CRLF) ; 링크 출력
    $hyper.Address = “http://mix1009.net” ; 모든 링크 바꾸기 —
Next

CentOS에서 최신버전 lighttpd rpm 만들기

CentOS나 RHEL에서 최신 버전 lighttpd rpm 만드는 방법입니다.
이전 버전의 src rpm을 받아서 아래와 같이 src rpm 최신버전으로 제작할수 있습니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpm -i http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# cd /usr/src/redhat/SPECS
# sed -i ‘s/1\.4\.13/1\.4\.22/g’ lighttpd.spec

sed로 lighttpd.spec 파일에서 1.4.13을 찾아서 1.4.22(현재 최신 버전)으로 변경합니다. 일반 에디터로 편집하셔도 됩니다. 파일 내용도 한번 확인해보시면 도움이 될듯하네요.

lighttpd 소스를 받습니다.

# cd /usr/src/redhat/SOURCES
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz

이제 rpm만 만들면 됩니다. src rpm은 아래처럼 만듭니다.

# cd /usr/src/redhat/SPECS
# rpmbuild -bs lighttpd.spec

이렇게 하면 /usr/src/redhat/SRPMS 에 src rpm이 만들어집니다.

아래처럼 바이너리 rpm을 제작할수 있습니다. ssl을 사용할 수 있도록 옵션을 추가적으로 전달했습니다. spec 파일 보면 어떤 옵션이 있는지 확인할수 있습니다.

# cd /usr/src/redhat/SPECS

# rpmbuild -bb lighttpd.spec -with ssl

이렇게하면 시스템에 따라 /usr/src/redhat/RPMS/{x86_64, i386} 에 바이너리 rpm 파일이 생성됩니다.

rpmbuild 할때 오류나면 yum으로 필요한 패키지 설치하면 됩니다. (yum update openssl-devel …)

이제 필요한곳에 rpm을 설치하고 재시작 하면 됩니다~

# rpm -e lighttpd      (이전 버전 제거)
# cd /usr/src/redhat/RPMS/x86_64
# rpm -i lighttpd-1.4.22-1.x86_64.rpm
# /etc/init.d/lighttpd start

Sun VirtualBox

vmware를 사용했었는데, 요즘 따로 받은 프로그램도 없는듯한데, 아무거도 실행안해도 guest의 CPU가 30%정도에서
안내려구더군요. 아무래도 네트워크를 통해 바이러스에 감염된듯해서 이제 VM에서는 가상 아이피만 사용할려고 합니다. (원래 vmware의
bridged networking사용)

주변에서 virtualbox를 만족하면서 사용해서 저도 virtualbox로 바꿔봤습니다.

Ubuntu 8.10에서 Synaptic이용해서 설치했습니다. virtualbox를 안썼던 이유가 dual core를 guest에서 쓰지 못해서였는데, cpu 하나여도 속도는 빠른편이네요. 특히 부팅속도가 vmware 비하면 확실히 빠르네요. 그리고 vmware에서 alsa를 이용해서 소리가 겨우 안끊기고 나왔었는데… (vmware와 pulseaudio 조합은 최악), virtualbox와 pulseaudio를 쓰니 딜레이와 끊김없이 소리가 잘 재생됩니다.

virtualbox 써보니 또 한가지 아쉬운점이… 네트워크를 NAT로 설정할 경우 정상적인 방법으로 네트웍을 구현하지 않은거 같네요. 즉, 호스트쪽에서 (가상) 인터페이스가 따로 생성되지 않기 때문에, guest의 아이피 주소로 네트웍이 안됩니다. 제 경우 guest에서 10.0.2.5로 DHCP가 잡히고 gateway가 10.0.2.2로 잡혔는데.. 호스트에서 10.0.2.5로 ping도 안되고, 주소를 아예 인식하지 못합니다. virtualbox 프로그램에서 소켓을 관리하고 이를 VM에 연결해주는 방식인듯합니다. 찾아보니 포트포워드 하는 방법은 있네요. 포트포워드 설정하면 호스트의 아이피주소, 설정된 포트로 오는 패킷을 guest로 전달해주는 방식인듯합니다.

아래 명령으로, 호스트의 특정 포트로 오는 패킷을 게스트의 특정 포트로 전달되도록 할수 있습니다. (tun53300은 임의로 만들수 있는 이름이며, 아래 세줄이 하나의 포트에 대한 전달 규칙입니다. UDP에 대해서도 같은 포트에 대해서 규칙을 만들려면 아래와 같은 형태로 세줄은 추가해야합니다.

VBoxManage setextradata VMNAME “VBoxInternal/Devices/pcnet/0/LUN#0/Config/tun53300/HostPort” 53300
VBoxManage setextradata VMNAME “VBoxInternal/Devices/pcnet/0/LUN#0/Config/tun53300/GuestPort” 53300
VBoxManage setextradata VMNAME “VBoxInternal/Devices/pcnet/0/LUN#0/Config/tun53300/Protocol” TCP

규칙을 지울때는 마지막 부분(53300, TCP등)을 비워서 명령을 실행하면 됩니다.

만약 네트워크 프로토콜 관련 작업이나 테스팅을 하신다면 vmware가 더 적할할듯합니다.

virutalbox 장점:

1. 부팅속도 빠름
2. 소리 잘나옴
3. 심리스 모드 – 윈도우 내부의 창들이 호스트의 창처럼 보이도록 하는 기능인데, 완전히 호스트의 윈도우 메니저와 통합되는건 아니라 저는 안쓰고 있습니다.
4. 공짜

virtualbox 단점:

1. SMP 미지원 (guest당 CPU 하나만 사용)
2. NAT 네트워크 드라이버 차원의 구현 안님.
3. 디스크별로 snapshot 기능을 따로 설정할수 없음
4. 설치되는 guest OS 제한있음. (vmware에 비해)