Sql-Server

哪個數據庫可以處理數十億/萬億條記錄的儲存?

  • December 24, 2016

我們正在考慮開發一種工具來擷取和分析我們收集了大量的 netflow 數據。每天我們擷取大約 14 億個流記錄,這些記錄看起來像 json 格式:

{
  "tcp_flags": "0",
  "src_as": "54321",
  "nexthop": "1.2.3.4",
  "unix_secs": "1352234521",
  "src_mask": "23",
  "tos": "0",
  "prot": "6",
  "input": "105",
  "doctets": "186",
  "engine_type": "0",
  "exaddr": "2.3.4.5",
  "engine_id": "2",
  "srcaddr": "9.8.7.6",
  "dst_as": "12345",
  "unix_nsecs": "752265174",
  "sysuptime": "2943529544",
  "dst_mask": "24",
  "dstport": "80",
  "last": "2943523241",
  "srcport": "52672",
  "dpkts": "4",
  "output": "111",
  "dstaddr": "6.5.4.3",
  "first": "2943517993"
}

我們希望能夠對數據集進行快速搜尋(少於 10 秒),很可能在很短的時間片內(10 - 30 分鐘間隔)。我們還希望索引大多數數據點,以便我們可以快速搜尋每個數據點。我們還希望在執行搜尋時獲得最新的數據視圖。留在開源世界會很棒,但我們並不反對為這個項目尋找專有解決方案。

這個想法是保留大約一個月的數據,這將是約 432 億條記錄。粗略估計,每條記錄將包含大約 480 字節的數據,相當於一個月內約 18.7 TB 的數據,可能是索引的三倍。最終,我們希望增加該系統的容量以儲存數万億條記錄。

我們已經(非常基本地)評估了 couchbase、cassandra 和 mongodb 作為該項目的可能候選者,但是每個人都提出了自己的挑戰。使用 couchbase 索引是在間隔而不是在插入數據期間完成的,因此視圖不是最新的,cassandra 的二級索引在返回結果方面效率不高,因為它們通常需要掃描整個集群以獲取結果,而 mongodb 看起來很有希望,但由於它是主/從/分片,因此似乎更難以擴展。我們計劃評估的其他一些候選對像是 elasticsearch、mysql(不確定這是否適用)和一些面向列的關係數據庫。任何建議或現實世界的經驗將不勝感激。

在我工作的一家公司中,我們正在處理類似數量的數據(大約 10 TB 的實時可搜尋數據)。我們使用 Cassandra 解決了這個問題,我想提幾個想法,它們可以讓您在多 TB 數據庫上進行 O(1) 搜尋。這不是特定於 Cassandra 數據庫的,您也可以將它與其他數據庫一起使用。

理論

  • 分片您的數據。單個伺服器無法可靠​​且真實地保存如此大量的數據。
  • 準備好硬體故障和整個節點故障,複製數據。
  • 從一開始就開始使用許多後端伺服器。
  • 與高端高性能伺服器相比,使用許多更便宜的商品伺服器。
  • 確保數據在分片中均勻分佈。
  • 花大量時間計劃您的查詢。從查詢中派生 API,然後仔細設計表。這是最重要和最長期的任務。
  • 在 Cassandra 中,您可以設計一個複合列鍵並在 O(1) 中訪問該鍵。花時間在他們身上工作。這將用於訪問可搜尋記錄而不是二級索引。
  • 利用寬行。它們對於儲存帶時間戳的事件很有用。
  • 切勿在此類卷上執行全掃描或實際上任何超過 O(Log N) 的操作。如果您需要的不僅僅是 O(Log N),請將此類操作解除安裝到 Map-Reduce 算法。

實踐

  • 不要花時間在物理機器上建構作業系統映像或安裝伺服器。使用基於雲的提供商進行快速原型設計。我使用過 Amazon EC2,我強烈推薦它,因為它的簡單性、可靠性和原型製作速度。
  • Windows 機器在啟動時往往速度較慢,並且在空閒狀態下佔用的資源要多得多。考慮使用基於 Unix 的作業系統。就個人而言,我發現 Ubuntu 伺服器是一個可靠的作業系統,而且askubuntu有一個相當不錯的社區
  • 考慮網路,理想情況下節點應該彼此靠近以允許快速八卦和元數據交換。
  • 不要陷入極端情況:非常寬的列行或非常長的列族(表)。最佳性能是在合理的範圍內實現的——如果 db 通過設計支持那麼多N行,這並不意味著它性能良好。
  • 我們的搜尋大約需要 3-5 秒,這主要是由於 UI 和數據庫之間的中間節點。考慮如何使請求更接近數據庫。
  • 使用網路負載平衡器。選擇一個已建立的。我們使用 HAProxy,它很簡單,但速度很快。從來沒有遇到過問題。
  • 喜歡簡單而不是複雜的解決方案。
  • 尋找免費的開源解決方案,除非您有公司規模預算的支持。一旦您使用多台伺服器,基礎設施的成本可能會飆升。

我不為亞馬遜工作,並且與 HAProxy 和 Ubuntu 團隊沒有任何關係。這是個人意見,而不是任何形式的宣傳。

引用自:https://dba.stackexchange.com/questions/38793