GEXEC를 이용한 분산 시스템 일괄 관리 환경 구축 하기
작성자 : 서진우 (alang@syszone.co.kr)
작성일 : 2009년 7월 28일
1. GEXEC 란 ..
gexec는 클러스터 시스템과 같이 분산된 여러대의 서버를 일괄적으로 명령을 수행하게
하여 단일 이미지 형태의 관리 환경을 구현해 주는 프로그램이다.
기존의 rsh 혹은 ssh 를 이용하여 여러대의 서버에 명령을 원격으로 일괄 수행 시키는
프로그램 들이 있었는데, 이런 방식의 경우 노드 수가 많거나, 각 노드에 부하가 심할 경우
전반적인 속도 저하가 심한 문제가 있다.
이런 문제를 해결하기 위해 deamon 형태로 최적화된 원격 명령 수행 프로그램이 필요하게
된다. gexec는 이런 목적으로 제작되었고, 1000대 이상의 노드에서도 그 성능이 매우 우수한
것으로 증명된 프로그램이다.
직접 테스트를 해본 결과 ensh를 통해 ps 명령으로 4대 서버에 프로세스를 일괄 검색할때
소요 시간이 17초가 걸렸다.
당시 4대 서버의 부하는 full 상태였고, ensh 방식은 serial 방식이 아닌 parallel 방식으로
수행했었다. serial 방식으로 수행할 경우 25초가 소요되었다.
gexec를 통해 동일한 작업을 수행했을때 소요 시간은 0.4초이다.
즉 42배의 성능 개선이 확인되었다.
이제 gexec를 설치하는 방법에 대해 알아 보도록 하자.
2. GEXEC 설치 하기
gexec 를 설치하기 위해서는 libe, authd, gexec 프로그램을 설치해야 한다.
각 프로그램은 아래 사이트에서 download 하면 된다.
http://www.theether.org/gexec
http://www.theether.org/authd
http://www.theether.org/libe
libe-0.3.1-1
authd-0.2.3-1
gexec-0.3.8-4
gexec 의 경우 아래 주소에서 SRPM를 다운 받는 것을 권장한다. 공식 사이트에서의 버전은
compile 시 에러가 발생하는 문제가 있다.
http://www.joeandmotorboat.com/files/gexec-0.3.8-4.src.rpm
– libe 설치
# rpm -ivh libe-0.3.1-1.src.rpm
# rpmbuild -ba /usr/src/redhat/SPECS/libe.spec
# rpm -Uvh /usr/src/redhat/RPMS/x86_64/libe-0.3.1-1.x86_64.rpm -> 모든 서버에 설치
– authd 설치
authd 를 설치하기 전에 ssl 인증키를 만든다.
# openssl genrsa -out auth_priv.pem
# chmod 600 auth_priv.pem
# openssl rsa -in auth_priv.pem -pubout -out auth_pub.pem
# cp auth_priv.pem /etc
# cp auth_pub.pem /etc
# ensync /etc/auth_priv.pem
# ensync /etc/auth_pub.pem
# rpm -ivh authd-0.2.3-1.src.rpm
# rpmbuild -ba /usr/src/redhat/SPECS/authd.spec
# rpm -Uvh /usr/src/redhat/RPMS/x86_64/authd-0.2.3-1.x86_64.rpm -> 모든 서버에 설치
– gexec 설치
# vi /etc/services
—————————————————————————-
.
gexec 2875/tcp # Caltech GEXEC
—————————————————————————-
# ensync /etc/services
# rpm -Uvh ganglia-devel-x.x.x.rpm
-> gexec 를 compile 하기 위해서는 ganglia-devel 패키지가 설치 되어 있어야 한다.
만일 ganglia 가 없는 시스템 환경에서 gexec만 설치하기 위해서는 아래 spec 파일의
configure 내용에서 –with-ganglia 항목을 제거 한다.
# rpm -ivh gexec-0.3.8-4.src.rpm
# vi /usr/src/redhat/SPECS/gexec.spec
———————————————————————————–
.
%build
./configure –with-ganglia …
의 –with-ganglia 부분을 –enable-ganglia 로 변경
———————————————————————————–
# rpmbuild -ba /usr/src/redhat/SPECS/gexec.spec
# rpm -Uvh /usr/src/redhat/RPMS/x86_64/gexec-0.3.8-4.x86_64.rpm -> 모든 서버에 설치
– 환경 설정
# vi /etc/profile.d/gexec.sh
———————————————————————————–
#!/bin/sh
export GEXEC_GMOND_SVRS=”localhost:8649″
export GEXEC_SVRS=”grid000 cap001 cap002 cap003 cap004″
———————————————————————————–
# ensync /etc/profile.d/gexec.sh
– 사용하기
# gexec -h
Usage: gexec [OPTIONS] prog arg1 arg2 …
Execute prog on hosts defined by $GEXEC_SVRS.
Note: Path of prog will be determined on this host.
-d –detached
-h –help
-v –verbose
-V –version
-f –fanout=v
-n –nprocs=v
-p –prefix-type=v
-P –port=v
# gexec -n 4 hostname -> 환경설정에 정의된 노드 순으로 4대 노드에서 명령 수행
1 cap001
0 grid000
2 cap002
3 cap003
# gexec -n 2 hostname -> 환경설정에 정의된 노드 순으로 2대 노드에서 명령 수행
1 cap001
0 grid000
# gexec -n 0 hostname -> 환경설정에 정의된 노드 순으로 모든 노드에서 명령 수행
1 cap001
2 cap002
3 cap003
4 cap004
0 grid000
# GEXEC_SVRS=”cap004″ ; gexec -n 1 hostname
-> 환경설정을 무시하고, 지정노드에서 명령 수행
0 cap004
– ensh 출력 형태 변환 스크립트
gexec를 이용하면 분산된 서버에 일괄 원격 명령을 수행하는 속도는 뛰어나지만,
처리 결과 출력 방식이 단조로워 다른 형태로 사용하는데, 다소 불편함이 존재한다.
gexec의 사용형태와 출력방식으로 ensh와 유사하게 변환해주는 스크립트를 작성해 보았다.
# vi /engrid/ensh/bin/enexec
—————————————————————————————–
#!/bin/sh
GEXEC=/usr/bin/gexec
SHOST=`hostname`
GEXEC_HOSTS=`cat /engrid/ensh/etc/nodelist`
GEXEC_NODELIST=`echo $GEXEC_HOSTS`
GEXEC_SVRS=”$GEXEC_NODELIST”
while true
do
case “$1” in
-n)
shift
GEXEC_SVRS=”$1″
shift
;;
-x)
GEXEC_HOSTS=`cat /engrid/ensh/etc/nodelist | grep -v $SHOST`
GEXEC_NODELIST=`echo $GEXEC_HOSTS`
GEXEC_SVRS=”$GEXEC_NODELIST”
shift
;;
-h|–help)
echo “Usage:”
echo ” enexec [-n nodelist] [-x] command…”
echo ” -x : except this host”
exit 1
;;
*)
break;
;;
esac
done
num=0
echo > /engrid/ensh/tmp/enexec.tmp
for N in $GEXEC_SVRS
do
echo “| sed -e s/^$num/$N/” >> /engrid/ensh/tmp/enexec.tmp
num=`expr $num + 1`
done
SEDOPT=`cat /engrid/ensh/tmp/enexec.tmp`
SEDOPT1=`echo $SEDOPT`
CMD=”$*”
if [ $# == “0” ]
then
echo “$GEXEC -n 0 uptime $SEDOPT1” > /engrid/ensh/tmp/enexec.tmp
sh /engrid/ensh/tmp/enexec.tmp
else
echo “$GEXEC -n 0 $CMD $SEDOPT1” > /engrid/ensh/tmp/enexec.tmp
sh /engrid/ensh/tmp/enexec.tmp
fi
—————————————————————————————-
– enexec 사용법
enexec 는 ensh 와 연동되어, ensh의 nodelist를 참조하여 gexec를 실행한다.
출력형태도 ensh와 유사하게 변환하여 출력을 하게 된다.
사용방법은 아래와 같다.
[root@gc001 bin]# enexec : 전체 노드에 uptime 수행
gc002 18:37:45 up 29 days, 9:01, 0 users, load average: 0.03, 0.03, 0.00
gc001 18:37:19 up 29 days, 9:15, 1 user, load average: 0.00, 0.02, 0.00
gc003 18:37:49 up 29 days, 9:16, 0 users, load average: 0.00, 0.00, 0.00
gc004 18:38:43 up 29 days, 9:01, 0 users, load average: 0.00, 0.00, 0.00
[root@gc001 bin]# enexec -n gc003 uname -a : gc003 노드에 명령 수행
gc003 Linux gc003 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
[root@gc001 bin]# enexec -n “gc002 gc003” uname -a : gc002 gc003 노드에 명령 수행
gc002 Linux gc002 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
gc003 Linux gc003 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
[root@gc001 bin]# enexec -x uname -a : local host 를 제외한 나머지 노드에 명령 수행
gc003 Linux gc003 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
gc002 Linux gc002 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
gc004 Linux gc004 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux