2013-02-13 28 views
8

在接下來幾個月的某個時候,我們的應用程序將處於我們需要分割我們數據庫的大小。我們使用Heroku來託管Node.js/PostgreSQL堆棧。Heroku上的數據庫分割

從概念上講,我們的應用程序讓每個邏輯分片代表一個用戶以及與該用戶相關的所有數據(我們的應用程序的每個用戶都會生成大量數據,並且用戶之間沒有交互)。我們需要保留用戶對他們的數據進行復雜即席查詢的能力。我已經閱讀了許多文章,例如這篇談論分片的文章:http://www.craigkerstiens.com/2012/11/30/sharding-your-database/

從概念上講,我理解Sharding是如何工作的。然而在實踐中,我不知道如何在Heroku上實現這一點,就我需要編寫的代碼以及我需要修改的應用程序的哪些部分而言。鏈接到教程或一些指針將不勝感激。

這裏有一些資源,我已經看了看:

+0

你有沒有簽出八達通? https://github.com/tchandy/octopus – catsby 2013-02-13 19:52:13

回答

0

我不確定我會稱之爲「分片」。

在LedgerSMB這裏是我們如何做事。每個公司(商業實體)都是一個獨立的數據庫,其數據完全分離。數據不能在公司之間共享。一個postgreSQL集羣可以運行任意數量的公司數據庫。我們有一個管理界面來創建數據庫並加載模式。管理界面還可以創建新用戶,可以在公司之間共享(可選)。我不太清楚在Heroku上如何在dbs之間共享用戶,但我將這些細節包含在我們如何使用PostgreSQL的方面。

所以這是一個可行的方法。

您真正需要的是啓動數據庫並以自動方式管理用戶。從那裏你可以要求用戶指定一個你可以映射到數據庫的公司名稱(這個映射可以存儲在另一個數據庫中)。

我知道這是相當高的水平。但它應該讓你開始。

0

作爲第一篇文章的作者樂於進一步提醒。當談到分解非常關鍵的組件時,你分解了什麼關鍵。當數據混合在不同的物理節點上時,分片的複雜性真正起作用。如果您像多租戶應用程序那樣,那麼將您的所有數據圍繞租戶或客戶的想法進行建模can fit very cleanly in this setup。在這種情況下,您將打算拆分所有與客戶相關的表格,並將其與其他租戶相關的表格分開。

至於在Heroku上這樣做,有兩種選擇。您可以使用Heroku Postgres和應用程序邏輯推出自己的產品,或者使用Citus(這是一個附加組件,可幫助您管理更多此類應用程序)。

對於自己的滾動,您將首先創建各種應用程序邏輯來處理創建所有碎片並知道將適當的查詢路由到哪裏。對於Rails來說,有些寶石可以幫助像activerecord-multi-tenantapartment。當談到實際轉移到分片和遷移時,你想要做的是創建一個Heroku追隨者開始。在遷移期間,您將開始不遵循。然後,您將從原始主要數據中移除一半數據,並從相應分隔的跟隨者中移除另一半數據。