Mnesia

維基百科,自由的百科全書
Mnesia
原作者喬·阿姆斯特朗, 羅伯.威廉, 丹.古德門德松以及其他人
開發者愛立信
當前版本
  • 4.16 (2019年5月13日;穩定版本)[1]
編輯維基數據鏈接
程式語言Erlang
作業系統跨平台
平台跨平台
類型關係型 數據庫管理系統
許可協議Erlang開源許可證
網站www.erlang.org/doc/man/mnesia.html
LYME (software bundle) 基於 Erlang 且包含 Mnesia. 它們都是自由及開放原始碼軟件

Mnesia,是使用Erlang程式語言編寫的分佈式軟實時數據庫管理系統。它也是作為開放電信平台的一部分發佈的。[2]

描述[編輯]

Mnesia 與 Erlang 都是愛立信公司為與電信相關的軟實時分佈式高可用的計算工作而開發的。它既不是為了通用辦公型數據處理設計的數據庫管理系統。也無意於替代基於 SQL 語言的系統。它是為了幫助 Erlang 實現數據管理系統類的數據持久化而存在的。[3]比起帶有SQL的數據庫伺服器,它與像 Berkeley DB 這樣的嵌入式數據庫管理系統更相似。

數據庫模型[編輯]

表中的「行」代表了包含一個鍵值以及一個數據域的記錄。這條數據域可能是一個包含任意複雜形式的 Erlang 數據結構的元組

關係型特性[編輯]

數據庫模型是關係型的,但它並不是用大家比較熟悉的 SQL 操作的。一個數據庫中的多個表可以在互相之間構建聯繫。[4]

Mnesia 高可用的一個關鍵特性就在於數據庫中的表可以重新配置,並且可以在節點之間互相遷移。你不僅可以在數據庫運行的時候這樣操作,甚至還可以在數據庫正在讀寫的時候操作。

編碼[編輯]

Mnesia 的查詢語言不是 SQL 語言,而是 Erlang 本身。[5]這也意味着它可以讓開發者直接使用 erlang 語言的特性來表達事務,開發者可以僅僅使用一個語言開發一個完整的應用程式。

事務[編輯]

Erlang 是函數式程式語言。Mnesia 正是基於這一點來做到 ACID 事務的。作為事務運行的函數塊僅僅只是一個非常普通的被稱為函數對象的 Erlang 構造體。[6]寫成單條 Mnesia 語句為 mnesia:transaction(F)。 這樣一來就可以使原始碼變得要比 SQL 的 BEGIN / COMMIT 配對的語法更清晰,同時也避免了在過程中沒有關閉事務的問題。

又因為 Erlang 的函數式特性,嵌套事務也非常簡單。也可以在多個結點(也就是單獨的伺服器)里發佈事務。以這種方式使用事務可以讓語義保持一致,同時也讓編寫庫代碼在上下文保持一致的效果。

Mnesia 的一般編碼風格是總是使用事務。考慮到性能問題,Mnesia 也支持用戶使用「髒操作」來避免使用事務。這些操作雖然是對 ACID 原子性以及隔離性的妥協,但也提供了大概10倍的吞吐量。[7]除此以外,它還提供了將數據存儲在內存中的選項,然而這麼做會丟失 ACID 的持久性。

有效執行[編輯]

Mnesia 是 LYME web 應用程式棧的一部分。這與 LAMP 類似,但它是基於 Erlang。用 Erlang實現會帶來一個效率上的好處,那就是開發出來的應用程式自始至終是運行在單個虛擬機上的。LYME 充分利用了這一點,因為連 Yawsweb 伺服器都是由 Erlang 實現的。

地址空間在數據與代碼之間都是共享的(在 Erlang 語言中,這樣做是安全的。),包括 Mnesia 的表數據。[8]

起源和許可[編輯]

Mnesia 和 Erlang 都是愛立信計算機科學實驗室開發的。他們都是作為開源軟件發佈的。Mnesia 是基於Mozilla公共許可證的衍生版發佈的。[9]他們都是根據開源 Erlang 公共許可證發行的。[10]

ejabberd[編輯]

將 Mnesia 嵌入到基於 Erlang 的 Jabber 守護進程 ejabberd 也是一個選項。[11]

參見[編輯]

引用[編輯]

  1. ^ http://erlang.org/doc/apps/mnesia/notes.html#mnesia-4.16; 出版日期: 2019年5月13日.
  2. ^ Håkan Mattsson; Hans Nilsson; Claes Wikstrom. Mnesia - 用于电信应用程序的稳健性分布式数据库管理系统 (PDF). 1999 [2018-01-12]. (原始內容 (PDF)存檔於2021-09-22). 
  3. ^ Mnesia的目标. Erlang開源項目. [2018-01-12]. (原始內容存檔於2021-06-20). 
  4. ^ Mnesia 入门指南. Erlang 開源項目. [2018-01-12]. (原始內容存檔於2021-06-20). 
  5. ^ Mnesia 引用手册 (v 4.4.5). Erlang 開源項目. [2018-01-12]. (原始內容存檔於2022-05-12). 
  6. ^ 6.17 函数表达式. Erlang 開源項目. [2018-01-12]. (原始內容存檔於2010-06-13). 
  7. ^ Gavin Terrill. Erlang's Mnesia - 为高扩展性应用设计的分布式数据库管理系统. InfoQ. 2007年8月20日 [2018年1月12日]. (原始內容存檔於2022年4月26日). 
  8. ^ Mnesia 性能基础. [2018-01-12]. (原始內容存檔於2012-12-02). 
  9. ^ 关于Erlang. Erlang開源項目. [2018-01-12]. (原始內容存檔於2020-02-22). 
  10. ^ Erlang公共许可证, V 1.1. Erlang開源項目. [2018-01-12]. (原始內容存檔於2021-11-05). 
  11. ^ ejabberd 项目主页. [2022-05-15]. (原始內容存檔於2022-05-04).