Mnesia用户手册:五,Mnesia高级特性

本章描述了构建分布式、容错的Mnesia数据库相关的高级特性:
1)索引
2)分布和容错
3)表分片
4)本地内容表
5)无盘节点
6)更多的schema管理
7)Mnesia事件处理
8)Mnesia应用调试
9)Mnesia里的并发进程
10)原型

1,索引
如果我们知道record的key,那么数据获取和匹配在执行起来都很高效
相反如果不知道record的key,那么表里所有的record都必须搜索
当表越来越大时,表的搜索就越来越耗时
Mnesia的索引就是用来解决这个问题的
下面的两个方法对已有的表操作索引:
[code]
mnesia:add_table_index(Tab, AttributeName) -> {aborted, R} | {atomic, ok}
mnesia:del_table_index(Tab, AttributeName) -> {aborted, R} | {atomic, ok}
[/code]
这两个方法对AttributeName定义的域加索引和删除索引:
[code]
mnesia:add_table_index(employee, salary)
[/code]
Mnesia的索引用于以下3个方法:
1)mnesia:index_read(Tab, SecondaryKey, AttributeName) -> transaction abort | RecordList
通过在索引里查询SecondaryKey来找到primary key,这样就能避免对整张表穷举搜索
2)mnesia:index_match_object(Pattern, AttributeName) -> transaction abort | RecordList
通过Pattern里的AttributeName域查找secondary key,然后找到primary key
3)mnesia:match_object(Pattern) -> transaction abort | RecordList
该方法可以使用任何索引

2,分布和容错
Mnesia是分布式、容错的DBMS,可以以多种方式在Erlang节点上备份表
Mnesia程序员不需要了解不同的表位于哪里,只用在程序里指定表的名字
这就是“位置透明”:
1)数据位于本地节点还是远程节点对程序员没有影响,只不过远程节点会慢些
2)数据库可以重新配置,表可以在节点之间移动,这些操作不影响用户程序
每张表有许多系统属性,如index和type
在表创建之时表属性就指定了,例如创建拥有两个RAM备份的新表:
[code]
mnesia:create_table(foo,
[{ramp_copies, [N1, N2]},
{attribtues, record_info(fields, foo)}]).
[/code]
表可以有如下属性,每个属性使用一个Erlang节点list
1)ram_copies
表的RAM备份会存在于Erlang节点list中的每个节点上
对于RAM备份,写操作不会写到硬盘里
但是如果RAM备份需要持久化时可以这样做:
i)mnesia:dump_tables/1方法用来将RAM表备份导入到硬盘
ii)表副本可以备份
2)disc_copies
表会位于RAM中,而且表的副本会存在于Erlang节点list中的每个节点的硬盘上
对该表的写操作会同时写入到RAM和硬盘备份里
3)disc_only_copies
表的副本只会位于Erlang节点list中每个节点的硬盘上
这种类型的表副本的缺点是访问速度,优点主要是不占内存

简单的说,ram_copies表示本地节点和list中节点都会存RAM表
disc_copies则本地存RAM表,list中存硬盘表
disc_only_copies则只会list中存硬盘表

使用表副本有两个原因:容错和速度
值得注意的是,表备份对这两个系统需求都提供了解决方案
如果有两个表副本,则一旦一个表崩溃了,还有另一个可以工作
如果有两个节点上的表副本,则两个节点上的应用可以直接从本地读数据而不用访问网络

对于读频繁而写很少的分布式应用,表副本就会大大加速读的速度,因为直接在本地节点读取数据
而这样做的缺点写速度减慢了,因为执行一个写操作时要花更多代价来更新表副本

3,表分片
为了处理超大型的表,表分片的概念引入,基本原理是将表分成多个可以管理的片断
每个片断都实现为一等Mnesia表,它们可以像其他表一样备份,可以拥有索引等等,但是不能有local_content和snmp连接
为了从片断表里访问数据,Mnesia必须决定该record属于哪张表,这通过mnesia_frag模块来实现mnesia_access callback行为
(略)

4,本地内容表
所有节点上的表副本的内容一样,但是有时候不同节点的内容不同有优点
如果我们创建表时指定{local_content, true}属性,则写操作只在本地副本上执行
而且,当在启动时初始化表,则表只会在本地初始化而表内容不会复制到其他节点

