Erlang 20

2. Mnesia

2 Mnesia

电信系统中的数据管理有许多方面,其中一些但并非全部由传统商业数据库管理系统(DBMS)解决。特别是许多不间断系统需要高水平的容错能力,再加上DBMS的要求与应用程序在相同的地址空间中运行,导致我们实现了一个名为Mnesia的新DBMS。

Mnesia被实现并与Erlang紧密相连。它提供了实现容错通信系统所必需的功能。

Mnesia是一款多用户分布式DBMS,专门用于用Erlang编写的工业电信应用程序,该应用程序也是预期的目标语言。Mnesia试图解决典型电信系统所需的所有数据管理问题。它具有许多通常在传统数据库中找不到的功能。

在电信应用中,传统DBMS提供的功能有不同的需求。现在在Erlang实现的应用程序需要混合广泛的功能,而传统的DBMS通常不满足这些功能。Mnesia的设计符合以下要求:

  • 快速实时键/值查找

  • 复杂的非实时查询,主要用于操作和维护。

  • 由于分布式应用程序而产生的分布式数据

  • 高容错

  • 动态重构

  • 复杂对象

Mnesia设计时考虑到了电信应用的典型数据管理问题。这使得Mnesia与大多数其他DBMS不同。因此,Mnesia将传统数据库中的许多概念(如交易和查询)与数据管理系统中用于电信应用的概念结合起来,例如:

  • 快速实时操作

  • 可配置的容错度(通过复制)

  • 重新配置系统而不停止或挂起系统的能力。

Mnesia也很有趣,因为它与Erlang紧密耦合,因此几乎可以将Erlang变成数据库编程语言。这有很多好处,最重要的是DBMS使用的数据格式与用于操作数据的编程语言使用的数据格式之间的阻抗不匹配完全消失。

2.1 Mnesia数据库管理系统(DBMS)

特征

Mnesia包含以下功能,它们组合起来生成一个用Erlang编写的容错分布式DBMS:

  • 数据库模式可以在运行时动态重新配置。

  • 表可以声明为具有诸如位置、复制和持久性等属性。

  • 可以将表移动或复制到多个节点,以提高容错能力。系统的其余部分仍然可以访问表来读取、写入和删除记录。

  • 表位置对程序员是透明的。程序地址表名和系统本身跟踪表的位置。

  • 数据库事务可以分布,多个函数可以在一个事务中调用。

  • 几个事务可以并发运行,它们的执行由DBMS完全同步。Mnesia确保没有两个进程同时操作数据。

  • 可以为事务分配在系统中所有节点上执行的属性,也可以在无节点上执行。事务也可以被绕过,以支持运行“脏操作”,这减少了管理费用,并且运行得很快。

这些特性的详细信息将在下面的部分中描述。

附加应用程序

查询列表理解(QLC)可与Mnesia一起使用,以生成增强Mnesia操作能力的专业功能。QLC拥有自己的文档,作为OTP文档集的一部分。QLC与Mnesia一起使用时的主要特点如下:

  • QLC可以为Mnesia DBMS优化查询编译器,从本质上使DBMS更高效。

  • QLC可以用作Mnesia的数据库编程语言。它包含一个名为“list comprehensions”的符号,可用于对一组表进行复杂的数据库查询。

有关qlc的信息,请参阅qlcSTDLIB中的手册页。

什么时候使用Mnesia

在以下类型的应用程序中使用Mnesia:

  • 需要复制数据的应用程序。

  • 对数据执行复杂搜索的应用程序。

  • 需要使用原子事务同时更新多条记录的应用程序。

  • 使用软实时特性的应用程序。

Mnesia不适用于下列类型的应用程序:

  • 处理纯文本或二进制数据文件的程序。

  • 应用程序只需要一个可以存储到光盘的查找字典。 这些应用程序使用标准库模块dets,这是模块ets的基于光盘的版本。 有关dets的信息,请参阅STDLIB中的dets手册页。

  • 需要光盘记录功能的应用程序。 这些应用程序可以首选使用模块disk_log。 有关disk_log的信息,请参阅Kernel中的disk_log手册页。

  • 硬实时系统。