web-dev-qa-db-ja.com

多数の構造化構成/プロパティファイルを処理するためのベストプラクティス

サーバーが多数あるシステムを想像してみてください。それぞれにいくつかの設定があります。

  • サーバー固有のもの
  • 地域に固有のもの
  • それらすべてに共通するもの
  • たぶん、このグループのサーバーは読み取り専用であるため、いくつかのカスタムグループを作成できます
  • 等.

私が現在心がけているのは、オーバーライド機能を備えたシンプルなプロパティ構造です。

例として、Googleサーバーを取り上げましょう。それぞれに、ロードする設定のリストがあります。

たとえば、ロンドンのサーバーには次のようなものがあります。

rootsettings.propertieseuropesettings.propertieslondonsettings.propertiessearchengine.propertiesなど.

各ファイルに一連のプロパティが含まれていて、読み込みシーケンスでプロパティをオーバーライドできる場合は、さらに先に進みます。

例えば: rootsettings.properties がある可能性があり accessible=falseはデフォルトとして使用されますが、searchengine.propertiesaccessible=true


私がこの構造で抱えている問題は、制御不能になるのが非常に簡単なことです。これはまったく構造化されていないため、任意のレベルで任意のプロパティを定義でき、多くのアイテムが廃止される可能性があります。

さらに、非常に多数のサーバーに影響を与えるため、ネットワークが拡大するにつれて中間レベルを変更することは不可能になります。

最後に重要なことですが、個々のインスタンスごとに1つの特別なプロパティが必要になる可能性があります。つまり、ツリーはいずれにせよ各サーバーの構成になるため、最適なソリューションとは言えません。

より良い構成管理アーキテクチャの提案/アイデアがあれば、私は大いに感謝します。

15
SDekov

最初にいくつかの質問をして、いくつかのポイントを明確にする必要があると思います。そうすれば、問題を解決する方法をより適切に決定できます。

最初に:誰がサーバーを制御する必要がありますか?

  • 何百ものサーバーを管理するのは1人の管理者ですか?次に、構成をできる限り集中化する必要があります。

  • または、各サーバーが個別の管理者の制御下にある可能性がありますか?次に、分散構成に焦点を当てる必要があります。各管理者が最大数のサーバーを管理する必要がある場合でも、これは手動で管理できます。

第二:本当にたくさんの設定オプションが必要ですか、それとも数個に抑えることができますか?すべてをすべて設定可能にする代わりに、あなたのシステムが本当に必要と知っているオプションに自分自身を制限する方が良いでしょう。これは、例えば、

  • ソフトウェアを少し賢くしますか(たとえば、プログラムは環境を尋ねることによって何を自動的に決定できますか)?

  • 「構成上の規約」に厳密に従う-たとえば、特定の命名規則を確立することによって、または他のオプションからデフォルトとしていくつかのオプションを導出することによって

3番目:ソフトウェアにハードコード化された構成の階層レベルが本当に必要ですか?ある場合、サーバーの数が事前にわからない場合を想像してください。ツリーのような階層は、実際にはそれらにとって最良の構造、またはツリーに必要なレベルの数です。私が考えることができる最も簡単な解決策は、一元化された構成をまったく提供せず、サーバーごとに1つの構成ファイルのみを提供することです責任のあるサーバー管理者が自分で決定するようにします複数の構成の管理の問題を解決する方法サーバー。

たとえば、管理者は、中央の構成ファイルを異なるサーバーのグループに配布し、各コピーに若干の変更を加えるジェネレータースクリプトを作成する場合があります。このようにして、「サーバー分散トポロジ」について事前に想定する必要はありません。トポロジはいつでも実際の要件に合わせて調整できます。欠点は、Perl、Python、Bash、Powershellなどの言語でスクリプトを作成する方法についてある程度の知識を持つ管理者が必要なことです。

5
Doc Brown

私は個人的に設定ファイルの継承が好きではありませんでした。読み込みシーケンスがあるとおっしゃっていますが、それがどのように定義または導出されているかはわかりません。多分それはあなたがファイルを入れるディレクトリ構造でそれをミラーリングするか、それをファイル名に含めることによってシーケンスを明白にするのに役立ちます。