5,无盘节点
可以在无盘的节点上运行Mnesia,当然在这些节点上不可能拥有disc_copies或disc_only_copies类型的备份
最麻烦的是schema表,因为Mnesia需要schema来初始化自己
schema表可以位于一个或多个节点上
schema表的存储类型可以为disc_copies或ram_copies(不能是disc_only_copies)
Mnesia启动时使用schema表来决定应该和哪些节点建立联系
如果其他节点已经启动,则启动节点将其他节点的表定义和自己的表定义合并
参数extra_db_nodes包含一个节点list,Mnesia除了schema里的节点,还要和该参数的节点建立联系,默认值为[]
因此,当无盘节点需要从网络上的一个远程节点找到schema定义,则我们需要从-mnesia extra_db_nodes参数节点列表支持该信息
如果没有这个配置参数,Mnesia会以一个单节点系统启动
可以使用mnesia:change_config/2来给'extra_db_node'赋值并且强制建立一个连接,即mnesia:change_config(extra_db_nodes, NodeList)
应用参数schema_location控制Mnesia在哪里搜索schema:
1)disc
强制硬盘,schema假设位于Mnesia目录,如果找不到,则Mnesia拒绝启动
2)ram
强制ram,schema只位于ram中,启动时会生成一个很小的新schema
这个默认schema只包含schema表的定义并且只位于本地节点
3)opt_disc
可选的硬盘,schema可能只位于硬盘或ram
如果硬盘上找不到schema,Mnesia启动一个无盘节点(schema表的存储类型为ram_copies)
如果schema_location设置为opt_disc,则方法mnesia:change_table_copy_type/3可以用来改变schema的存储类型:
[code]
1> mneisa:start().
ok
2> mnesia:change_table_copy_type(schema, node(), disc_copies).
{atomic, ok}
[/code]

6,更多的Schema管理
可以从Mnesia添加和删除节点,这可以通过添加schema副本到这些节点来完成
mnesia:add_table_copy/3和mnesia:del_table_copy/2可以用来添加和删除schema表副本
添加一个节点会影响两点:1,允许其他表备份到该节点;2,它会在启动时连接硬盘节点
mnesia:del_table_copy(schema, mynode@host)从Mnesia系统删除'mynode@host'节点
mnesia:system_info(schema_location)和mnesia:system_info(extra_db_notes)用来决定schema_location和extra_db_nodes的值
mnesia:info/0用来打印出系统信息,可以在Mnesia启动之前就运行此方法

7,Mnesia事件处理
Mnesia可能生成系统事件和表事件这两种事件
用户进程可以订阅这些事件:
mneisa:subscribe(Event-Category)保证符合Event-Category类型的事件副本会发送给调用进程
mnesia:unsubscribe(Event-Category)对符合Event-Category类型的事件删除订阅
Event-Category可以为system或{table, Tab, simple}/{table, Tab, detailed}
系统事件语法为{mnesia_system_event, Event},表事件语法为{mnesia_table_event, Event}
所有的系统事件有Mnesia的gen_event handler来订阅,默认为mnesia_event
mnesia:system_info(subscribers)和mnesia:table_info(Tab, subscribers)用来决定哪个进程订阅了事件

[b]系统事件[/b]
{mnesia_up, Node}
{mnesia_down, Node}
{mnesia_checkpoint_activated, Checkpoint}
{mnesia_checkpoint_deactivated, Checkpoint}
{mnesia_overload, Details}
{inconsistent_database, Context, Node}
{mnesia_fatal, Format, Args, BinaryCode}
{mnesia_info, Format, Args}
{mnesia_error, Format, Args}
{mnesia_user, Event}

[b]表事件[/b]
{write, NewRecord, ActivityId}
{delete_object, OldRecord, ActivityId}
{delete, {Tab, Key}, ActivityId}
{write, Table, NewRecord, [OldRecords], ActivityId}
{delete, Table, What, [OldRecords], ActivityId}

9,Mnesia应用调试
Mnesia应用调试比较麻烦,因为理解事务和表加载工作机制很难,而且嵌套事务的语义也比较令人混淆
我们可以设置Mnesia的debug level:
[code]
mnesia:set_debug_level(Level)
[/code]
参数Level为none、verbose、debug、trace、false、true
也可以作为应用参数,在启动Erlang系统时指定:
[code]
% erl -mnesia debug verbose
[/code]

