圍繞著記憶體資料庫的 4 個流言
時下,我們正處於一個日新月異的時代,而優秀應用的響應時間往往需要被控制在0.1秒內。這也意味著,如果可接受網路通訊時間為50毫秒,那麼開發者必須在剩餘的50毫秒內處理資料並進行響應。要實現這一點毫無疑問會需求毫秒級的資料庫響應時間,在同時支撐上萬個請求的場景中更是如此,而這樣的需求當下只有少數幾個靈活度極高、功能齊全的資料庫才能滿足。
在大資料處理情景中,洞見必須被快速收集並做出決策,而在沒有複雜優化或折中的情況下,記憶體資料庫可以在數秒內完成以往傳統資料庫數小時或者數分鐘的工作。儘管如此,當下在記憶體資料庫領域仍然存在諸多流言,大量人仍然認為記憶體資料庫不可靠性、不一致並且伴隨著昂貴的開銷。然而最重要的是,還有人認為只要把資料庫放到記憶體中就可以獲得所需的效能。
流言1:所有記憶體資料庫都很快
答案顯然是否定的。即使當下大部分記憶體資料庫都使用非常高效的語言編寫,比如C和C++,但是它們仍然無法得到所需的響應需求,這主要基於以下幾點原因:
1. 在不同資料庫中,處理命令的複雜性是不同的。在高效能資料庫中,處理命令會在最小複雜度下執行。最直接的影響就是就是,在資料集不斷增大的情況下,你可能需要一直優化查詢時間。
2. 查詢效率同樣不同。有些時候,資料庫會把全部載入進記憶體的資料當做單一的BLOB(類似memcached的快取機制),這顯然是沒有效率的——資料庫應該具備分散儲存和查詢值的能力,以及有效地節約網路和記憶體開銷,從而顯著地降低應用程式處理時間。
3. 單執行緒和多執行緒架構的權衡。
多執行緒會盡可能的利用計算能力,無需資料庫使用者做任何處理,但是這個解決方案同樣需要做大量的內部管理和同步,從而消耗大量的計算資源。在多執行緒模式下,鎖開銷可能會大幅度降低資料庫效能。
單執行緒使用了一個非常簡單的執行模型,在這個解決方案中不存在鎖的問題,同時也只會耗費少許的計算效能,但毫無疑問的是,計算資源的管理將從資料庫移交給使用者。理想的解決方案肯定是讓使用者儘可能少地做資源管理,因為資料庫管理本來就是個輕度資源密集型工作。
4. 零共享vs. 共享vs. 共享一切。共享會影響到系統的擴充套件性。在資料庫體積不斷增長的同時,效能也必須時刻滿足例項的需求。零共享模型讓所有實體都以獨立單元的形式存在,從而避免了處理暴增後的通訊開銷,實現線性擴充套件能力。
5. 通過避免網路方面任務和減少TCP協議開銷, 零延時分散式代理等內建加速元件可以顯著地提升資料庫效能。在某些情況下,代理也可能與資料庫通訊,以確定其是否作為主機上服務遠端客戶端的另一個本地客戶端程式。
如果吞吐量和延時是主要目標,那麼機構很顯然需要選擇一個可以實現毫秒級延時並最小化伺服器需求的資料庫。
流言2:記憶體計算是不可靠和不一致的
大多數NoSQL資料庫(不只是記憶體資料庫)在提交資料到磁碟或者副本之前都為客戶端提供了acknowledgements (ack)。因此,這裡很可能會造成資料不一致的情況。
CAP定理標明任何分散式計算機系統都不能同時具備一致性、可用性和分割槽容錯性。不同的資料庫會選擇不同的型別,具體情形如下:選擇CP模型表示開發者不用去關心一致性,但是在網路分割事件中寫命令則是不允許的。如果選擇AP模型則意味著資料庫對讀寫一直可用,但是開發者在寫應用程式程式碼時就需要考慮一致性問題,而不是期望資料庫去完成這個操作。因此,請根據使用場景來選擇合適的資料庫模型。
流言3:記憶體計算很難擴充套件
擴充套件共有兩個途徑。首先通過給託管資料庫的伺服器縱向擴充套件,比如增加更多的CPU和記憶體;其次,通過向記憶體叢集中新增更多的主機實現橫向擴充套件。在許多資料庫中,你可以在同一個節點上執行同一個資料集的多個分片,因此可以通過更有效率的計算資源利用來延緩擴充套件需求。同樣,這裡也可以將多個伺服器的記憶體整合起來成為一個共享記憶體池,從而突破單機記憶體大小限制。現下,很多記憶體資料庫同時允許這兩種方法的擴充套件,通過動態的增加分配給資料庫的核心和記憶體節點數量來最大化應用程式的響應能力。
流言4:記憶體計算是昂貴的
任何需要快速提升吞吐量的應用都面臨著相同的問題:“一定等級的吞吐量究竟需要花多少錢”。舉個例子,在1500萬OPS情景下,執行在單Amazon EC2例項上的記憶體資料庫會比非記憶體資料庫便宜,但是如果使用數百臺伺服器達到同樣的效果結果可能就會截然相反。
如果資料集規模是TB級別,記憶體的花費很顯然會成為問題,然而當下已經有使用快閃記憶體擴充套件記憶體的技術存在,從而降低花費。但需要注意的是,使用快閃記憶體來擴充套件記憶體勢必會影響到系統效能,因此這裡理想的技術是控制快閃記憶體和記憶體的比例以達到一個理想的價效比。
綜上所述,根據實際場景來選擇合適的資料庫技術將會大幅度提高資源利用效率。同時,新型資料庫出現已有很長一段時間,因此拋棄不必要的成見才能讓工作事半功倍。
作者Yiftach Shoolman是Redis Labs的聯合創始人兼CTO,擁有著豐富的實踐經驗。Yiftach 之前曾是Crescendo Networks(後被F5收購)的總裁、建立者兼CTO,更早還是Native Networks的技術副總裁。
相關文章
- 【記憶體資料庫】TimesTen記憶體資料庫
- 記憶體資料庫如何發揮記憶體優勢?記憶體資料庫
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- 【大頁記憶體】Oracle資料庫配置大頁記憶體記憶體Oracle資料庫
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- 【虹科乾貨】使用記憶體資料庫解決三個資料庫效能問題記憶體資料庫
- 資料庫新兵:分散式實時分析記憶體資料庫eSight資料庫分散式記憶體
- 記憶體資料庫適合多大規模的資料集?UY記憶體資料庫
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- 分析師解讀記憶體資料庫MemSQLSP記憶體資料庫SQL
- 南大通用極速記憶體資料庫記憶體資料庫
- 解讀記憶體資料庫的儲存需求RC記憶體資料庫
- 記憶體洩漏引起的 資料庫效能問題記憶體資料庫
- 基於記憶體的關聯式資料庫memsql初探記憶體資料庫SQL
- PG資料庫記憶體告警了怎麼分析資料庫記憶體
- 從Oracle資料庫故障到AIX記憶體管理Oracle資料庫AI記憶體
- 如何檢視MySQL資料庫佔多大記憶體,佔用太多記憶體怎麼辦?MySql資料庫記憶體
- 記憶體中的資料儲存記憶體
- iOS開發筆記— 資料庫、Crash、記憶體問題分析iOS筆記資料庫記憶體
- 圖資料庫 NebulaGraph 的記憶體管理實踐之 Memory Tracker資料庫記憶體
- 非易失性記憶體技術及資料庫記憶體資料庫
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- 達夢資料庫基礎知識(三)達夢資料庫記憶體結構資料庫記憶體
- 記憶體資料庫的行存表索引是怎麼做到加速的記憶體資料庫索引
- 【虹科分享】Redis 不僅僅是記憶體資料庫Redis記憶體資料庫
- 記憶體資料庫解析與主流產品對比(二)記憶體資料庫
- 記憶體資料庫解析與主流產品對比(一)記憶體資料庫
- 記憶體資料庫解析與主流產品對比(三)記憶體資料庫
- Redis 記憶體優化神技,小記憶體儲存大資料Redis記憶體優化大資料
- 產品管理圍繞的五個核心問題
- JVM虛擬機器和Oracle資料庫記憶體管理的學習JVM虛擬機Oracle資料庫記憶體
- IDEA中便捷記憶體資料庫H2的最簡使用方式Idea記憶體資料庫
- 資料庫物件比如表放入記憶體,行發生改變不會自動同步到記憶體的總結資料庫物件記憶體
- 適用於大型記憶體資料庫的 Amazon EC2 大記憶體 U7i 例項簡介記憶體資料庫
- 使用記憶體資料庫可以最佳化伺服器效能記憶體資料庫伺服器
- 成為MySQL DBA後,再看ORACLE資料庫(五、記憶體管理)MySqlOracle資料庫記憶體
- (二) MdbCluster分散式記憶體資料庫——分散式架構1分散式記憶體資料庫架構