rootsettings.properties
rootsettings.eurosettings.properties
rootsettings.eurosettings.londonsettings.properties

これは、リージョンに合わせていない構成値の集約があるところまではある程度機能します。したがって、選択する組織軸に配慮する必要があります。

さらに私が気に入っているのは、構成値の集合体を独自のファイルに分離し、(リーフ)構成ファイルが1つのファイルを指すようにすることです。

例:

bigcity.searchsettings.properties
regional.searchsettings.properties

内部londonsettings.properties次のような値を設定できます:

searchsettings:bigcity.searchsettings.properties

これにより、より多くの自由度または追加の自由度が可能になります。

2
Joppe

私は同じ問題を抱えており、私のソリューションをオープンソース化しました。ソースコードはこちら https://github.com/Bikeman868/Urchin

多くのサーバー、各サーバーに複数のアプリケーション、および複数の環境がある大規模なシステムで使用します。これには、構成を管理するためのDartで記述されたUIが含まれています。

地面から降りるのに助けが必要な場合は、直接連絡してください。

私が実装したソリューションはルールベースです。通常、すべての構成に適用される1つのルールから始めて、「この環境のすべてのマシンがこのUNCパスにログファイルを作成する」などのルールを追加できます。ルールは、環境、アプリケーション、マシン、またはアプリケーションのインスタンスに固有のものにすることができます。この特定のサーバーで実行されているこのアプリケーションのこの特定のインスタンスのみのように、ルールをより具体的にすることもできます。

ルールは、最も具体的でないものから最も具体的なものの順に適用され、後のルールは前のルールで指定された値を上書きできます。つまり、たとえば、特定のアプリケーションに適用されるルールを作成し、それを特定のマシンやアプリケーションの特定のインスタンスなどの異なる値で上書きすることができます。

サーバーにはREST + JSONインターフェースがあるため、ほとんどの開発システムで動作し、.Netアプリケーション用の便利なクライアントライブラリも備えています。

2
bikeman868

これらの種類の設定は、管理するのが悪夢です。ソフトウェアコンポーネントにすべてのケースを処理させることにより、可能な限りそれらを削減することをお勧めします。

つまり、リージョンにAPIサーバーを設定する代わりに、API呼び出しでリージョンを渡し、単一のサーバー設定ですべてのリージョンを処理できるようにします。

ただし、現在の状態を前提としています。構成設定を生成するためのシステムをセットアップしないことをお勧めします。すでに複雑な問題に複雑さを加えるだけです。

代わりに、サーバーの種類ごとに展開ツールに設定を保存してください。 (タコの配置設定、teamcityファイルの書き換えなど)これにより、ソフトウェアをアップグレードするときに前回行ったのと同じ構成設定を確実に配置でき、変更をきめ細かく制御できます。

Meta-configファイルに変更を加え、さまざまなリージョン/サーバー/カスタムグループで生成される構成ファイルをテストする必要がある状況になりたくない

1
Ewan

調査なし。すべての個人的な意見、30以上のIT経験。複雑なデータ構造のように聞こえますが、多数のユーザーがいるため、すばやく変更/修正できます。

ユーザーごとに個別の構成ファイルを生成するカスタム抽出プロセスを使用して、データを構造化するデータベースリポジトリ(SQLなど)を検討してください。データベースのクエリを使用して、変更が実装される前に変更の影響を判断できます。重複する発生箇所などを見つけます。個々のフラットファイルが問題の一部です。さらに、変更ログとリカバリ/再構築のサポートを取得できます。データベース制御を使用すると、構成継承の問題を排除できる場合があります。このタイプのソリューションでは、追加のデータベース構造が必要になります。正しい複合キー構造は非常に重要です。

それが私の提案です。

このタイプのサービスを実装する、非常に高価なベンダーシステムのセキュリティおよび制御システムを調べてみてください。それらを考慮してください。一般に、それらは環境に依存します。

0
just.a.guy