9,Mnesia里的并发进程
Mnesia里允许并发的事务提交,程序里不用显式的控制同步的进程
而且可以在用户继续使用表时移动、删除或重新配置表
详细参考四,事务和其他访问上下文

10,原型
如果我们决定使用Mnesia,通常会先将定义和数据写在纯文本里,这样比较简单
这样在构建原型时我们把定义和数据写在纯文本文件里,然后使用下面方法来处理:
mnesia:load_textfile(Filename)
mnesia:dump_to_textfile(Filename)
文本文件的格式为:
[code]
{tables, [{Typename, [Options]}, {Typename2 ...}]}.

{Typename, Attribute1, Attribute2 ...}.
{Typename, Attribute1, Attribute2 ...}.
[/code]
Options是{Key,Value}list,和mnesia:create_table/2的options一致
例如我们有一个healthy foods的数据库,有下面的文件FRUITS:
[code]
{tables,
[{fruit, [{attributes, [name, color, taste]}]},
{vegetable, [{attributes, [name, color, taste, price]}]}
]}.
{fruit, orange, orange, sweet}.
{fruit, apple, green, sweet}.
{vegetable, carrot, orange, carrotish, 2.55}.
{vegetable, potato, yellow, none, 0.45}.
[/code]
我们可以这样来加载fruits数据库:
[code]
1> mnesia:load_textfile("FRUITS").
New table fruit
New table vegetable
{atomic, ok}
2> mnesia:info().
---> Processes holding locks <---
---> Processes waiting for locks <---
---> Pending (remote) transactions <---
---> Active (local) transactions <---
---> Uncertain transactions <---
---> Active tables <---
vegetable : with 2 records occuping 299 words of mem
fruit : with 2 records occuping 291 words of mem
schema : with 3 records occuping 401 words of mem
===> System info in version "1.1", debug level = none <===
opt disc. Directory "/var/tmp/Mnesia.nonode@nohost" is used.
use fallback at restart = false
running db nodes = [nonode@nohost]
stopped db nodes = []
remote = []
ram copies = [fruit,vegetable]
disc copies = [schema]
disc only copies = []
[fnonode@nohost,disc copiesg] = [schema]
[fnonode@nohost,ram copiesg] = [fruit,vegetable]
3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok
[/code]
配置VScode编译、调试STM32(一)手动配置makefile和debug 做嵌入式的朋友们都应该有过想要有个功能强大的IDE或者编辑器,Keil MDK5、IAR EWARM是用的比较普遍的平台了,但是两者在编辑器方面都比较弱势,当然可以设置 或者使用外部编辑器,像Sourceinsight、notePad++这样,但毕竟需要切换回来进行Build、Debug,非常麻烦。 VScode从发布至今口碑一直很好,而且里面有非常多的插件,比如彩虹括号、Code Runner、... 阅读详情

相关推荐

python音频信号分析

声音以具有诸如频率、带宽、分贝等参数的音频信号的形式表示,典型的音频信号可以表示为幅度和时间的函数

MAY的博客 2785

Erlang之Mnesia简单入门

1.什么是Mnesia? Mnesia在我理解里面就是一种数据库,是Erlang自带的,它支持事务,这是最重要的事务就是要么做,要么全都不做,而且事务有几个重要的概念我们需要了解,因为只有我们知道事务有什么性质,才知道什么场景该用到事务,什么场景不需要。 2.事务几个重要概念 1.原子性(Atomicity)——每个事务都是一个不可分割的单元,要么整体成功,要么整体失...

fbher的博客 3792

FPGA领域四大顶级会议全景解读:从架构到应用的技术风向标

本文全景解读FPGA领域四大顶级会议(FPGA、FCCM、FPL、FPT),剖析其各自定位与技术风向。FPGA会议聚焦架构与工具创新,FCCM专攻硬件加速与定制计算,FPL覆盖从理论到应用的广泛领域,FPT则重点关注亚太市场与前沿应用。跟踪这些会议是把握FPGA技术演进、寻找创新灵感和应用方案的高效途径。

weixin_29274969的博客 335

mnesia mysql性能_erlang mnesia数据库简单应用

