大規模な環境でFreeBSDのポートをどのように管理および展開しますか?


19

FreeBSDのポートを環境にどのように展開しているのか興味があります。私はFreeBSDを使用しているほとんどの人が実際にPortsを使用していると仮定しています(そして、しばしばバイナリでアップグレードするためにportupgrade)。しかし、最近のバージョンでの動作に満足していないため、このセットアップの方法に興味があります。私は現在FreeBSD 9.0を実行していますが、問題があります。

次のように設定しました。

  • / usr / portsは、1つのノードからNFSを介して共有されます(夜間の「portsnap fetch update」を使用)。
  • 各ノードは、読み取り/書き込みで/ usr / portsをマウントします
  • すべてのノードで/etc/make.confに「WRKDIRPREFIX = / usr / tmp」を設定しました
  • 以下を/usr/local/etc/pkgtools.confに追加して、ローカルインデックスを使用するようにPortsnapを構成しました。

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

portupgrade -p packageパッケージをビルドportupgrade -P packageし、他のノードにバイナリをインストールするために正常に実行できます。

それでも、次の問題が発生する場合があります。 /var/db/INDEX.local:23265:dbm_store failed

インデックスは現在ローカルに存在し、実際にエクスポートされるのはポートツリーのみであり、ノードからそこに何も書き込まれないため、システムに対して行うことができる他の最適化は考えられません。


1つのオプションは、すべてのノードに完全なローカルポートツリーを持つことです(そして、おそらく 'distfiles'と 'packages'をマウントするだけです)が、これはスペースの大きな浪費のように感じます(多くの不必要な更新は言うまでもありません)。
vpetersson

vpeterson:これは尋ねる必要がある質問です(今のところブロックされています。+ 5票と3つ星は私たちが一人ではないことを示唆しています)。おそらくこの質問を整理し、解決しようとしている特定の問題をいくつか述べてください。(FWIW、誰かがあなたの質問を終了するために投票しました。個人的に私はこれ、または同様の質問が保存されるのを見たいです)。
ステファンLasiewski

質問をより明確にする方法がわかりません。また、@ voretaq7が実際に質問に答えるとは思わず、代わりの方法を提案します。質問は、トピックが示唆するもの、つまり、FreeBSDのポートをマルチノード環境にどのように展開するかについてです。
-vpetersson

回答:


13

私は大規模な環境のポートシステムに完全に満足したことはありませんでした。うまく機能させるためには、外部管理を適用する必要があるようです。

私の最高のヒント(昇順の優先順位、「最悪」のソリューションから「最高」のソリューション):


各ホストでビルドしている場合は、しないください
必要に応じて、NFSを使用して、説明したような読み取り/書き込みマウントを行わないでください。通常、代替の作業ディレクトリを提供する場合は、ポートツリーを踏みつけずにDo The Right Thingのポートを信頼できますが、申し訳ありませんが安全です:ローカルCVS / csupミラーを実行し、そのボックスからすべてのホストをcsupし、個々のマシンの場合と同じようにローカルでビルドします。
はい、これはホストのディスク容量を増やすことと追加のステップを意味します。また、問題がないことがほぼ保証されています。
警告: パッケージ構成ファイル(rsyncなど)を指定された「構成ホスト」から同期して、各マシンの整合性を確保することができます(各ノードでcsupを使用するのではなく、必要に応じてポートツリー全体をrsyncすることもできます)。


ビルドホストを使用してパッケージを作成し、それらをインストールします。
個々のマシンでビルドするよりもはるかに優れたソリューション:ビルドホストを使用してパッケージを作成し、それらのパッケージにツールを向けます。
これは、実行するすべてのアーキテクチャでビルドホストを維持すること(またはクロスコンパイル)を意味しますが、最終的にはターゲットマシンに適しています(大規模なコンパイルジョブなし、一貫性の保証)


