Mnesia,是使用Erlang程式語言編寫的分佈式、軟實時數據庫管理系統。它也是作為開放電信平台的一部分發佈的。[1]
描述
Mnesia 與 Erlang 都是愛立信公司為與電信相關的軟實時分佈式高可用的計算工作而開發的。它既不是為了通用辦公型數據處理設計的數據庫管理系統。也無意於替代基於 SQL 語言的系統。它是為了幫助 Erlang 實現數據管理系統類的數據持久化而存在的。[2]比起帶有SQL的數據庫伺服器,它與像 Berkeley DB 這樣的嵌入式數據庫管理系統更相似。
表中的「行」代表了包含一個鍵值以及一個數據域的記錄。這條數據域可能是一個包含任意複雜形式的 Erlang 數據結構的元組。
數據庫模型是關係型的,但它並不是用大家比較熟悉的 SQL 操作的。一個數據庫中的多個表可以在互相之間構建聯繫。[3]
Mnesia 高可用的一個關鍵特性就在於數據庫中的表可以重新配置,並且可以在節點之間互相遷移。你不僅可以在數據庫運行的時候這樣操作,甚至還可以在數據庫正在讀寫的時候操作。
Mnesia 的查詢語言不是 SQL 語言,而是 Erlang 本身。[4]這也意味着它可以讓開發者直接使用 erlang 語言的特性來表達事務,開發者可以僅僅使用一個語言開發一個完整的應用程式。
Erlang 是函數式程式語言。Mnesia 正是基於這一點來做到 ACID 事務的。作為事務運行的函數塊僅僅只是一個非常普通的被稱為函數對象的 Erlang 構造體。[5]寫成單條 Mnesia 語句為 mnesia:transaction(F)
。 這樣一來就可以使原始碼變得要比 SQL 的 BEGIN
/ COMMIT
配對的語法更清晰,同時也避免了在過程中沒有關閉事務的問題。
又因為 Erlang 的函數式特性,嵌套事務也非常簡單。也可以在多個結點(也就是單獨的伺服器)里發佈事務。以這種方式使用事務可以讓語義保持一致,同時也讓編寫庫代碼在上下文保持一致的效果。
Mnesia 的一般編碼風格是總是使用事務。考慮到性能問題,Mnesia 也支持用戶使用「髒操作」來避免使用事務。這些操作雖然是對 ACID 原子性以及隔離性的妥協,但也提供了大概10倍的吞吐量。[6]除此以外,它還提供了將數據存儲在內存中的選項,然而這麼做會丟失 ACID 的持久性。
Mnesia 是 LYME web 應用程式棧的一部分。這與 LAMP 類似,但它是基於 Erlang。用 Erlang實現會帶來一個效率上的好處,那就是開發出來的應用程式自始至終是運行在單個虛擬機上的。LYME 充分利用了這一點,因為連 Yawsweb 伺服器都是由 Erlang 實現的。
Mnesia 和 Erlang 都是愛立信計算機科學實驗室開發的。他們都是作為開源軟件發佈的。Mnesia 是基於Mozilla公共許可證的衍生版發佈的。[8]他們都是根據開源 Erlang 公共許可證發行的。[9]
參見
- Riak
- Apache Cassandra
- Couchbase
- CouchDB
- LYME (software bundle)
引用
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.