読者です 読者をやめる 読者になる 読者になる

weblog of key_amb

主にIT関連の技術メモ

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 を知ったことがきっかけでしたが、思った通りお手軽な方法があるようなので、機会があれば実運用に載せてみたいものです。

参考