2011-05-16 111 views
8

我最近一直在學習RavenDB並希望能夠使用它。RavenDB - 規劃可擴展性

我想知道人們在可擴展的方式下構建系統時有什麼建議或建議,特別是分散在不同服務器上的數據,但可以在單個服務器上啓動,只能根據需要增長。

建議,甚至可能在單個實例上創建多個數據庫並在其上實施分片。那麼擴展它只是將這些數據庫分佈在機器上的問題?

我的第一印象是這種方法可行,但我會很樂意聽到別人的意見和經驗。

更新1:

我一直在想這個問題。我認爲我之後「整理出來」的方法的問題在於,在這種情況下,在我看來很難在整個服務器上均勻分佈數據。我不會有一個字符串鍵,我可以在範圍內(A-E,F-M ..)它將用數字完成。

這留下了兩個選項,我可以看到。要麼在邊界上分解它,所以1-50000在碎片1上,50001-100000在碎片2上,但是隨着年齡的增加,像這樣說,你的原始碎片將會減少很多工作。或者,如果您需要將文檔移動到新的分片,它會更改密鑰並打破使用該密鑰的URL,但是一個輪迴盜取分片並將分片ID放入密鑰的策略會受到影響。

所以我的新想法,我再次發表評論,將從第一天開始創建一個分揀系統。它的作用就像將碎片ID填充到密鑰中一樣,但是你可以從一個很大的數字開始,比如說1000,它可以平均分配。然後,當需要將負載分成碎片時,可以說將存儲區501-1000移動到新的服務器上,並寫入碎片邏輯,使1-500進入碎片1,501-1000進入碎片2.然後,當第三臺服務器聯機後,您可以選擇另一個存儲桶並進行調整。

在我看來,這使您能夠分裂成最初創建桶的儘可能多的碎片,從數量和年齡兩方面均勻分佈載荷。無需更改密鑰。

想法?

回答

4

這是可能的,但真的沒有必要。您可以開始使用一個實例,然後在需要時通過設置分片進行縮放。

另見:

http://ravendb.net/documentation/docs-sharding

http://ayende.com/blog/4830/ravendb-auto-sharding-bundle-design-early-thoughts

http://ravendb.net/documentation/replication/sharding

+0

感謝您的自動分片鏈接,我沒有看到。我想我後來把它整理出來的麻煩在於,我想要一種能夠在服務器之間平衡數據的策略,而不是一個填滿一臺服務器的策略,然後再轉移到下一個。這引發了在添加新文件時在分片之間移動文檔的問題。所以我想在可能的情況下提前做出規劃。 – 2011-05-16 08:10:10

+0

我用這個主題的新思想更新了這個問題。你對這種方法有什麼想法? – 2011-05-17 05:17:38

+0

我不確定你爲什麼需要這一點。您可以隨後添加分片,並且RavenDB將爲您完成這項工作。 – synhershko 2011-05-17 07:52:29

1

我認爲一個好的解決方案是使用虛擬碎片。您可以從一臺服務器開始,將所有虛擬分片指向一臺服務器。在增量ID上使用模塊來平均分配虛擬碎片中的行。藉助Amazon RDS,您可以選擇將一個從設備變爲主設備,因此,在更改分區配置(將更多虛擬分區指向新服務器)之前,應該將從設備設爲主設備,然後更新配置文件,然後刪除所有使用modulu的新主記錄不符合您用於新實​​例的碎片範圍。

您還需要從原來的服務器中刪除的行,但現在所有ID的新數據被mo​​dulu基於新的虛擬分片範圍將指向新的服務器。因此,您實際上不需要移動數據,但可以利用Amazon RDS服務器升級功能。

然後,您可以將副本從原始服務器上刪除。您創建一個唯一的ID爲:碎片ID +表格類型ID +增量編號。所以當你查詢數據庫時,你知道要去哪個分片並從中獲取數據。

我不知道它是如何可能的RavenDB做到這一點,但它可以與亞馬遜RDS工作得很好,因爲亞馬遜已經爲您提供複製和服務器促銷功能。

我同意他們應該是一個解決方案,從一開始就提供無縫的社交,而不是告訴開發者的時候出現的問題進行排序。此外,我發現很多NoSQL解決方案均勻地分佈在分片上,需要在低延遲的集羣中工作。所以你必須考慮到這一點。我試過用兩臺不同的EC2機器(不是專用的亞馬遜集羣)使用Couchbase,數據平衡非常慢。這也增加了整體成本。

我也想補充一點,什麼Pinterest的做了,解決他們的可擴展性問題,採用虛擬4096個碎片。

您還應該查看許多NoSQL數據庫的分頁問題。採用這種方法,您可以很容易地分頁數據,但可能不是最有效的方式,因爲您可能需要查詢多個數據庫。另一個問題是改變模式。 Pinterest通過將所有數據放入MySQL中的JSON Blob來解決此問題。當您想要添加新列時,可以使用新列數據+鍵創建一個新表,並且可以在該列上使用索引。如果您需要查詢數據(例如通過電子郵件),則可以使用電子郵件+ ID創建另一個表並在電子郵件列中添加索引。計數器是另一個問題,我的意思是原子計數器。因此,最好從JSON中取出這些計數器,並將它們放在一列中,以便增加計數器值。

這裏有很棒的解決方案,但是在一天結束時你會發現它們可能非常昂貴。我更願意花時間構建我自己的分片解決方案,並防止自己後來頭痛。如果你選擇其他途徑,有很多公司等着你惹麻煩,並要求相當多的錢來解決你的問題。因爲在你需要他們的那一刻,他們知道你會付出一切努力讓你的項目再次運作。這是從我自己的經驗,這就是爲什麼我打破我的頭,使用你的方法建立我自己的分片解決方案,這也是便宜得多。

另一種選擇是爲ScaleBase或DBshards等MySQL使用中間件解決方案。所以你可以繼續使用MySQL,但是在你需要擴展的時候,他們有很好的解決方案。而成本可能會低於替代方案。

另一個技巧:當你創建了碎片的配置,把接受或真或假一write_lock屬性。所以當它爲false時,數據將不會寫入該分片,因此當您爲特定表類型(即用戶)獲取分片列表時,它將只寫入其他分片的相同類型。這對備份也很有用,所以當您想要在備份所有數據時鎖定所有分片以獲得所有分片的時間點快照時,您可以爲訪問者顯示友好的錯誤。儘管我認爲您可以發送全局請求以使用Amazon RDS快照所有數據庫並使用時間點備份。

的事情是,大多數公司不會花時間與DIY分片解決方案時,他們會更願意支付ScaleBase。這些解決方案來自單個開發人員,他們可以從一開始就爲可擴展解決方案提供支付,但要確保在達到他們所需的程度時,他們就有了解決方案。只要看看那裏的價格,你就會發現它會花費你很多。一旦完成,我會很樂意與您分享我的代碼。在我看來,你將走上最佳路徑,這完全取決於你的應用程序邏輯。我的數據庫建模很簡單,沒有連接,也沒有複雜的聚合查詢 - 這解決了我的許多問題。將來您可以使用Map Reduce來解決這些大數據查詢需求。