13

私たちのアプリケーションはWeb上で実行され、ほとんどが照会ツールであり、いくつかのトランザクションを実行します。Oracleデータベースをホストします。アプリには、顧客ごとに常に異なるOracleのインスタンスがあります。顧客とは、会社の従業員にサービスを提供するために私たちに支払いをする会社であり、通常、顧客1人あたり10,000〜25,000人の従業員です。数百人のお客様をお迎えする予定です。私たちは数年ごとにメジャーリリースを行っており、その新しいリリースへの移行は困難です。お客様のサイトに数週間チームを配置し、新しい機能を説明し、そのお客様に合わせて運転データを設定する場合があります。

コストを削減するために、マルチクライアント化を検討しており、すべてのお客様を大規模なWindowsServer2008サーバー上の単一の共有Oracle11gインスタンスに配置します。それが賢明かどうか疑問に思います。

顧客ごとに個別のインスタンスを持つことにはいくつかの利点があります。これらが偽物かどうか教えてください。重要性の低下についての私の大まかな推測では:

  • お客様のMyCorpとYourCoは、スキーマに重大な変更が加えられたときに別々に移行できます。(マルチクライアントの場合、300人以上の顧客を一晩で移行します!?!)

  • MyCorpのデータは、他の顧客に影響を与えることなく、簡単にバックアップおよび(!!!)復元できます。

  • MyCorpのデータは、開発者がコードを正しく取得したり、DBAが構成を正しく取得したりすることなく、競合他社のYourCoのデータから安全に分離されます。

  • 1人の顧客が災害に遭った場合(誰かが誤って全員の給与を2倍にし、給料日後にエラーが発見された場合)は他の顧客に影響を与えないため、複数のインスタンスのリスクは低くなります。すべてのお客様(おっと、新しいDBA、そして突然すべての参加者が同じSSNを持っている!?!)に影響を与えた災害により、当社が倒産する可能性があります。

  • 1台のサーバーに1つのインスタンスがあると、単一障害点が発生し、ハリケーンによって建物が倒壊した場合、顧客ベース全体が廃業します。複数のサーバー上の複数のインスタンスにより、地理的な分散が可能になります。大災害がお客様の大部分に影響を与えることはなく、他の地域の影響を受けていないサーバーが障害のあるサーバーの負荷を引き受ける可能性があります。

  • データベースが小さいため、パフォーマンスが向上します(10,000行と約50テーブルの2,000,000行)。

  • MyCorpのオフィスが(ほとんど)1つの地域にある場合、MyCorpのインスタンスは地理的に同じ場所に配置できるため、ネットワークの遅延によってパフォーマンスが低下することはありません。同じ理由で、グローバルクライアントにより良いサービスを提供することができます。

  • MyCorpはデータベースを社内に持ち込みたいので、インスタンスを簡単にエクスポートして、MyCorpのデータを取得できます。

  • インスタンスを異なるサーバーに配置できるため、負荷分散が容易になります(これはWebファームを使用します)。

  • DEVまたはQAインスタンスが必要な場合、データがはるかに少ないため、実際のインスタンスのクローンを作成してデータを匿名化する方が簡単です。

  • それらは十分に小さいため、開発者は独自のインスタンスをローカルで実行できるため、VPNの煩わしさを感じることなく、空港で待機している間や飛行中にコードを処理できます。

Q1:個別のインスタンスの他の利点は何ですか?

データベーススキーマを変更し、すべての顧客を1つのOracleインスタンスにマージして、1台の大規模なサーバーで実行することを検討しています。

