废话几句:
关于技术学习我的理解是三部曲,What,How,Why,具体释义请参见:学习技术的三步曲:What、How、Why。后续所有的技术博客我都均会按照这种章节来写我的技术博客。
Why:
在一个包含多个节点的Erlang集群中,请求需要正确地转发,数据需要在跨主机间正常访问和及时更新。为了保证数据的一致性,需要将这些操作放在一个事务中。
需要在运行期间能够添加、删除节点,并且提供持久化(persistence)确保能快速恢复所有可能的失败场景。
Mensia是综合了ETS的高效、简洁和DET的Erlang分布式特性。并在上面添加事务特性保证数据一致性的一个功能强大的分布式数据库。它的可简单,可复杂。
Mensia专注大规模并发,高可用的软实时系统(例如电信),如果系统需要下列需求,你可以考虑使用Mnesia:
对于简单的K-V查找需求使用ETS表或者dict模块库即可。对于大量二进制需求对每个项目进行独立处理。在处理审计和跟踪日志,你应该首选disk_log。
如果你正在寻找下一个Web2.0社交网络杀手级应用,它可能隔夜就能产生上亿条用户数据,就不要考虑使用Mnesia。对于容易访问大量的数据项,MySQL,Couch DB, PostgreSQL, Berkeley DB,是比较正确的选择。Erlang都有开源的驱动和API,Dets表的上限是2GB,存储类型是disc-only拷贝的Mnesia上限就是2GB。对于其它存储类型上限取决于操作系统架构,在32位系统的上限是4GB,64位系统的上限是:16 exabytes(16 * 1018 bytes)。如果你存储的数据超过这个限制,你需要考虑使用分片功能。将原始数据分片到集群中的各个节点。Mnesia支持数据分片。
Mnesia不适合存WEB2.0的所有数据,但是它可以用来保存所有用户的session信息作为系统cache,一旦用户登录它可以从持久化介质中读入,并且作为冗余拷贝到集群中的其它节点。当你检索用户登录时,可能会花费一点时间,但是一旦登录后,所有的session活动就会比较快了,当用户退出登录时,需要删除实体且更新用户信息到持久化数据库中。
Mnesia在处理上千万的用户实时数据是相当快和可靠的,所以在正确的场景下使用它在维护、操作方面获益不小。想想你的应用数据库,来至外部系统,API等不同格式的数据,让他们存储在相同的内存空间,并且可以通过Erlang进行均衡控制,你的应用不仅仅高效,而且容易维护。
由于英文水平有限,诚恳指正。
------------------------------------------------------
送上一首阿哲的歌新曲:you are my destiny