構成/システム管理ツールを使用します。
これが私が巻き上げたソリューションです。標準のサーバーイメージを構築し、を使用して自分の環境に展開しradmindます。PuppetまたはChefでも同様のことができます。これには、ビルドホストを使用するすべての利点(一貫性、個々のサーバーの負荷の軽減)があり、構成管理の利点が追加されます。

警告:これは、マシンが「同一」である場合にのみ非常にうまく機能します。つまり、すべてのマシンに同じポートセットをインストールできます。それはできますが、ポートのセットを変化させた場合は動作しますが、ということは、実質的に管理オーバーヘッドが増加します。

免責事項:私はのポートメンテナーですsysutils/radmind。ええ、私はそれを採用したことをとても気に入っています。


これらはすべて、さまざまなサイズのFreeBSD環境(1〜2台のマシンから100台以上まで)を管理した私の経験に基づいています。標準化されたイメージをプッシュおよび維持する構成/システム管理ツールは、私の経験でこれを実際に処理する最良の方法です。


良いポインタ。私は過去にPuppetで少し遊んだことがあり、Ubuntuで気に入っています。それでも、FreeBSDでどれだけうまく機能するかはわかりません。まだ試していません。とにかく、Puppetでさえ、Portupgradeが必要だと思います。pkg_delete / pkg_addまたは 'pkg_add -f'を実行する必要があるため、これが機能する他の方法は見当たりません。ハードウェアに関しては、パブリッククラウド(KVM / Qemu)で実行されるため、すべて同一です。
vpetersson

ハードウェアとベースラインソフトウェアの構成が同一であれば、radmindのようなシステムイメージ全体を管理することをお勧めします。PuppetとChefは優れたツールですが、指摘したように、それらは基盤となるOSバイナリを呼び出すため、ビルドホストの使用とパッケージの配布に戻ることになります。radmindは、代理システム管理者(「これらのコマンドを実行/これらのファイルを構成するためにこれらのファイルを変更する」ボックス")。
voretaq7

システムのハードウェアは同じですが、構成は同じではありません。Radmindを検討する必要がありますが、それが最善のアプローチであるかどうかはわかりません。組み込みのツールを使用すると、IMHO 機能するはずです。そのため、コミュニティに手を差し伸べて、明らかな何かを見逃していないかどうかを確認します。これをしようとしているのは私だけではありません。
-vpetersson

ビルトインツール間違いDO彼らは本当に一台のマシンを管理に向けている、とだけでなく、彼らはできる限り縮小していない-仕事を、彼らは多くの援助(などの構築サーバー、パッケージのローカル分布を、)が必要です。独自のfreebsd-updateサーバーローリングするオプションは省略したことに注意してください。これはベースシステムだけで試したことはありませんが、理論的には可能です。私はちょうど私が仕事を知っているものに固執しました:)
voretaq7

ええ、それは実際に面白いアイデアです。あまり変更せずにports-packagesを配布できるかどうかはわかりません。FreeBSDの大規模な展開がたくさんあるため、私は大規模システムのシステム管理者がこれをどのように管理しているかに本当に興味があります。それらはすべて独自のソリューションを展開していますか?もしそうなら、それはかなり奇妙に感じられ、あまりオープンソースっぽくない。
vpetersson

6

奇妙なことに誰もports-mgmt / tinderboxについて言及していませんでした

Tinderboxは、FreeBSDポート用のパッケージ構築システムであり、pointyhat構築クラスターで使用される公式のPortbuildスクリプトに基づいています。TinderboxはJoe Marcus Clarkeによって書かれました。

複数のjail(ベースシステムバージョン)と複数のポートツリーを定義できます。jailとportstreeの組み合わせは、ビルドと呼ばれます。Tinderboxの刑務所は、FreeBSDで刑務所として理解されているものではなく、実際にはchrootの特定の世界です。Tinderboxは依存関係の自動追跡をサポートし、最後の実行以降に変更されたパッケージのみを再構築します。Tinderboxは、失敗したビルドの電子メール通知をサポートしています。Tinderboxはccacheともうまく統合します。

