複数のフロントエンドサーバーへのコードの展開


8

共通のデータベースを指す複数の負荷分散サーバーがある状況があります。

通常の実行では、これは正常に機能し、冗長性、スケーラビリティなどを提供します。

ただし、展開は少し面倒な作業です。

私たちはさまざまな機能を使用しており、展開の自動化を試みています。現時点での展開はあまり信頼できません。

簡略化された形式では、各サーバーのデプロイスクリプトには2つの段階があります。

  1. ファイルを更新する

  2. 機能を元に戻す(依存関係、設定変更などを管理します)

複数のサーバーを一貫性のない状態にせずに展開するためのベストプラクティスはありますか?

手順1と2をサーバーAに展開するかどうかを確認すると、サーバーBが壊れます。両方のサーバーで手順1を試してから手順2に進むと、しばらくの間両方が壊れます。

回答:


6

おそらくAegirを検討する必要があります。これは、これまでで最も柔軟で強力なDrupalサイト管理/デプロイメントシステムです。アクロの複数のWebヘッドにまたがる「プラットフォーム」、または「クラスター」、およびその他のさまざまな構成を管理できます。

私は彼らの一読を持つことをお勧めしたいコミュニティのドキュメント、一般的にかなり良いです、などを読んmig5の優れた概要と紹介記事などで彼の他の記事のいくつかのこの1

また、#aegir IRCチャンネルでも優れたサポートを得ることができます。

これはワークフローの変更になるので、気が付くまでに少し時間がかかる可能性がありますが、一度そこに戻ると、振り返ることはできません。


おかげで、これは興味深いですが、予想していたより大きな変更になる可能性があります。私たちのサイトは1つしかないので、Aegirはやりすぎであり、複雑さのレベルが1つ高くなっています。
ジェレミーフランス語、

結局これを行うかどうかはわかりませんが、非常に良いオプションのようです。
ジェレミーフランス語、

私はそれを強くお勧めします。あなたの仕事が小さすぎてaegirのようなものを必要とすると考えるのは、それを見るには間違った方法です。Aegirは、小規模および大規模プロジェクトに適しています。drupalサイトを展開する必要がある場合は、Aegirが適しています。限目。(IMO)
トムカークパトリック

4

私たちの会社では、Drupalサイトをたくさん維持していますが、現在の設定は次のようになります。

  • すべてのサイトのコードベースには独自のgitリポジトリがあります
  • 次のリリースで十分に安定しない可能性が高い新機能は、gitで独自の機能ブランチを取得します

上記のことは、ほとんどのDrupalサイトでかなり一般的です。

私たちが私たちの特別なことは、カスタムのdrushコマンド-'Drush Debian Packaging ' を使用して、デプロイメント用のサイトをdebianパッケージ化することです。

Drush Debianパッケージは、DrupalサイトをDebianまたはUbuntuサーバーにデプロイする手段として、DrupalサイトのDebianパッケージを構築するためのDrushコマンドを提供します。

Drush Debianパッケージングは​​、Drupalフックシステムを利用して、サイトのニーズに最適なDebianパッケージを構築します。機能は次のとおりです。

  • Apache2およびNginx Webサーバーの自動仮想ホスト構成
  • /etc/cron.dでのcronのセットアップ
  • サイト/デフォルト/ファイルのパーティション分割による自動コード展開
  • dpkg debconf設定ツールによる自動構成
  • 自動展開プロセス
  • GitからパッケージをビルドするためのカスタムGit VCSハンドラー

これは何を意味するのでしょうか?

リリースをビルドするには:

cd /path/to/drupal-root
drush dh-make

リリースをデプロイするには、最初に.debをクラスター内のすべてのWebサーバーにSCPします。次に、すべてのWebサーバーで実行します(Linuxパッケージcsshを使用して、ファーム内のすべてのサーバーに同時にコマンドを入力できます)。

sudo dpkg -i drupal-site-yoursitehere.2011.05.25-1.all.deb

1つのWebサーバーで次を実行します。

cd /path/to/drupal-root
sudo -u drupal-site-yoursitehere drush updb && drush fra -y && drush cron

できた

もちろん、これをコードベースの観点からロールバックするのは簡単です。以前のバージョンの.debをすべてのWebサーバーにインストールし、データベースをロールバックするだけです。

これについての質問に答えて幸せ


それは素晴らしい方法です!このワークフローを設定する前に、Aegirを調べましたか?
アンディ

Aegirは、すべてのWebサイトを同じクラスターでホストする場合に最適ですが、Webサイトを別々の物理ホストに展開する場合には役立ちません。私はaegirをこのセットアップの競合相手とは見なしていません。実際、まもなくホストマスターインストールとerushのプラットフォームをdrush debainパッケージで展開します
wiifm

3

展開プロセスのどの部分が面倒/信頼できないのですか?

それが「サーバーAを更新してからB /不整合を更新する」問題である場合、プッシュの期間中メンテナンスページを表示するのはどうですか?メンテナンスページをアップ、両方のWebヘッドでコードを更新、そのうちの1つで update.phpを実行、メンテナンスページをダウン これはかなり簡単にスクリプト化できます。