マルチクライアントインスタンスアプローチの利点は次のとおりです。最も重要なのは最初です(私のWAG)。これらが偽物である場合は、狙撃してください。

  • DBAは、数百ではなく1つのインスタンスを維持するだけでよいため、作業が少なくて済みます。DBAの作業が少ないということは、この変更の主な動機である安価なことを意味します。

  • たった1つのインスタンスで、DBAはパフォーマンスを最適化するためのより良い仕事をすることができます。適切なインデックスを追加し、SQLを確認する時間があります。

  • スキーマとアプリが1つしかないため、開発者はアプリケーションのデバッグと拡張が簡単になります(数百のインスタンスがある場合は、スキーマのバージョンごとに異なるバージョンのアプリがあり、数十のスキーマバージョンが存在する可能性があります)。 )。これにより、コストも削減されます。別の方法は、(1)この顧客が実行しているバージョン、および(2)対応する開発環境、コード、およびデータベースの再作成に苦労して、すべてのデバッグセッションを開始する必要があることです。(各パッチとリリースのコードとデータベースインスタンスを含む仮想マシンが必要です!)

  • オラクルのライセンスは、重さに関係なくサーバーごとに価格設定されているため、より安価です(または何か-私は主題について何も知りません)。

  • インスタンスが1つしかないため、データベースはWebセッションデータの実行可能な永続ストアになります。

  • 一部のデータベース操作は、1つのマルチクライアントインスタンスを使用すると簡単になります。たとえば、参加者(またはその配偶者)がどの顧客のために働いているかについて迷っているときに参加者を見つけることができます。すべての名前が1つのテーブルにあります。顧客間での報告は簡単です。

Q2:1つのインスタンスに複数のクライアントがあることのその他の利点は何ですか?

Q3:どちらのアプローチが良いと思いますか(なぜ)?顧客ごとのインスタンス、または1つのインスタンスのすべての顧客?

マルチクライアントインスタンスが1つあると、移行がほぼ不可能になるのではないかと心配しています。これは取引のキラーです...

...古いものと新しいものの2つのマルチクライアントインスタンスを持つような妥協案がない限り。その場合、参加者の検索やレポート作成などのクロスインスタンスソリューションを設計して、顧客が1つのマルチクライアントインスタンスから次のインスタンスに何も中断することなく移動できるようにします。

4

6 に答える 6

3

Oracle XE (制限付きの無料版) を使用していない限り、サーバーごとに 1 つのデータベースを使用すると、シングル コア、シングル CPU ボックスを購入したとしても、すぐに非常に高価になります。各データベースで CPU と RAM の使用量のオーバーヘッドが発生するため、サーバーごとに複数のデータベースを持つことは非効率的です。競合は診断が難しいため、チューニングはより困難です。

したがって、管理が容易であるだけでなく、単一の大きなサーバーは、多数の個別の小さなサーバーよりも安価に機能するはずです (保証も返金もありません!)。できるだけ大きくて速いチップを購入し、空いているスロットと同じくらい多くの RAM を購入してください。これらは、ライセンス コストに影響を与えずにパフォーマンスを向上させるものです。

余裕がある場合は、パーティショニング オプションを検討してください。これにより、各パーティションに独自のテーブルスペースを持たせることができるため、バックアップとリカバリに関する懸念に対処できます。そのため (client_id によるパーティショニングがあれば)、他のクライアントに影響を与えることなく、個々のクライアントのデータをバックアップまたは復元することが可能になります。個々のパーティションをエクスポートおよびインポートすることもできます。パーティションのプルーニングが VPD では機能しないという David の観察には驚かされます。しかし、私はこのコンボを試したことがないので、彼の言葉を信じます.

統合によって失われる可能性のある 1 つのことは、アプリケーションのさまざまなバージョンでさまざまなクライアントをサポートできることです。ただし、これは必ずしも悪いことではありません。お気づきのように、アプリケーションの個別バージョンをやめれば、数百人の顧客を維持するのはずっと簡単になります。特注の機能を提供する必要がある場合は、個々のクライアントで一部の機能をベータ テストしたい場合でも、11gR2 の Edition-Based Redefinition をご覧ください。これは非常に優れた機能です。また、Enterprise だけでなく、すべての Oracle ライセンスで利用できます。

于 2010-03-09T06:10:17.373 に答える
2

