2010-04-21 80 views
3

前幾天我聽說過cassandra數據庫引擎,並在其上搜索了一個很好的文檔。在學習cassandra之後,我得到了cassandra比其他數據引擎更具可擴展性。 我也讀過Amazon SimpleDB,但由於SimpleDB的限制爲10GB /表,而Google Datastore比Amazon SimpleDB慢,所以我寧願不要使用它們(Google Datastore,Amazon SimpleDB)。因此,爲了讓我們的網站使用海量數據縮放特別高的寫入速率,我喜歡使用Cassandra作爲我們的數據引擎。cassandra上的複雜查詢

但在開始使用cassandra之前,我對「如何使用casssandra處理複雜數據」感到困惑。我給你下面的MySQL數據庫結構,請閱讀並給我一個很好的建議。

用戶表
hasColum ID小學
hasColum電子郵件獨特
hasColum姓
hasColum名字

分類表
hasColum ID小學
hasColum家長
hasColum類別

帖子表
hasColum ID小學
hasColum UID指數外鍵鏈接到用戶 - 掛類別 - > ID
hasColum CID指數外鍵> ID
hasColum標題
hasColum郵政指數
hasColum PunDate

評論
hasColum ID primary
hasColum UID鏈接到用戶的索引外鍵 - > ID
hasColum鏈接到Posts的ID索引外鍵 - > ID
hasColum評論

用戶組
hasColum ID初級
hasColum名稱

UserToGroup表(爲多對多關係只)
hasColum UID外鍵鏈接到用戶 - > ID
hasColum GID外鍵鏈接到Group-> ID

最後,爲了您的信息,我喜歡使用SimpleCassie PHP類http://code.google.com/p/simpletools-php/ 因此,如果您可以給我示例le使用SimpleCassie

+0

所以問題是,如何在使用非關係型NoSQL數據庫時有關係?出於好奇,你建立的MySQL不會擴展到什麼程度? – Gordon 2010-04-21 11:01:36

+0

是的,這就是問題所在。 我們正在考慮開發一個應用程序(主要是一個分類網關,網站開發人員將通過API設置/獲取數據)。 – 2010-04-21 11:07:19

回答

0

的文檔,您真的車流量方面與谷歌和亞馬遜競爭?我建議先考慮升級當前的MySQL基礎架構 - 當前在羣集中運行多少個數據庫服務器?你是否劃分數據?

C.

+0

我不是在談論交通量..我更喜歡cassandra的性能......請參閱cassandra的體系結構http://wiki.apache.org/cassandra/ArchitectureOverview MySQL需要300ms才能寫入50GB數據,而cassandra需要只有0.12ms ..它是最快的數據引擎 MySQL需要350ms才能讀取50GB數據,其中cassandra只需要15ms讀取 最受歡迎的網站正在遷移到cassandra以擴展和改善性能,包括Facebook,Twitter,Digg等等... – 2010-04-21 20:21:48

+3

這些標題數字看起來令人印象深刻 - 但沒有詳細說明他們如何配置測試。此外,即使使用最新的光纖通道交換結構(即可用的最快磁盤技術),您也很幸運能夠獲得20Gb/s的持續存儲容量 - 並假定底層磁盤可以應對這種速率/數據量 - 或20,000比本頁上引用Cassandra的數字慢了很多倍。事實上,20Gb/s大概是中/高範圍非NUMA系統的內存帶寬。如果您正在查看一個非常大的數據庫集羣,這些數字可能有任何意義的唯一方法。 – symcbean 2010-04-22 12:20:09

5

從:

不像關係系統,在那裏你模型的實體和關係,然後只添加索引,以支持任何疑問成爲必要,卡桑德拉你需要想想你要支持查詢有效地提前,並適當地建模。由於沒有自動提供的索引,因此與查詢關係相關的查詢相比,您將更接近每個查詢的一個ColumnFamily。不要害怕相應地去規範化;

goog article here

我希望它能幫助你。

5

我會假設你會有沉重的負載和大量的數據通過你的系統,並且我會假設你已經嘗試過一個關係數據庫並在重負載下崩潰,行,10k +請求每秒等

經過這些假設我會告訴你,你需要改變你的想法。例如在你的問題中,當你考慮關係數據庫時,你寫下了非常重要的表結構。但是在專欄商店(比如cassandra/hbase/etc)它並不那麼重要,它的請求類型很重要。由於在專欄商店中,您可以隨時在新專欄中添加一個新的元數據(您不會在您的請求中使用的額外列),您不必更改您的設計。但是在關係數據庫中,你需要改變表格,甚至用pk-fk關係來獲取另一個表格。

當使用cassandra(或任何其他列數據庫)時,您應該將所有api放在您面前。

例如:

如果你有自己的API,你應該eighter getAllUserPosts($userId)

有:UserPosts的ColumnFamily或帖子的ColumnFamily輔助索引(它在背景類似的事情)。更遠你怎麼需要結果排序?是的,它也是設計中的一個關鍵點,如果你想讓它按照創建日期排序,那麼你最好在關鍵中使用TimeUID,或者使用第三方機制來爲你生成更多的uid。也許你想用他們的「最新更新」對它們進行排序,那麼你最好在它上面放一個二級索引。

根據我的經驗,我會告訴你,當你的api或數據所需要的東西很清晰時,用cassandra開發某些東西真的很酷,但是當你想要改變一個大特徵時,你會遇到一些非常大的挑戰你要小心。還要確保你理解使cassandra快速的底層「最終一致性」。由於你必須多次敲擊鍵盤上的鍵盤才能完成交易(至少我是這麼做的)。當然,在某些時候你會想要對你在cassandra上的大量數據進行大規模操作:準備好吃雲計算。 Hadoop的。

PS:我相信有很多人在這裏有cassandra的經驗和知識,然後我會幫助你比我更好地設計你的系統。我只是想分享我在生產中使用卡桑德拉的經歷和理解。