1

当サービスではメインストレージにSQL Azure、バックアップストレージにAzureテーブルを使用しています。毎日約 30 GB のデータが収集され、SQL Azure に保存されます。翌日からデータが無効になるため、毎晩 SQL Azure から Azure テーブルにデータを移行したいと考えています。

問題は、Azure から Azure テーブルにデータを移行する最も効率的な方法は何ですか?

私が思いついた単純なアイデアは、IDataReader を使用してプロデューサー/コンシューマーの概念を活用することです。つまり、まず "select * from TABLE" を実行してデータ リーダーを取得し、データをキューに入れます。同時に、一連のスレッドがキューからデータを取得し、それらを Azure テーブルに挿入します。

もちろん、このアプローチの主な欠点 (私が思うに) は、開かれた接続を長時間 (数時間) 維持する必要があることです。

もう 1 つの方法は、最初に SQL Azure テーブルから Windows Azure のローカル ストレージにデータをコピーし、同じプロデューサー/コンシューマーの概念を使用することです。このアプローチでは、コピーが完了するとすぐに接続を切断できます。

現時点では、どちらが優れているかはわかりません。または、どちらかが実装するのに適した設計であってもかまいません。この問題に対する適切な設計ソリューションを提案できますか?

ありがとう!

4

1 に答える 1

0

主な理由として、ローカル ストレージの使用はお勧めしません。

  1. 一時預かりです。
  2. ローカル ストレージのサイズによって制限されます (VM のサイズによって異なります)。
  3. ローカル ストレージは、local onlyつまり、それが作成された VM のみがアクセスできるため、ソリューションをスケールアウトできません。

キューを使用するというアイデアは気に入っていますが、いくつかの問題もあります。

  1. 各行をメッセージとしてキューに格納することを計画していると仮定すると、多くのストレージ トランザクションを実行することになります。行サイズが 64KB であると仮定すると、30 GB のデータを格納するには、約 500000 の書き込みトランザクション (および同様に 500000 の読み取りトランザクション) を実行することになります - 計算が正しかったことを願っています :)。ストレージ トランザクションは安価ですが、多くのトランザクションを実行すると、プロセス全体が遅くなると思います。
  2. 非常に多くのトランザクションを実行しているため、ストレージのしきい値に達する可能性があります。あなたはそれをチェックしたいかもしれません。
  3. さらに別の制​​限は、メッセージの最大サイズです。現在、1 つのメッセージに最大 64KB のデータを格納できます。行サイズがそれ以上の場合はどうなりますか?

私は実際にblob storageミックスを投入することをお勧めします。できることは、SQL テーブルからデータのチャンク (たとえば、10000 または 100000 レコード) を読み取り、そのデータをブロブ ストレージにファイルとして保存することです。テーブル ストレージにデータを格納する方法に応じて、CSV、JSON、または XML 形式 (必要に応じてデータ型を保持するための XML 形式) でデータを格納できます。ファイルが BLOB ストレージに書き込まれると、キューにメッセージを書き込むことができます。メッセージには、作成した blob の URI が含まれます。Worker ロール (プロセッサ) は、このキューを継続的にポーリングし、1 つのメッセージを取得して、BLOB ストレージからファイルを取得し、そのファイルを処理します。worker ロールがファイルを処理したら、そのファイルとメッセージを削除するだけです。

于 2013-07-25T02:46:44.343 に答える