「個別のインスタンス」と言うとき、複数のスキーマを持つ 1 つのインスタンスについて話しているのですか? それとも、単一のマシンで複数のインスタンスが実行されているということですか? 単一のインスタンスで複数のスキーマを実行するのとは対照的に、単一のマシンで複数のインスタンスを実行する理由はほとんどありません。各スキーマには、独自のテーブル、インデックスなどのセットがまだあります。

とにかく、完全な答えはありませんが、心に留めておくべきことの 1 つは、Oracle のライセンス コストと、それが最適なソリューションにどのように影響するかということです。

オラクルストアによると、

  • Oracle 標準版 1 つは $5,800.00/プロセッサ (x86 では、プロセッサはソケットであり、最大 2 つのソケットに移動できます)
  • Oracle 標準版は 17,500.00 ドル/プロセッサー (x86 では、プロセッサーはソケットであり、最大 4 つのソケットまで使用できます)
  • Oracle エンタープライズ エディションは 47,500.00 ドル/プロセッサです (x86 では、プロセッサは 2 コアであるため、クアッド コア CPU の価格は事実上 2 倍になります)。

したがって、たとえば、100 人の顧客を処理するために 8 つのクアッド コア CPU が必要な場合、1 つのデータベースでライセンスを取得すると、それぞれが 2 つのクアッド コア CPU を備え、それぞれが 25 人の顧客を処理する 4 つのデータベースを使用するよりも、はるかにコストがかかります。

8 個のクアッド コア CPU にはエンタープライズ エディションが必要で、定価は 16 x $47,500 = $760,000 になります。それぞれが標準エディション 1 を実行し、それぞれが 2 つのクアッドコア CPU を搭載した 4 台のマシンの定価は、8 x $5,800.00 = $46,400 - 16 倍の差になります。さて、誰もエンタープライズ エディションの定価を支払うことはありませんが、考慮すべき大きな違いがまだあることを覚えておいてください。

クライアント間でのデータベース操作の大きな必要性がなく、エンタープライズ エディションの機能も必要なく、このレベルの CPU パワーが必要な場合 (または、このレベルの CPU パワーが必要になると予想される場合)、ライセンス コストはワンインスタンスアプローチの大きな欠点になるでしょう。

于 2010-03-09T01:03:26.850 に答える
2

salesforce について調べる価値があるかもしれません。あなたが探しているバズワードは「マルチテナント アーキテクチャ」です。

これは良い読みになります:

http://blog.dayspring-tech.com/2009/02/forcecom-multitenant-architecture-under-the-covers/

Salesforce は内部で Oracle データベースを使用しているため、これは良い例です。

于 2010-03-09T15:27:49.287 に答える
1

良い質問です。すべての選択肢を検討していることを嬉しく思います。良い点はたくさんありますが、私は1つだけに取り組むことに固執します.

私はホストされたアプリケーションの DBA であり、開発者はこれに Oracle Virtual Private Database 機能を使用することにしました。

このアプリケーションは、顧客が負荷分散用のアプリ サーバーのプールとバックエンドの単一のデータベース スキーマを共有することを意図して構築されました。

VPD の前に、「where customer_id=?」を追加する Java クラスがありました。または「and customer_id=?」データベースに送られる直前のすべてのクエリで、顧客は自分のデータのみを見ることができます。これを DB へのログイン時に VPD に実装するには、VPD ポリシーで使用される変数をアプリ コンテキストに設定し、セッションがレコードのみを表示できるようにします。そうです、正しくコーディングして VPD ポリシーをテーブルに割り当てる必要があります。また、Oracle が交渉の終わりを待っていることを信頼する必要があります。