mnesia是erlang自带的分布式数据库,基于ets和dets实现的。mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库。最关键的是,mnesia实现了事务机制。mnesia数据库有一个schema表,保存着数据库相关的一些信息,例如如何将表保存到磁盘、如何加载这些表、在哪些节点间同步数据。构建集群,关键是处理这个schema表。调用函数mnesia...

weixin_34119722的博客 693

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4963

基于FPGA的图像预处理系统(图)

 北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使

lyzhangxianglove的专栏 1779

Mnesia:Erlang数据库

在做任何事之前,必须先创建一个Mnesia数据库。这件事只需要做一次。会在NodeList(它必须是一个包含有效Erlang节点的列表)里的所有节点上都初始化一个新的Mnesia数据库。这个案例给出的节点列表是[node()],也就是当前节点。Mnesia完成初始化并创建了一个名为的目录结构来保存数据库。然后退出Erlang shell,用操作系统的ls命令进行验证。/home/joe/some/path/to/Mnesia.company是将要保存这个数据库的目录。

qq_53795917的博客 1337

Python爬虫实战:利用Playwright和反反爬技术高效抓取Bloomberg金融数据

用户行为分析(鼠标移动、点击模式)请求头检测IP频率限制WebSocket通信验证Canvas指纹识别我们的爬虫需要模拟人类行为,使用代理IP池,并合理控制请求频率。

2201_76125261的博客 1020

mnesia 和mysql 同步,让我们聊聊Mnesia(一)

Mnesia是什么Mensia是Erlang的OTP库中一个带有强事务的分布式KV存储引擎。可以非常方便且高效的存储Erlang的任何数据类型。并且该系统支持持久化和内存表混合使用,不强制要求所有节点的性质相同。Mnesia的分布式事务是怎么实现的Mnesia的事务模型是2PC的模型,基本上可以分为以下几个步骤让所有参与的Node准备进行提交如果有一个Node回答No,让所有回答yes的Node回...

weixin_35894622的博客 420

【2026最新版】python点云处理算法汇总(长期更新版)

python点云处理算法整理。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 42万+

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3024

Mnesia 数据库学习1

mnesia:create_schema(NodeList)会在NodeList(它必须是一个包含有效Erlang节点的 列表)里的所有节点上都初始化一个新的Mnesia数据库。首先来看Mnesia的查询。事实上,列表推导和SQL之间的高度相似性并不是什么奇怪的事情,因为它们都是基于数学 里的集合论。Mnesia里的表是一个包含若干行的异键或同键表,其中每一行都是一个Erlang记录。在操作数据库之前,需要创建一个数据库架构(schema),启动数据库,添加一些表定义并 停止数据库,然后再重启它。

weixin_48092769的博客 203

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1344

erlang(十七)--Mnesia用户手册:五,Mnesia高级特性

本章描述了构建分布式、容错的Mnesia数据库相关的高级特性:  1)索引  2)分布和容错  3)表分片  4)本地内容表  5)无盘节点  6)更多的schema管理  7)Mnesia事件处理  8)Mnesia应用调试  9)Mnesia里的并发进程  10)原型  1,索引  如果我们知道record的key,那么数据获取和匹配在执行起来都很高效  相反如果

sdsabc2000的专栏 1722

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mnesia用户手册的阅读总结:

1. Mnesia数据库被组织为一个表的集合, 每个表又实例(Erlang record)构成, 表也有一些属性, 如位置(location)和持久性(persistence)等. 2. 通过一个基本的例子介绍Mnesia数据库的使用: 有如下的数据模型: 三个实体: 雇员employee,项目project,部门department 三个实体的关系式: a

6904

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RabbitMQ修改数据目录MNESIA数据目录

Mnesia作为数据库存储引擎。Mnesia是一个基于Erlang语言开发的分布式数据库,其默认情况下将数据存储在节点的本地磁盘上。Mnesia提供了一个基于事务的存储系统,支持ACID属性(原子性、一致性、隔离性和持久性),可以保证数据的完整性和可靠性。Mnesia可以将数据存储在节点的本地磁盘上,也可以将数据存储在多个节点之间,从而实现数据的分布式存储和管理。在RabbitMQ中,Mnesia用于存储所有队列、交换器、绑定和节点的元数据信息。

出发之前永远是梦想,上路之后永远是挑战。 2647

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Mnesia(三)

