Cronの置き換え『Chronos』を試してみる

やりたいこと

物理、仮想含め数百台のサーバーを管理しているので、

  • cronを一括管理したい
  • cronジョブの負荷を分散したい
  • cronの結果を可視化(成功or失敗)
  • Dockerコンテナのcronを外出ししたい
  • Dockerコンテナが作成または削除される度にcron登録・削除をAPIで行いたい

これらを実現したいと思っていました。


そこで『Chronos』です!

結論から言うとChronosを使ってこれらを実現することができました。

Chronosとは

そこでChronosって何?という話しになりますが、
Cronの置き換えを想定したジョブスケジューラです。
airbnb/chronos · GitHub

Mesos上で動くので登録されたジョブをいい感じに分散して実行してくれます。


図にするとこのような感じだと思います。

f:id:tsunokawa:20140904142827p:plain

検証環境

f:id:tsunokawa:20141014195548p:plain
本エントリで例としてIPアドレスやmesos-master, mesos-slaveサーバーが出てきますが
この図の構成を参考にしてください。


今回使用したソフトウェアのバージョンです。

OS CentOS6.5
Chronos chronos-2.2.0
Mesos mesos-0.20.0-1.0.centos64.x86_64
ZooKeeper zookeeper-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64
ZooKeeper-server zookeeper-server-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64


必要パッケージをインストール

epel有効後

yum install autoconf make gcc gcc-c++ patch python-devel python-setuptools libtool zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel redhat-lsb nodejs


JDKもインストール
jdk-8u20-linux-x64.rpm
※openjdkでもいいみたいですが、自分はOracleからダウンロードしてインストールしました。


必要なパッケージはairbnb/chronos · GitHubを参考にしてあります。

ZooKeeper

ダウンロード&インストール
CDHのRPMパッケージを利用しました。
※依存関係のあるbigtop-utilsも同時にインストールします。

cd /usr/local/src
wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/RPMS/noarch/bigtop-utils-0.7.0+cdh5.1.2+0-1.cdh5.1.2.p0.4.el6.noarch.rpm
wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/RPMS/x86_64/zookeeper-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64.rpm
wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/RPMS/x86_64/zookeeper-server-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64.rpm

rpm -ivh bigtop-utils-0.7.0+cdh5.1.2+0-1.cdh5.1.2.p0.4.el6.noarch.rpm
rpm -ivh zookeeper-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64.rpm zookeeper-server-3.4.5+cdh5.1.2+31-1.cdh5.1.2.p0.4.el6.x86_64.rpm


設定(Mesosサーバー1台目)

echo "1" >> /var/lib/zookeeper/myid


設定(Mesosサーバー2台目)

echo "2" >> /var/lib/zookeeper/myid


設定(Mesosサーバー3台目)

echo "3" >> /var/lib/zookeeper/myid



設定(Mesosサーバー全台共通)
/etc/zookeeper/conf/zoo.cfg
に以下を追記

server.1=10.0.0.1:2888:3888
server.2=10.0.0.2:2888:3888
server.3=10.0.0.3:2888:3888



起動

/etc/init.d/zookeeper-server init
/etc/init.d/zookeeper-server start


自動起動設定

chkconfig zookeeper-server on


Mesos

ダウンロード&インストール
Mesosphere, Inc.から公開されているRPMパッケージを利用しました。
https://mesosphere.io/downloads/
からCentOS6系のパッケージを選択するとダウンロード出来ます。

cd /usr/local/src
wget http://downloads.mesosphere.io/master/centos/6/mesos-0.20.0-1.0.centos64.x86_64.rpm
rpm -ivh mesos-0.20.0-1.0.centos64.x86_64.rpm

curl -sSfL http://downloads.mesosphere.io/master/centos/6/mesos-0.20.0-py2.6.egg --output /tmp/mesos.egg
easy_install --allow-hosts pypi.python.org /tmp/mesos.egg


設定

/etc/mesos/zkファイルを以下のように変更します。

zk://localhost:2181/mesos

zk://10.0.0.1:2181,10.0.0.2:2181,10.0.0.3:2181/mesos

Mesosサーバー全台共通でこの設定を行います。

mesos-masterはZooKeeperにより選出されるので
Mesosサーバーはmesos-master,mesos-slave関係なく全台共通の設定を行います。

OS再起動

最後にMesosサーバー全台でOS再起動を行います。
MesosはOS起動時に自動起動するようになっているのでOS再起動を忘れず実施してください。

Mesos動作確認

OS再起動後、mesos-masterが正常に稼働しているか確認します。

curl -i 10.0.0.1:5050/master/health


表示例

HTTP/1.1 200 OK
Date: Thu, 04 Sep 2014 00:00:01 GMT
Content-Length: 0

200OKが返ってくれば正常に動作しています。

Mavenセットアップ

ダウンロード&インストール
ChronosのインストールでMavenを使用するためセットアップします。

cd /usr/local/src
wget http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz

tar zxvf apache-maven-3.2.3-bin.tar.gz
export M2_HOME=/usr/local/src/apache-maven-3.2.3
export M2=$M2_HOME/bin
export PATH=$M2:$PATH


Chronosセットアップ

ようやくChronosのセットアップです。

ダウンロード&インストール

ln -s /usr/local/lib/libmesos.so /usr/lib/libmesos.so
cd /usr/local/src
git clone https://github.com/airbnb/chronos.git
cd chronos
mvn package


表示例

(略)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:25 min
[INFO] Finished at: 2014-09-03T00:00:01+09:00
[INFO] Final Memory: 18M/81M
[INFO] ------------------------------------------------------------------------

このような表示になると完了です。

Chronos起動

いよいよ起動です。
※起動にはMesosとZooKeeperが既に起動していることが条件ですので事前にこれらのプロセスを確認しておいてください。

cd /usr/local/src/chronos
java -cp target/chronos*.jar com.airbnb.scheduler.Main --master zk://10.0.0.1:2181,10.0.0.2:2181,10.0.0.3:2181/mesos --zk_hosts localhost:2181


Chronos管理画面

f:id:tsunokawa:20140904150641p:plain


f:id:tsunokawa:20140904150754p:plain

http://10.0.0.1:8080/
この管理画面からジョブの登録、削除、確認などが出来ます。



Mesos管理画面

f:id:tsunokawa:20141014195252p:plain

http://10.0.0.1:5050/
Mesosのステータスが確認出来ます。
mesos-slave3台が登録されていることが確認出来ます。


ジョブの分散
実行されたジョブがどのmesos-slaveサーバーで実行されたかも確認することが出来ます。
f:id:tsunokawa:20141020140002p:plain
「testjob」というジョブが合計5回実行されましたが、
5回中3回は10.0.0.1サーバー、残り2回は10.0.0.2サーバーでそれぞれ実行されています。
ちゃんと分散されていることが分かります。