それで、それは私たちにとって良かったですか?理論的には、SQL 述語の処理をアプリケーションの外部にオフロードするのは良いことですが、実際には、利点が欠点を上回ることはありませんでした。

  • 1 つのデータベースに多数のクライアントがあり、アップグレードするときは、すべて同時にアップグレードする必要がありました。何らかの理由でアップグレードしたくない、または新しいバージョンで独自の QA を行いたいというお客様と、多くの綱引きがありました。

  • アップグレードのために古いインスタンス/新しいインスタンスを楽しませましたが、データの移行にはリスクがあり、関連するダウンタイムは顧客を満足させませんでした. テーブルをステップ実行してデータをエクスポートする独自の手順を実行しました...しかし、急ごしらえのエクスポートまたはデータ ポンプ ジョブほど簡単ではないことは確かです。

  • パーティショニングに関しては、VPD 述語分析にも問題がありました。Oracle の多くの機能と同様に、それらは単独で問題なく動作する可能性がありますが、他の機能と組み合わせると予測不能になります。SQL ステートメントの処理で述語分析が遅すぎたため、現在の customer_id に関連しないパーティションは削除されませんでした。静的 VPD ポリシーから動的 VPD ポリシーに変更することでこの問題を回避しましたが、解析に費やす時間が急増しました。

結局のところ、それに対する私の見解は何ですか?私たちのアプリがバインド変数をうまく利用できるように時間を費やし、SQL ステートメントに customer_id を追加する古いメカニズムを引き続き使用していたでしょう。

于 2010-03-09T04:49:47.790 に答える
1

Oracle は、その種の負荷を処理するように作られています。

私の質問 - 1000 人の顧客を抱えている場合、何をしますか?
まだ個別のインスタンス/スキーマを保持していますか?

誰もそれをしないと思います。私は以前、各クライアントが個別のデータベースと中央の場所にコピーを持っていた場所で働いていました.
変更管理は頭痛の種になります。どのクライアント/会社がどのデータベースのリビジョン、スキーマ、アプリのバージョン、およびそれらすべてを使用しているかについて、非常に適切な情報を維持する必要があります。これはそれ自体がソフトウェアになります。
SaaS モデルに基づいたソフトウェア/設計を作成することをお勧めします。これにより、メンテナンスが容易になり、すべてのユーザーが同じデータベース/スキーマを使用できるようになります。

信頼性のために、クラスタリング - Oracle RACを引き続き使用できます。

于 2010-03-09T06:25:45.557 に答える
0

私は同じ決定を数回検討しなければなりませんでした。私たちの場合、MySQL を使用しているため、すべての顧客を個別のデータベースで実行することに関連するコストはありません。

すべての顧客を個別のデータベースで実行することのメリットは非常に大きいです。お客様のインスタンス全体を任意のサーバーに移動して負荷を分散できるスクリプトがあります。このスクリプトは、データベースをコピーし、カスタム ファイルをコピーし、アプリケーションを起動し、ルーティング システムをセットアップしてユーザーを新しいインスタンスに送信するだけです。全体のプロセスはほんの数分しかかかりません。

大規模な mysql データベースでは、データベースの変更に非常に長い時間がかかる場合があります。すべてのクライアントが独自のデータベースを持っているため、すべてのデータセットを小さく保つことができます。バックアップも非常に高速です。

開発インスタンスは同じように動作するため、この方法を使用すると、新しい機能を開発およびテストするときに、さまざまなデータベース スキーマを同時に実行できます。多くの場合、お客様と協力して、新しい機能を他のインスタンスにデプロイする前に試してもらいます。私たちが固執する 1 つのルール (あなたが言及した欠点のいくつかを回避するために) は、すべてのクライアントが互いに 1 つのバージョン内にある必要があるということです。クライアント間で 2 つ以上のバージョンを維持すると、大きなオーバーヘッドが発生します。

Facebook は、会社を立ち上げたときに同じアプローチを採用しました。彼らが立ち上げた各学校には個別のデータベースがあり、新しいインスタンスを非常に迅速にセットアップできました。最終的にデータベースを統合した主な理由は、ユーザーが学校間で通信できるようにすることでした。

潜在的なコストの問題がない場合は、別のデータベース アプローチを使用することをお勧めします。

于 2010-03-09T05:19:07.653 に答える