Tinderboxは、必要なプラットフォームおよびアーキテクチャ向けに、必要なポートのパッケージセットを簡単に提供するように設計されています。Tinderboxは、特に依存関係とパッキングリストをテストするための、新しいポートとポートのアップグレードをテストするための優れたツールでもあります。また、FreeBSD 6.XワールドをFreeBSD 7.X / 8.Xホスト上でjailとして実行できるため、FreeBSDのさまざまなリリースでポートをテストするのにも役立ちます。

また、pkgngに切り替えると、パッケージの展開が大幅に簡素化されます。
githubで確認してください:https : //github.com/pkgng/pkgng


1
これは確かに、さまざまな環境(複数のバージョン、アーキテクチャなど)で実際のパッケージを構築するのに便利かもしれませんが、パッケージを展開する問題を実際には解決しません。
-vpetersson

あなたは、展開液(例えばセットを取得するためにvoretaq7の回答に対するコメントでこれを組み合わせることができますので、Tinderboxのは、HTTP経由でパッケージが利用できるようにするPACKAGEROOT/ PACKAGESITE及び利用radmindや人形/シェフ)。
ジェームズオゴーマン

はい。ただし、パッケージの構築と配布は問題ではありません。portupgrade(-p)を使用してパッケージをビルドし、NFS経由で(ports-treeの有無にかかわらず)配布できます。問題は、このモデルでは、a)完全なポートツリーをローカルで、またはb)NFS経由でエクスポートされたポートツリーが必要であり、手元の問題に戻ってしまうことです。
vpetersson

2
Portupgradeは、ソースからビルドする場合やバイナリパッケージを使用する場合に必要なことを正確に行いますpkg_delete。最初に実行してから新しいバージョンをインストールする必要があります。OpenBSDは、にアップグレードオプションを含めることで、これをより適切に処理しましたpkg_add。Portupgradeについてはわかりませんが、portmasterは完全なポートツリーではなくINDEXを使用するだけで機能します。
ジェームズオゴーマン

1
正しいですが、pkg_deleteはほとんど合理的なアプローチではありません。Ruby、Python、または他の多数のパッケージの前提条件である他のパッケージをアップグレードするとします。pkg_deleteでは、すべての依存関係を削除する必要がありますが、これは実稼働システムのオプションではありません。Portupgradeはこれではるかに良い仕事をしますが、再び、それはスケーリングするようには見えません。
vpetersson

3

適切に調整されたNFS上で/ usrを読み取り専用で共有し、パッケージデータベースを/ varから/ usrに移動してシンボリックリンクするだけで、100以上のFreeBSDサーバーを管理しました(厳密には必要ありませんが、pkg_infoなどを有効にします)。ある方向または他の方向に移動してシンボリックリンクする必要のある他のファイルが1つまたは2つあったかもしれませんが、全体のセットアップを理解するのに約1時間かかりました。とてもうまくいきました。スケーリングの問題が発生した場合、NFSサーバーを追加してワークロードを分割していましたが、それは実現しませんでした。パフォーマンスは私にとって決して問題ではありませんでした(実際、それは素晴らしいものでした)が、NFSサーバーの/ usr(またはそのコピー)をmdに置くことができると思います。


ビルドされたパッケージファイルをNFSで共有する(これはあなたが話しているように聞こえますが)確かに別の合理的なアプローチです-その後、パペット(または自家製のSSHとシェルスクリプト)のようなものを使用してパッケージをインストール/アップグレードできますNFS共有から。
voretaq7

1

残念ながら、これに対する良い解決策を誰も得ていないようです。ほとんどの場合、これは下敷きツールの制限によるものです。

ここに私が思いついたものがあります:私はports-tree全体をエクスポートするという考えを捨てました。代わりに、各ノードに完全なポートツリーを追加しました。次に、「パッケージ」をNFS経由でマウントしました(パッケージの配布を可能にするため)。

また、portnapプロセスを高速化するために、キャッシングプロキシ(おそらくSquid)を利用するつもりです。これをセットアップする方法についての短い投稿をブログに書きました。

参照:

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