やりたいこと
物理、仮想含め数百台のサーバーを管理しているので、
- cronを一括管理したい
- cronジョブの負荷を分散したい
- cronの結果を可視化(成功or失敗)
- Dockerコンテナのcronを外出ししたい
- Dockerコンテナが作成または削除される度にcron登録・削除をAPIで行いたい
これらを実現したいと思っていました。
そこで『Chronos』です!
結論から言うとChronosを使ってこれらを実現することができました。
Chronosとは
そこでChronosって何?という話しになりますが、
Cronの置き換えを想定したジョブスケジューラです。
airbnb/chronos · GitHub
Mesos上で動くので登録されたジョブをいい感じに分散して実行してくれます。
図にするとこのような感じだと思います。
検証環境
本エントリで例として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
Mesos管理画面
http://10.0.0.1:5050/
Mesosのステータスが確認出来ます。
mesos-slave3台が登録されていることが確認出来ます。
ジョブの分散
実行されたジョブがどのmesos-slaveサーバーで実行されたかも確認することが出来ます。
「testjob」というジョブが合計5回実行されましたが、
5回中3回は10.0.0.1サーバー、残り2回は10.0.0.2サーバーでそれぞれ実行されています。
ちゃんと分散されていることが分かります。