我知道這是一箇舊的線程,但它與我們在過去2年使用的相同結構以及當前在3臺服務器上運行1768個數據庫的結構相同。
我們有如下設置(不包括後視鏡等):
- 2 Web場服務器和4個內容服務器
只爲客戶的主數據庫,該數據庫查詢
- SQL實例時,他們通過ID訪問其網頁以獲取其數據所在的服務器/實例和數據庫名稱。然後將其存儲在身份驗證票證中。
- 3根據每臺服務器上所有數據庫中存在的學習者的當前總數(通過主數據庫中的許可證號字段快速計算),負載分散創建客戶數據庫的SQL服務器。
- 在每個SQL Server上都有一個較小的主數據庫設置,其中包含所有客戶端使用的共享靜態數據,因此允許更小的客戶端數據庫和更快的內容更新。
上面提到的最大的問題是保持數據庫結構的同步!爲此,我最終編寫了一個小型.NET窗體,查找master數據庫中的所有客戶,並粘貼代碼執行,並通過獲取數據庫位置和執行過去的SQL來循環。
創建新客戶也給我們帶來了一些問題,所以我最終爲我們的銷售人員編制了一個管理系統,它創建了一個基於非活動「空白」數據庫備份的新數據庫,因此我們擁有最新的數據庫而無需重新編寫整個數據庫創建腳本的腳本。然後,將主要數據庫中的客戶詳細信息與創建數據庫的位置一起插入,並從舊版本的軟件遷移任何舊數據。所有這些都是在移動之前在單獨的實例上完成的,因此減少了任何SQL鎖定。
我們現在正在爲我們的下一個版本的軟件遷移到一個數據庫,因爲數據庫冗餘幾乎不可能有這麼多的數據庫!這是一個巨大的考慮因素,因爲SQL會創建一些等待任務,這些任務會鏡像每個數據庫的數據,一旦您開始將數據庫放大並失去控制,並且系統幾乎完全負責同步並且可能由於剪切而鎖定線程數。請參見下面的Microsoft文檔30頁:
SQLCAT's Guide to High Availability Disaster Recovery.pdf
然而,我有關於搬遷到一個單一的數據庫,由於一些擔憂懷疑上面提到的,如在目前的客戶有每一個程序不斷檢查只能訪問他們的數據,而且一些小問題中的事情現在也會影響到每個數據庫,比如表索引等等。同時,我們的客戶還有3臺服務器,但單個數據庫意味着我們有冗餘,但如果錯誤在數據庫內而不是服務器下降,那麼每個客戶都會下降,而不僅僅是1個客戶數據庫。
總之,這取決於你在做什麼,如果你想要冗餘;對我而言,冗餘現在是關鍵,而且完美世界中的其他任何事情都不應該發生(比如導致數據庫中所有人都出錯的錯誤)。我們只是開始期待從一箇舊的自我託管軟件轉移到系統,並迅速變成200,500,1000,1500 ......我們現在每年有超過75萬用戶使用我們的系統,並且在8月/ 9月我們在線用戶超過15,000(預計今年達到20,000)。
希望這是幫助沿線有人:-)
問候
利亞姆
我在考慮,我們目前正在開發一個託管的應用程序類似的設置,所以任何真實世界的戰爭故事將是最受歡迎的:) – elo80ka 2010-07-19 14:48:15
到目前爲止,這個想法已經非常成功,但它需要大量的工具代碼來支持。例如,我們有一個用於創建新網站的管理員應用程序以及一個將客戶端從一臺服務器移動到另一臺服務器的導入/移動主要是爲了調試,但是在將來我們計劃使用兩個prod服務器來平衡負載。 – Frank 2010-07-19 17:31:28
單獨數據庫對於每個客戶端的另一個巨大副作用是它迫使您設計一個可重置環境,您可以在其中快速創建新的應用程序實例並對其執行單元/手動測試。 – Frank 2010-07-19 20:19:19