最近研究mongodb,利用其可以簡單快速地搭建一套靈活的no schema儲存系統。
本文通過論證和分析需求,利用mongodb快速搭建了一套具有良好效能及可用性滿足上億規模的儲存系統。
在關於nosql資料庫的選型上,需要結合自身資料模型、訪問方式以及成本等方面的考慮作乙個權衡(trade off)。
那麼經過研究mongodb(2.6.4版本)有如下特點:
可用性:
1.支援高可用靈活的服務集群配置,有主從、副本集、自動分片模式。
2.基於文件的查詢,高效能,簡單查詢上萬的qps。
3.支援全文檢索。
一致性:
1.支援文件內更新模式,效率高。
2.當前最新的2.6版本採用讀寫鎖、寫鎖優先,鎖的粒度為collection級別。
易用性:
1.近似傳統關係型資料庫的sql使用。
2.豐富的管理配置工具。
3.支援基於使用者角色的許可權管理體系。
儲存機制:
採用mmap file + 記憶體索引的方式。記憶體與快取管理由作業系統負責,當使用資料集大小超出時,效能下降。
linux下記憶體控制可以通過配置使用者ulimit -u 實現。
現實需求:
1. 需要儲存字段靈活的半結構化資料。
2. 1~2億條記錄的儲存規模,平均每條記錄20k上限。
3. 讀需求遠大於寫(以8:2計算),寫以批量寫入的方式,讀需支援靈活複雜的查詢方式。
4. 寫效能:5000qps 讀效能:2w qps
由於mongodb靈活的儲存和訪問方式,以及良好的查詢效能與伸縮性及維護成本,故想到利用mongodb來儲存這約2億的資料量。
根據需求分析如下:
1. 以2億規模計算,總儲存量約4tb。現在市面上伺服器硬碟最大有2tb規格的,部署時可以考慮以lvm方式,先安裝1~2tb磁碟,待容量增長時根據需求方便地做擴容。
2. 在已存在1億資料量的情況下插入1000w條記錄,每次寫入4條索引,qps能達到8000滿足寫效能的5000 qps需求。
3. 單執行緒簡單讀情況下qps能達到8w qps,換做多執行緒併發讀取總效能也接近8w qps可滿足2w qps的查詢效能,後續若對讀效能有增長需求可考慮從節點開啟讀許可權分攤讀壓力。在測試中,讀延遲 < 1ms。
根據需求論證的結果,利用mongodb來儲存這2億條記錄的方案是可行的。在實際部署當中,mongodb支援多種方式有主從、副本集、分片。其中副本集相對於主從模式有自動故障遷移的優勢,但是其也帶來了複雜性和機器成本增加的劣勢。
故綜合考慮後,選用主從模式進行部署,選用伺服器配置為16物理核 + 256g記憶體 + 2tb硬碟的機器兩台搭建主備節點。
其中,從節點開啟讀許可權,一方面應用層在主不可讀時可向從節點發起讀請求,另一方面前端可根據負載把部分讀請求分攤到從節點上。
由於資料的寫入求屬於離線操作,故只需監控好主從節點的狀態,能夠及時恢復好服務狀態即可。
通過以上實踐,即完成了利用mongodb快速搭建滿足上億級別儲存的需求。
MongoDB 最佳實踐
已經有很多關於 nosql 選擇的文章了。影響你選擇資料庫的因素有 讀 寫操作的吞吐量,永續性,一致性,延遲性等等。nathan hurst 的文章 visual guide to nosql system 很好的總結了這一點。nosql 通用的最佳實踐 1.徹底的測試 模擬你的生產環境,包括流量來...
MongoDB最佳實踐
將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...
mongodb 最佳實踐
不要按照關係型來設計表結構 mongodb可以讓你像關係型資料庫一樣設計表結構,但是它不支援外來鍵,也不支援複雜的join!如果你的程式發現有大量實用join的地方,那你的設計可能需要重新來過。參照以下相關模式設計建議。資料庫集合 collection 的數量不宜太多 mongodb的模式設計基於靈...