赞
踩
网上的示例,大多以单节点为例,集群中的使用方法参考。注意scheme的设置,节点之间没有主从之分。
分布式环境中很多时候需要我们动态的增加或减少节点。
mnesia:change_config(extra_db_nodes, NodeList)
(参数是新的node的节点, 如果成功,返回{ok, ResNodeList}, 其中ResNodeList是已经加到mnesia cluster中的节点), 扩容之后需要拷贝表数据到新节点:
mnesia:change_table_copy_type(Table, Node, Type)
mnesia:del_table_copy(Tab, Node)
(这个函数在Node上删除Tab表格的备份,如果这个表格的最后一个备份被删除,这个表也就被删除了, 这个函数还可以用来删除schema, 如果删除schema, 这个node将在mnesia cluster中被移除,调用之前 需要在这个node上停掉mnesia)
mnesia:stop()
mnesia:delete_schema(DiscNodes)
索引的好处无需多言,mnesia创建的index的方法如下:
mnesia:add_table_index(Tab,AttributeName)
索引带来方便的同时,也带来负面影响。
尽管mnesia有自动备份机制,也难100%保证数据不会出问题。当数据库发生严重错误无法启动,或者数据丢失时可以及时有效地恢复数据。
在Mnesia启动后,可以使用mnesia:backup()备份,函数原型:
mnesia:backup(Opaque [,BackupMod]) -> ok | {error,Reason}
在mnesia启动后,可以使用mnesia:restore()恢复,函数原型:
mnesia:restore(Opaque, Args) ->{atomic, RestoredTabs} |{aborted, Reason}
恢复过程相关的所有表将写锁,可在mnesia不用重启的情况下恢复数据
更多关于备份回滚参考
在我们的项目中,由于初始设计的不足导致,常常需要在后续开发过程中修改表(record)的结构,参考。
这里的dump和自研数据不是一个概念,自研数据库的dump用于备份数据,这里的dump是数据落地的意思。通过erlang的启动参数配置dump参数
由于dets表2G的限制,对于数据量过大的表,需要使用分片功能把表分成较小的文件存在磁盘上。可以指定分片数量,分片表数据和正常的表数据在集群中分布一致。参考
dets的2G限制让人诟病,32位的遗留问题。 有下面几种方法突破2G限制:
修改dets源码,移除相关限制,参考
参考问题7.
mnesia可以指定引擎,以leveldb为例,参考如下链接:
http://blog.csdn.net/jimmychou/article/details/3988468
https://www.tuicool.com/articles/yyM3Uz2
http://www.erlang-factory.com/static/upload/media/143415340626199euc2015mnesialeveldb.pdf
https://github.com/mikpe/mnesia_eleveldb
mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold}。这个警告发生在dump操作过程中。参考处理方法
只要是集群就有可能存储脑裂问题,关于脑裂引发的问题及解决方法自行百度。开源库ekka提供了解决方法, github.
以往的关系型数据库中提供了主键的自增方法,非常好用。mnesia的实现方法
mnesia在运行时提供了大量的统计量,对这些统计量进行监控,有助于正确使用mnesia,以及对mnesia进行调优,这些统计量包括。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。