簡體   English   中英

內存數據庫如何提供持久性?

[英]How do in-memory databases provide durability?

更具體地說,是否有不需要輔助存儲(例如HDD)的數據庫來提供持久性?

注意:這是我先前的問題跟進

如果您希望持久化寫入持久存儲的操作是唯一的選擇(您可能不想在獨立的數據中心中構建具有獨立電源的許多集群,而仍然祈禱它們永遠不會同時發生故障)。 另一方面,這取決於您的數據的價值。 如果有必要,那么具有足夠復制能力的純內存數據庫可能是合適的。 順便說一句,即使將硬盤存儲在硬盤上,硬盤也可能會失敗,因此這不是理想的解決方案。 您可以查看http://www.julianbrowne.com/article/viewer/brewers-cap-theorem選擇復制權衡。

Prevayler http://prevayler.org/是使用持久性存儲備份的內存系統示例(代碼非常簡單,順便說一句)。 持久性是通過保存在適當設備(例如HDD或SSD)上的事務日志提供的。 修改數據的每個事務都會寫入日志,該日志用於在斷電或數據庫/系統重新啟動后恢復數據庫狀態。 除了Prevayler,我還看到了用於持久化消息隊列的類似方案。 實際上,這與“經典” RDBMS的工作方式類似,不同之處在於日志僅是寫入底層存儲的數據。 日志還可以用於復制,因此您可以將日志的一個副本發送到活動副本,將另一個副本發送到HDD。 當然,各種組合都是可能的。

所有數據庫都需要非易失性存儲以確保持久性。 內存映像不提供耐用的存儲介質。 釋放電源后不久,您的內存映像將失效。 同樣,一旦數據庫進程終止,操作系統將釋放包含內存映像的內存。 無論哪種情況,都將丟失數據庫內容。

在將任何更改寫入非易失性存儲器之前,它們並不是真正的持久性。 這可以包括將所有數據更改寫入磁盤,也可以寫入所做更改的日志。

在空間或大小至關重要的情況下,非易失性存儲器(例如閃存)可以代替HDD。 但是,據報告閃存存在可寫入的寫入周期數問題。

在回顧了您以前的文章之后,只要您可以使最后一台服務器保持運行狀態,多服務器復制就可以工作。 一旦出現問題,您就可以放松隊列。 但是,可以考慮使用許多替代Oracle的方法。

PDA通常使用電池備份的內存來存儲其數據庫。 電池耗盡后,這些數據庫將無法使用。 備份很重要。

內存中是指所有數據都存儲在內存中以便訪問。 讀取數據后,可以從磁盤或內存中讀取數據。 對於內存數據庫,總是從內存中檢索它。 但是,如果服務器突然關閉,數據將丟失。 因此,據說內存數據庫缺乏對ACID持久性部分的支持。 但是,許多數據庫采用不同的技術來實現持久性。 下面列出了此技術。

  • 快照-在給定的時間記錄數據庫的狀態。 如果是Redis,則每兩秒鍾將數據持久保存到磁盤中,以實現持久性。
  • 事務記錄-對數據庫的更改記錄在日志文件中,這有助於自動恢復。
  • 通常以靜態RAM的形式使用NVRAM,並由電池電源支持。 在這種情況下,可以在重啟后從其最后的一致狀態恢復數據。

內存數據庫中的classic不能提供經典的持久性,但是根據您的要求,您可以:

  • 使用memcached(或類似方法)跨足夠多的節點存儲在內存中,這樣就不太可能丟失數據
  • 將oracle數據庫存儲在基於SAN的文件系統上,您可以為其提供足夠的RAM(例如3GB),整個數據庫都位於RAM中,因此磁盤搜索訪問永遠不會將應用程序存儲下來。 然后,SAN負責將緩存內容延遲回寫到磁盤。 這是一個非常昂貴的選擇,但是在需要高性能和高可用性且他們負擔得起的地方很常見。
  • 如果您負擔不起SAN,請安裝ram磁盤並在其中安裝數據庫,然后使用數據庫級復制(如日志傳送)提供故障轉移。

您為什么不想使用永久性存儲?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM