고가용성 환경에서 cron을 운용하기 위한 rcron

참조 원문 : What is RCRON.. & How to Setup High Availability of cron Jobs Using RCRON

  HA(High Availability) 환경에서 cron을 사용해보신 분들이라면 이 프로그램이 유용하단 걸 동감하실 수 있으실 겁니다. 서버가 2대 있고 이 2대가 클러스터 구성일 때 액티브 서버에서만 실행되어야 할 cron 스케줄이 있다면 꽤 귀찮은 일이 생깁니다. 액티브와 스탠바이가 바꼈을 때 두 서버의 cron을 수동으로 수정해야 하기 때문이죠. Rcron은 이런 경우에 사용하는 프로그램으로서 구성 서버들 간의 상태를 확인하고 액티브 상태의 서버에서만 지정한 작업을 실행할 수 있게 해줍니다.

  그런데 rcron은 다른 서버의 생존을 파악하는 능력이 없기 때문에 그 역할을 위한 프로그램을 추가로 함께 사용해야 합니다. 이를 위해 이 글에서는 keepalived라는 별도의 데몬을 사용할 것입니다. Keepalived는 상대 노드에 신호를 보내고 응답이 없을 경우 링크가 죽었다고 판단하는 역할을 합니다.

  여기서는 하나의 노드를 keepalived 마스터로 설정하고 다른 한 노드를 keepalived 백업으로 설정할 겁니다. 마스터 노드는 rcron 상태가 액티브로 되며, 백업 노드는 패시브로 설정됩니다. 마스터 노드는 죽을 때 백업 노드에게 0 우선순위 신호를 보내며 이를 받은 백업 노드는 마스터 노드가 되어 rcron을 액티브 상태로 전환합니다. 그러다가 이전의 마스터 노드가 다시 살아나면 마스터 권한을 넘긴 후 백업 모드로 돌아가게 설정할 겁니다.

  설정 환경은 레드햇 계열 배포판인 것으로 가정합니다.


1. /etc/sysctl.conf 파일을 수정하여 두 노드의IP 포워딩 활성화시키기

net.ipv4.ip_forward = 1
# sysctl -p      ; 리부팅 없이 변경사항 적용


2. 두 노드에 EPEL 저장소 추가

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm


3. 두 노드에 필요한 패키지 설치

# yum install subversion byacc flex gcc


4. 프록시 서버를 통해 인터넷 연결을 할 경우 svn에 대한 http_proxy 설정(직접 인터넷 연결을 할 경우 생략)

# mkdir /root/.subversion/
#  vi ~/.subversion/servers
http-proxy-exceptions = *.example.com
http-proxy-host = www.example.com
http-proxy-port = 8080
http-compression = no


5. SVN으로 rcron 설치

# cd /root;
# svn co http://rcron.googlecode.com/svn/trunk rcron
# cd rcron/rcron
# ./configure
# make
# make install


6. 두 노드에 디렉토리 및 설정 파일 생성

# mkdir /etc/rcron/
# vi /etc/rcron/rcron.conf

(1) 마스터 서버 노드
  아래 내용 입력

# An arbitrary name
cluster_name        = cluster

# A file containing either the word “active” or the word “passive”
state_file          = /var/run/rcron/state

# The default state in case state_file can’t be read
#default_state       = active
syslog_facility     = LOG_CRON
syslog_level        = LOG_INFO

# We can tune jobs niceness/priorities
nice_level          = 19

  아래 명령어 실행

# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo “active” > /var/run/rcron/state

(2) 백업 서버 노드
  아래 내용 입력

# An arbitrary name
cluster_name = cluster
# A file containing either the word “active” or the word “passive”
state_file = /var/run/rcron/state
# The default state in case state_file can’t be read
#default_state = passive
syslog_facility = LOG_CRON
syslog_level = LOG_INFO
# We can tune jobs niceness/priorities
nice_level = 19

  아래 명령어 실행

# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo “passive” > /var/run/rcron/state


7. 두 노드에 Keepalive 패키지 설치
(1) 최신 소스 다운로드

# cd /root
# wget http://cgit.luffy.cx/keepalived/snapshot/keepalived-1.2.7.tar.gz

(2) RPM BUILD 패키지 설치

# yum -y install rpm-build

(3) 압축 풀기 및 keepalived.spec.in 파일 수정

# tar -zxvf keepalived-1.2.7.tar.gz
# mkdir -p /root/rpmbuild/SOURCES/
# cp /root/keepalived-1.2.7.tar.gz /root/rpmbuild/SOURCES/
# vi /root/keepalived-1.2.7/keepalived.spec.in
(Version 1.2.2를 Version 1.2.7로 수정)
# yum -y install popt*
# cd /root/keepalived-1.2.7
# rpmbuild -ba keepalived.spec.in

  위 명령어를 사용하면 소스를 이용해 컴파일된 RPM이 /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm라는 경로 및 파일명으로 생성됩니다. 이 파일을 이용해 설치합니다.

# rpm -ivh /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm


8. keepalived 설정
(1) 마스터 노드(172.16.243.144)

# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 101
advert_int 5
vrrp_unicast_bind 172.16.243.144
vrrp_unicast_peer 172.16.243.145

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup “/bin/echo passive > /var/run/rcron/state”
notify_master “/bin/echo active > /var/run/rcron/state”
notify_fault “/bin/echo passive > /var/run/rcron/state”
}

(2) 백업 노드(172.16.243.145)

# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 100
advert_int 5
vrrp_unicast_bind 172.16.243.145
vrrp_unicast_peer 172.16.243.144

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup “/bin/echo passive > /var/run/rcron/state”
notify_master “/bin/echo active > /var/run/rcron/state”
notify_fault “/bin/echo passive > /var/run/rcron/state”
}


9. 두 노드에 실험용 crontab 항목 생성

* * * * * /usr/local/bin/rcron –conf /etc/rcron/rcron.conf echo `date` >> /tmp/output

  두 노드 모두 keepalive 서비스를 시작합니다.

# service keepalived start ; chkconfig keepalived on


10. keepalived 데몬이 죽을 경우에 대비
  아래의 crontab 항목을 추가합니다.

* * * * * * /root/keep-alive-monitor

  그리고 아래 스크립트를 생성합니다.

# vi /root/keep-alive-monitor

#!/bin/sh
echo “test” >> /tmp/monitor;
ps -ef|grep -v grep|grep -i keepalived;
if [ $? -eq 0 ] ; then
exit 0
else
echo “passive” > /var/run/rcron/state;
/etc/init.d/keepalived restart;
fi