別のオプション:実行するサイトの種類に応じて、すべてのユーザーをオフラインで起動し、ログイン/登録を無効にする「読み取り専用モード」を作成できます。DBを同じdbボックスの2番目のDBに複製し、フロントエンドを新しいdocrootに複製し、そこで更新を行ってから、Apacheのdocrootを新しいフロントエンドdocrootにシンボリックリンクします。ワークフローは次のようなものです。

  1. 読み取り専用モードがオン
  2. SELECT current_db INTO new_db
  3. cp -R current_docroot new_docroot
  4. new.yourdomain.com ==> / new_docroot
  5. コードをnew_docrootに更新する
  6. update.php
  7. symlink / new_docroot ==> current_docroot
  8. 読み取り専用モードがオフ。

興味深いアイデアです。オフラインにするための+1です。私たちはいつでも簡単にデプロイできることを目指していました。オフラインにすると、リリースウィンドウについて考えるようになりますが、それを行うには非常に信頼できる方法です。
ジェレミー・フレンチ、

それはすべて、何をデプロイするかに依存します。たとえば、CSSの変更は最小限の影響でライブで展開できます(発生する必要があるキャッシュの更新を除く)。
Entendu、2011年

おっと、改行するつもりです。上記のオプション#2は、Hudson / Jenkinsでスクリプト化してクォーターバックすることができます。これがどのような種類のサイトであるか(100%ログインしたユーザーですか?ほとんどが匿名ですか?)と、訪問者への予想される影響にどの程度依存します。
Entendu、2011年

2

Entenduが示唆するように、それはあなたが行っている変更に依存します。データベースがまだ更新されていない場合、エラーを発生させずに実行できるコード更新の割合はどれくらいですか?データベースの更新に依存しないものについては(そして開発プロセスを少し変更してこれをより一般的にすることができます)、実際に特別なことはありません。最小限のダウンタイムでデプロイメントを実行することを想定しています。それ以外の場合は、基本的な同期操作が必要になります。この場合、(読み取り専用モードでサイトを使用している場合でも)望ましくない影響のある時間枠が常に存在しますが、ほとんどの場合はかなり短いと思います。

各サーバーに「新しい」ディレクトリを事前に設定し、それらすべてを同時に切り替えて新しいディレクトリを指すようにするなどの基本的な最適化を行うことができます(おそらくEntenduの回答のようなシンボリックリンクを使用)。サーバーは5〜10秒以内に新しいファイルに切り替えました。

データベースの更新の問題が残ります。それらが1つのサーバーからのみ実行する必要がある種類である場合は、他のサーバーをメンテナンスモードにするか、ロードバランサーを調整して、この間それらを使用しないようにすることができます。もちろん、ユーザーがサイトでアクティブなときにそれらを実行できない場合は、すべてをメンテナンスモードにする必要がありますが、単純な更新の場合、これは約30秒以下で実行できるものになる可能性があります。

変更の種類ごとに異なる展開スクリプトを用意することは価値があるため、ファイルのコピー、小さなデータベースの更新の実行、データベースの大きな変更など、必要な最小限のプロセスを実行できます。

ファイルとデータベースの更新を最適化して、開発方法に簡単な変更を加えることができるかどうかを確認できれば、近づく可能性がありますが、これが新しいものかどうかはわかりません。


0

Aegirは、サイトのネットワークの管理に役立ちます。私はそれを使用して、単一のクライアントに対して2000を超えるサイトを展開および管理しました。

あなたの質問は、複数のウェブヘッドを持つ単一のサイトを管理したいことを示唆しています。その場合、Aegirはあまり役に立ちません。代わりに、ネットワークをサポートするファイルシステムの使用を検討することをお勧めします。これにより、コードの同期が保たれるだけでなく、すべてのノードでアップロードを利用できるようになります。

歴史的に人々はNFSを使用して、1つのサーバーのファイルシステムを他のノードと共有することができました。残念ながら、これにより単一障害点が発生します。NFSサーバーがロックしたり、停止したりすると、サイトにサービスを提供できないためです。

より信頼性の高いサーバーを優先してioパフォーマンスを少し妥協しても構わない場合は、GlusterFSをお勧めします。いくつかの実稼働環境で使用しました。完璧ではありませんが、NFSよりも優れています。Glusterを使用すると、ウェブヘッドは常にローカルで読み取り、書き込みは他のノードに複製されます。

展開戦略に関しては、リストの最初のツールとしてdrushを使用する必要があります。Drushを使用すると、デプロイメントのステップを自動化できるはずです。展開ジョブを追跡し、問題が発生した場合のパターンを特定できるように、Jenkinsをミックスに追加することを検討する必要があります。Capistranoは、デプロイメントに関連するステップを自動化するのに役立ちます。物事を適切に実行すれば、ユーザーが展開を行ったことをユーザーに知られないようにすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.