我有以下的情況下使用:哪種方法和數據庫的性能關鍵的解決方案
圍繞設備7000萬發出一個信號,每3〜5分鐘,以 服務器發送其ID,狀態(在線或離線),IP,位置 (經度和緯度),父節點和一些其他信息。
其他信息可能不是標準格式(對我來說沒有模式),但我仍然需要查詢它。
設備可能會消失一段時間(或永遠)不發送 信號的過程中。所以如果 他們在最近X天沒有發出信號,我需要一種方法來「忘記」設備。新設備 可能隨時上線。
我需要查詢所有這些數據。就像知道有多少設備在特定區域或在IP範圍內離線一樣。不會有很多查詢在同一時間運行。
某些查詢需要在數據庫更新的同時快速運行(每個查詢小於3分鐘)和 。所以我需要索引 的主要屬性(id,狀態,IP,位置和父節點)。 查詢結果不需要100%準確,只要不會花費太長時間(超過20分鐘的查詢結果),它們纔會出現在查詢結果中,因此最終一致性 都可以。
我根本不需要 持久性,如果電源熄滅它可以丟失 的一切。
考慮到這一切我想用一個NoSQL的方法也許MongoDB的或CouchDB的,因爲我有一個MapReduce的和Javascript經驗,但我不知道哪一個是我的問題更好的(我對引力CouchDB的)或者他們是否適合處理這種巨大的工作量。我甚至不知道我是否真的需要一個「傳統」數據庫,因爲我不需要持久化磁盤(也許主內存方法會更好?),但是我確實需要一種輕鬆構建自定義查詢的方法。
我發現的主要問題有以下幾點:
需要插入/更新大量的元組的真快,我不知道 事先如果我收到的信號已經在數據庫或不。 幾乎所有的信號都會與上次的 處於相同的狀態,所以也許可以通過id查詢,並檢查元組是否更改,如果不更新?
切換離線設備。在夜間運行的批處理作業將刪除過期的元組將解決此問題。
不會有很多查詢在同一時間運行,但它們需要 才能快速運行。所以我想我需要一個集羣在集羣的多個節點上執行單個查詢(CouchDB MapReduce 是否將工作負載拆分到集羣的多個節點?)。我不是 腸衣肯定我需要一個集羣雖然,可以單個更昂貴的機器處理所有的負載?
我從來沒有使用過一個noSQL系統,但我對這個問題有了理論上的瞭解 。