cron の冗長化法について調べてみた #cron
Apache Mesos はすごいプロダクトだと思うのですが、単にジョブスケジューラを冗長化するという用途に対しては、やや牛刀な感があるツールだと言えるでしょう。
一方で、バッチサーバの冗長化というのは、割と見過ごされがちなポイントではあると思います。
そこで、もっとライトな方法でこれを実現できないかと少し調べていました。
そこから派生して、cron の冗長化についていくつか情報を得たので、以下にまとめてみます。
(1) 実は cron 自体にクラスタリングの機能がある
http://man7.org/linux/man-pages/man8/cron.8.html#CLUSTERING_SUPPORT
上の Man ページに記載の通りです。
ただし、実は cron 自体の実装には Linux Distribution やバージョンによって差異があります。上は fedora の cronie というプロジェクトの Man です。
https://fedorahosted.org/cronie/
ChangeLog によると 2010年10月にクラスタリング機能がサポートされたようで、もう4年以上も経っていることに驚きました。
が、広く使われている cron は、vixie-cron で、cronie はその fork とのこと。
RHEL 6 では vixie-cron に代わって cronie が使われるようになりました。
しかし、手元の CentOS 6.5 の環境では、バージョンが古く -c
オプションはサポートされていませんでした。
cronie による cron の冗長化
上記 Man ページの通りですが、簡単に仕様を書いておきます。
- crond を
-c
オプションを付けて起動する - クラスタ化されるのは
/var/spool/cron
以下の crontab ファイルのみ/etc/crontab
や/etc/cron.d/
以下は対象外 = 各ホストで実行される
- クラスタ内のホストで
/var/spool/cron
をネットワーク共有(mount)する /var/spool/cron/.cron.hostname
ファイルを置く- ファイルには cron ジョブを実行したいホストの hostname のみを1行で記述する
- ファイルが存在しないか、ホスト名が一致しない場合、ジョブは実行されない
ただ、この仕様だと、プライマリのホストがダウンした際に、別ホストにフェールオーバさせるには、/var/spool/cron/.cron.hostname
を書き換える必要がありそうです。
後述の keepalived を使う方法と組み合わせると、それも実現できそうです。
(2) rcron
rcron は Google Code 内にあるプロジェクトで、cron に冗長性(=Redundancy)を付与するものです。
実体は rcron という小さな実行ファイルのようです。
https://code.google.com/p/rcron/
基本的には、cronie のように active/standby 構成を実現します。
cron に登録するジョブは下のように rcron 経由で実行するように設定します。
0 * * * * /usr/bin/rcron myjob
ジョブは active 機では実行されますが、standby 機では実行されません。
その制御は設定ファイルと、サーバの状態を表す state_file
で行われます。
rcron は state_file
の内容によって、自身が active か否かを判定します。
その state_file
を常に最新の状態に保つには、keepalived などの外部ツールを使うように、とドキュメントに書かれています。
(3) cron サーバを二重化する
上の2例と異なり、cron の機能はそのままに、cron ファイルの同期と keepalived によるサーバの冗長化の組合せで cron の冗長化を実現している例がありました。
https://www.spicysoft.com/blog/spicy_tech/001252.html
概要のみ以下に記します:
- 2台のバッチサーバで active/standby 構成を組む
- サーバ間で
/var/spool/_cron
を同期。 - active 機には
/var/spool/cron => /var/spool/_cron
の symlink を設置 - 2台に keepalived を設定する
- フェールオーバ時、active 機の symlink を削除し、standby 機に symlink を作成
まとめ
実を言えばこれまで cron ファイルのバックアップは実施していたものの、cron 自体の冗長構成については考えたことがありませんでした。
これを調べたのは Mesos を知ったことがきっかけでしたが、思った通りお手軽な方法があるようなので、機会があれば実運用に載せてみたいものです。
参考
- 4.17. Cron
- RCRON - Setup High Availability of cron Jobs ... rcron の紹介記事
- Cron - Gentoo Wiki ... vixie-cron, cronie 以外にもさまざまな cron の実装が紹介されています。