内存表(RAM Table)以其极高的性能适用于对速度要求极高的场景,但由于数据是瞬态的,一旦系统崩溃或重启,所有数据会丢失。其值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据,数据存储在磁盘上。它的值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据。用于获取与记录相关的信息,使用语法{attribute,record_info(fields,xxx)},而不需要显式的逐个字段的指定列名。Args:一个包含表配置的列表,它指定了该表的属性和行为。

m0_63236927的博客 1964

[Erlang]Mnesia的备份与还原

数据库在使用当中都会有数据库备份工作,当数据库发生严重错误无法启动,或者数据丢失时可以及时有效地恢复数据。文章首先介绍如何备份和还原Erlang Mnesia数据库,然后从备份、回滚两大方面深入探讨mnesia的备份机制。备份数据库在Mnesia启动后,可以使用mnesia:backup()备份,函数原型:mnesia:backup(Opaque [, BackupMod]) -> ok | {e

Sunface撩技术 1837

Mnesia用户手册:三,构建Mnesia数据库

Mnesia用户手册:三,构建Mnesia数据库 博客分类:  Erlang 数据结构Erlang配置管理 本章详细介绍了设计Mnesia数据库和编程结构的基本步骤:  1)定义schema  2)数据模型  3)启动Mnesia  4)创建新表  1,定义schema  Mnesia系统的配置在schema里描述  schema是一个特殊的表,它包含了表

sdsabc2000的专栏 682

Mnesia RocksDB:为Mnesia数据库系统注入新活力

Mnesia RocksDB:为Mnesia数据库系统注入新活力 项目介绍 Mnesia RocksDB 是一个为 Mnesia 数据库系统设计的 RocksDB 后端插件。Mnesia 是 Erlang/OTP 中的一个分布式数据库管理系统,而 RocksDB 是一个高性能的嵌入式键值存储库。通过将 RocksDB 作为 Mnesia 的后端存储,Mnesia 能够突破 dets 模块的 2GB...

gitblog_00487的博客 1161

生产环境中的Que:编译发布与Mnesia数据库配置指南

Que是一个基于Mnesia的Elixir后台任务处理库,它提供了简单高效的作业处理能力。在生产环境中,正确配置Mnesia数据库并进行编译发布是确保系统稳定运行的关键步骤。本文将详细介绍如何在生产环境中配置Que的Mnesia数据库以及进行编译发布的完整流程。 ## 为什么选择Que与Mnesia? Que作为一款轻量级的作业处理库,与Mnesia数据库的结合为Elixir应用提供了独特的优

gitblog_00830的博客 986

Mnesia 事务

在 Erlang 中,mnesia:transaction/1 提供了一个事务机制,保证了一组数据库操作要么全部成功,要么全部失败,避免了并发访问时的数据不一致问题。通过将多个数据库操作(mnesia:delete/1, mnesia:write/1 等)封装在一个F函数中,然后通过 mnesia:transaction(F) 执行这个函数,确保了事务的一致性和隔离性。事务机制的关键作用是解决并发访问中的竞争条件问题。

m0_63236927的博客 507

Windows 3 分钟装 APK:用 APK Installer 把安卓应用装进电脑和手机的完整指南

**先摆一个你可能遇到过的场景。** 一个只有安卓版的游戏或应用,你想在电脑上用。第一条路是开模拟器——装完常驻后台,内存跟着走;第二条路是敲命令行把包推到手机——第一条指令就劝退你。 **APK Installer 就是为这个场景做的工具。** 它是一个 Windows 上的安卓应用安装器:把 .apk 文件拖进窗口,它立刻列出应用名称、版本号和权限清单,点一下"安装",应用就装进 Windo

gitblog_01037的博客 421

erlang mnesia集群建立

mnesia数据可以实现集群共享数据库。数据库表可以在其中某个节点所在的数据库目录,可以拷贝到其他节点数据库目录,mnesia会同步数据库,在启动时执行mnesia:wait_for_tables实现数据库数据同步。 erlang mnesia集群建立有两种方法: 方法一: 1、启动时所有节点,并且使节点互通(设置同样的cookie,并且启动epmd,可以通过net_adm:ping

erlang 2707
上一篇: Mnesia用户手册:四,事务和其他访问上下文
下一篇: Erlang实现简单Web服务器
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值