【編者按】作者Yiftach Shoolman是Redis Labs的聯合創始人兼CTO,擁有著豐富的實踐經驗。Yiftach 之前曾是Crescendo Networks(后被F5收購)的總裁、創建者兼CTO,更早還是Native Networks的技術副總裁。在本文中,Yiftach直述了當下開發者對內存數據庫所存在的偏見,并提出了一些技術選型參考意見。
以下為譯文
時下,我們正處于一個日新月異的時代,而優秀應用的響應時間往往需要被控制在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級別,內存的花費很顯然會成為問題,然而當下已經有使用閃存擴展內存的技術存在,從而降低花費。但需要注意的是,使用閃存來擴展內存勢必會影響到系統性能,因此這里理想的技術是控制閃存和內存的比例以達到一個理想的性價比。
綜上所述,根據實際場景來選擇合適的數據庫技術將會大幅度提高資源利用效率。同時,新型數據庫出現已有很長一段時間,因此拋棄不必要的成見才能讓工作事半功倍。
原文鏈接:Busting 4 Myths of In-Memory Databases