現在、PHPを実行する(Centos 7上の)NGINX用の高可用性クラスターを作成しています。ほとんどの構成はマップされており、クラスター環境でうまく機能するはずです。
残念ながら、クラスタリングでニースをプレイするために理解できない唯一のことはcronジョブです(cronジョブはPHPコードを実行します)。私の知る限り、cronジョブは各ホストで個別に実行されます。これは、次のいずれかを意味します。
solution 3が高可用性環境を維持するのにどのように役立つか、つまりを推奨メソッド。残念ながら、私たちはこれらのソリューションの一部についてはあまり詳しくありません。そのため、私たちのニーズに適したソリューションを見つけるのを手助けする専門知識を求めています。私たちはLinuxマシンにあまり慣れておらず(環境全体はNGINXサーバーを除いてWindowsです)、これらのマシンでの作業についてはほとんど知りません(ただし、これまでにそれを理解することはできました)。
これに関するどんな助けでも大歓迎です。
この質問が尋ねられたと思います before 、それはかなり古くなっているようですが(2011)、それ以来多くの新しいソリューションが作成されました。
RHEL/CentOS 7のcrond
には、クラスタリングのサポートが含まれています。それは実際にはcronie
であり、由緒あるvixie-cron
のフォークです。以下は、manページの詳細です。
クラスター化のサポート
このバージョンのCronでは、ホストのクラスター全体でネットワークにマウントされた共有の/ var/spool/cronを使用し、一度に1つのホストのみがこのディレクトリでcrontabジョブを実行するように指定できます。これは、-cオプションを使用してCronを起動し、/ var/spool/cron/.cron.hostnameファイルに、クラスター内のホストがジョブを実行する必要があるホストのホスト名を表す1行だけを含めることで行われます。このファイルが存在しない場合、またはファイル内のホスト名がgethostname(2)によって返されるホスト名と一致しない場合、このディレクトリ内のすべてのcrontabファイルは無視されます。これは、/ etc/crontabファイルで指定されたcronジョブまたは/etc/cron.dディレクトリ内のファイルには影響しません。これらのファイルは常に実行され、ホスト固有と見なされます。
/var/spool/cron/.cron.hostnameを直接編集するのではなく、crontab(1)の-nオプションを使用してホストを指定します。
クラスター内のすべてのホストと、それらが共有crontabディレクトリーをマウントするファイルサーバーが、例えばntpd(8)を使用して、クロックが厳密に同期していることを確認する必要があります。そうしないと、結果が非常に予測不可能になります。
実際には、このアプローチには以下が必要です。
crond
を-c
フラグで開始します(/ etc/sysconfig/crondにCRONDARGS=-c
を配置)。そしてcrontab -n
を実行して引き継ぎます。警告に注意してください:このソリューションは、/ var/spool/cron内のcronジョブのみをクラスター化します(つまり、crontab -e
で設定)。すべてのノードは引き続き/ etc/crontabまたは/etc/cron.dで個別のジョブを実行します。
なぜあなたのオプション(2)ではありませんが、実行中にフラグを作成します。 cronジョブはすべてのマシンで開始されますが、ローカルタイミングのわずかな変動により、最初にフラグが作成されます。その後、他のユーザーはフラグが設定され、救済されるのを確認します。
フラグの設定/チェックの原子性に注意を払う必要があります(NFSもここではオプションであり、ロックファイルを使用します)。ただし、これを最小限に保つために、どちらかに値がある場合もあります。