2013-07-25 63 views
1

在我們的服務中,我們使用SQL Azure作爲主要存儲,並將Azure表用於備份存儲。每天大約收集30GB數據並存儲到SQL Azure。由於數據在第二天不再有效,我們希望每天晚上將數據從SQL Azure遷移到Azure表。將數據從SQL Azure遷移到Azure的最佳設計解決方案表

問題是......將數據從Azure遷移到Azure表的最有效方式是什麼?

我想出的天真想法是通過使用IDataReader來利用生產者/消費者的概念。也就是說,首先通過執行「select * from TABLE」來獲取數據讀取器並將數據放入隊列中。同時,一組線程正在從隊列中獲取數據,並將它們插入到Azure表中。

當然,這種方法的主要缺點(我認爲)是我們需要長時間保持打開的連接(可能需要幾個小時)。

另一種方法是首先將數據從SQL Azure表複製到Windows Azure上的本地存儲,然後使用相同的生產者/消費者概念。在這種方法中,只要複製完成,我們就可以斷開連接。

在這一點上,我不確定哪一個更好,或者他們中的任何一個都是很好的設計。你能爲這個問題提出任何好的設計解決方案嗎?

謝謝!

+0

這是來自一張桌子或多張桌子的30GB數據嗎? –

+0

只有一張桌子:) – soleiljy

回答

0

我不建議使用本地存儲,主要是因爲

  1. 這是暫時的存儲。
  2. 您受限於本地存儲的大小(這反過來取決於VM的大小)。
  3. 本地存儲是local only,即只有創建它的虛擬機才能訪問,從而防止您擴展解決方案。

我喜歡用隊列的想法,但是我看到有些問題還有:

  1. 假設你打算在隊列中存儲每一行​​的消息,您將得到執行大量的存儲交易。如果我們假設你的行大小爲64KB,那麼爲了存儲30GB的數據,你將會處理大約500000次寫入事務(以及類似的500000次讀取事務) - 我希望我的數學正確:)。儘管存儲交易很便宜,但我仍然認爲你會進行大量的交易,這會減緩整個過程。
  2. 由於您正在做這麼多交易,您可能會受到存儲閾值的限制。你可能想檢查一下。
  3. 另一個限制是消息的最大尺寸。目前一條消息中最多可以存儲64KB的數據。如果你的行大小超過那個,會發生什麼?

我實際上會推薦在組合中投擲blob storage。你可以做的是從SQL表中讀取大量數據(比如說10000或100000條記錄),然後將這些數據作爲文件保存在blob存儲中。根據您希望如何將數據存儲在表格存儲中,您可以將數據存儲爲CSV,JSON或XML格式(如果需要,可以使用XML格式保存數據類型)。一旦將文件寫入blob存儲中,就可以在隊列中寫入消息。該消息將包含您剛寫入的blob的URI。您的工作者角色(處理器)將持續輪詢此隊列,獲取一條消息,從blob存儲中獲取文件並處理該文件。一旦工作者角色處理完文件,您可以簡單地刪除該文件和消息。

+0

謝謝,我明白你說的要點。實際上,我在原始帖子中提到的隊列只是內存隊列,而不是windows azure隊列;)還有一個問題:就像你說的,讓我們假設一個worker角色輪詢隊列,獲取一個指向blob文件的消息。但不幸的是,由於某些原因(例如,節流限制),blob文件中的某些行未插入到Azure表中。你將如何處理這種失敗? – soleiljy

+0

您可以做的一件事是將所有失敗的行放在另一個文件中,將該文件保存在blob存儲中,在隊列中創建一條新消息。您還可以通過檢查消息的「DequeueCount」屬性以及處理超過「x」次的時間來進行更多的檢查,如處理消息的時間(或者換句話說,文件已被處理)你把它放在別的地方,離線處理。 –