`
darkdestiny
  • 浏览: 4654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

浅看rabbitmq的mnesia部署

阅读更多

伸缩性:根据系统负载,可以在运行中过程中添加或者删除服务节点,改变系统处理规模。
mnesia是一个分布式数据库模块,由多个节点构成的数据库cluster,数据表的位置对应用是透明的。透过该特性,很容易构建出一个具有高伸缩性的系统。
rabbitmq是一个分布式的消息中间件,在mnesia-cluster的机制上可由多个节点共同构建。

rabbitmq在一个节点上初始化mnesia的过程概况如下:
1.启动mnesia,尝试连接到系统的其他节点上;
2.若无法连接到任何节点,表示该节点是系统中第一个启动的节点;
    2.1.在这种情况下可以检查数据库的老表,然后等待其他节点的连接;
3.若连接到一些节点,则这些节点会同步并合并schema表;
    3.1.在当前节点上创建schema表和其他数据表的副本后,该节点就和所连接的节点数据将保持同步和一致;

 

%%rabbit_mnesia.erl
init_db(ClusterNodes) ->
    case mnesia:change_config(extra_db_nodes, ClusterNodes -- [node()]) of
    end

 启动mnesia后连接到其他节点。

 

%%rabbit_mnesia.erl
    case mnesia:change_config(extra_db_nodes, ClusterNodes -- [node()]) of
        {ok, []} -> 

 无法连接到任何节点,则检查当前数据库目录下的老表是否正确。(数据库目录为空则建立新表)

 

%%rabbit_mnesia.erl
    case mnesia:change_config(extra_db_nodes, ClusterNodes -- [node()]) of
        {ok, [_|_]} ->
            IsDiskNode = ClusterNodes == [] orelse %%ClusterNodes==[]主节点
                lists:member(node(), ClusterNodes),
            ok = wait_for_replicated_tables(),
            ok = create_local_table_copy(schema, disc_copies),
            ok = create_local_table_copies(case IsDiskNode of

成功连接到一些节点后,mnesia之间交换数据库元信息,并等待在当前节点上有磁盘副本(disc_copies)的表和cluster完成同步。
            ok = wait_for_replicated_tables(),
如果当前节点是数据存储节点,还要在该节点上建立一些表格的磁盘副本
            ok = create_local_table_copies(case IsDiskNode of

 

我做了些简单的实验来观察mnesia相互连接时的特性。

(a@localhost)1> mnesia:create_schema([node()]).
ok
(a@localhost)2> mnesia:start().
ok
(a@localhost)3> mnesia:create_table(user, [{disc_copies, [node()]}]).
{atomic,ok}
(a@localhost)4> mnesia:info().
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
user           : with 0        records occupying 304      words of mem
schema         : with 2        records occupying 524      words of mem
===> System info in version "4.4.10", debug level = none <===
opt_disc. Directory "/home/hwh/a" is used.
use fallback at restart = false
running db nodes   = [a@localhost]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema,user]
disc_only_copies   = []
[{a@localhost,disc_copies}] = [schema,user]
3 transactions committed, 0 aborted, 0 restarted, 1 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok

 a节点上有两个磁盘表,分别是schema和user。

 

(b@localhost)1> mnesia:start().
ok
(b@localhost)2> mnesia:change_config(extra_db_nodes, ['a@localhost', 'b@localhost', 'c@localhost']--[node()]).
{ok,[a@localhost]}

 b节点尝试连接a,c节点,最终连接上了正在运行的a节点。连接之后b节点是什么状态呢?

 

(b@localhost)3> mnesia:info().
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
schema         : with 2        records occupying 533      words of mem
===> System info in version "4.4.10", debug level = none <===
opt_disc. Directory "/home/hwh/b" is NOT used.
use fallback at restart = false
running db nodes   = [a@localhost,b@localhost]
stopped db nodes   = [] 
master node tables = []
remote             = [user]
ram_copies         = [schema]
disc_copies        = []
disc_only_copies   = []
[{a@localhost,disc_copies}] = [user]
[{a@localhost,disc_copies},{b@localhost,ram_copies}] = [schema]
4 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok

可以看到user表是remote的,在a节点上有磁盘副本,在b节点上没有任何类型的副本。schema表已经合并,分别存储在a,b节点上。
此时在b节点上就可操作user表,表的位置是透明的。

 

(b@localhost)4> mnesia:change_table_copy_type(schema, node(), disc_copies).
{atomic,ok}
(b@localhost)5> mnesia:add_table_copy(user, node(), disc_copies).
{atomic,ok}
(b@localhost)6> mnesia:info().
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
user           : with 0        records occupying 304      words of mem
schema         : with 2        records occupying 542      words of mem
===> System info in version "4.4.10", debug level = none <===
opt_disc. Directory "/home/hwh/b" is used.
use fallback at restart = false
running db nodes   = [a@localhost,b@localhost]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema,user]
disc_only_copies   = []
[{a@localhost,disc_copies},{b@localhost,disc_copies}] = [schema,user]
6 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

在b节点上建立schema表和user表的磁盘副本后,发现user表不再是remote属性了,可从本地直接读取。

 

先退出b节点,再退出a节点,然后只重启b节点。

(b@localhost)1> mnesia:start().
ok
(b@localhost)2> mnesia:info().
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
schema         : with 2        records occupying 542      words of mem
===> System info in version "4.4.10", debug level = none <===
opt_disc. Directory "/home/hwh/b" is used.
use fallback at restart = false
running db nodes   = [b@localhost]
stopped db nodes   = [a@localhost] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema,user]
disc_only_copies   = []
[] = [user]
[{b@localhost,disc_copies}] = [schema]
2 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok
(b@localhost)3> mnesia:dirty_read(user, key).
** exception exit: {aborted,{no_exists,[user,key]}}
     in function  mnesia:abort/1

 这时看到user表此时是不可用的,因为a,b节点共同维护user表的一致性,但是b节点先退出,所以user表的最终状态由a节点决定。
启动a节点之后,user表就变成可用状态了。

(a@localhost)1> mnesia:start().
(b@localhost)4> mnesia:info().               
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
user           : with 0        records occupying 304      words of mem
schema         : with 2        records occupying 542      words of mem
===> System info in version "4.4.10", debug level = none <===
opt_disc. Directory "/home/hwh/b" is used.
use fallback at restart = false
running db nodes   = [a@localhost,b@localhost]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema,user]
disc_only_copies   = []
[{a@localhost,disc_copies},{b@localhost,disc_copies}] = [schema,user]
3 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok
 
分享到:
评论
2 楼 zdx3578 2012-02-02  
good  不错
1 楼 whhbest 2010-08-15  
讲的很透彻,目前正在学习rabbitmq源码

相关推荐

    RabbitMQ实战 高效部署分布式消息队列

    RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列

    RabbitMQ实战 高效部署分布式消息队列 带目录 高清版 PDF

    《RabbitMQ实战:高效部署分布式消息队列》是一本深度解析RabbitMQ技术的书籍,旨在帮助读者理解和掌握如何在实际项目中高效地运用这一强大的消息中间件。书中不仅涵盖了RabbitMQ的基础知识,还深入探讨了其在分布式...

    RabbitMQ实战 高效部署分布式消息队列 PDF下载

    《RabbitMQ实战:高效部署分布式消息队列》是一本深度解析RabbitMQ技术的书籍,专注于帮助读者理解和掌握如何在实际项目中高效地部署和使用这个强大的消息中间件。RabbitMQ作为开源的消息代理和队列服务器,广泛应用...

    RabbitMQ实战高效部署分布式消息队列.pdf+rabbitmq学习手册.pdf

    在本文中,我们将深入探讨RabbitMQ的核心概念、功能特性、部署策略以及如何通过实战来高效地部署分布式消息队列。 1. **RabbitMQ核心概念** - **Broker**: RabbitMQ服务器本身就是一个消息broker,它负责接收、...

    RabbitMQ实战 高效部署分布式消息队列.part1 高清

    RabbitMQ实战 高效部署分布式消息队列.part1.rar 高清 80M 2部分

    k8s下部署rabbitmq集群部署方式

    包含k8s下部署rabbitmq集群部署方式的说明,有pv.yaml, svc.yaml, statefulset.yaml

    RabbitMQ实战高效部署分布式消息队列

    《RabbitMQ实战高效部署分布式消息队列》这本书籍详细阐述了如何在实际环境中高效地部署和使用RabbitMQ这一流行的消息中间件。RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议实现的开源消息队列系统...

    rabbitmq安装配置部署文档

    rabbitmq安装配置部署文档 RabbitMQ是一种流行的消息队列服务器,广泛应用于各种分布式系统中。在本文档中,我们将详细介绍RabbitMQ的安装、配置和部署步骤。 一、RabbitMQ安装 在安装RabbitMQ之前,需要先安装...

    RabbitMQ实战高效部署分布式消息队列.pdf

    《RabbitMQ实战高效部署分布式消息队列》完整pdf书籍, 初学者可以看看

    rabbitmq部署包及部署文档

    本资源包含RabbitMQ的部署包及部署文档,是进行RabbitMQ安装与配置的重要参考资料。 首先,我们来深入理解RabbitMQ的核心概念: 1. **节点(Node)**:RabbitMQ运行在节点上,每个节点可以独立工作,也可以与其他...

    RabbitMQ实战 高效部署分布式消息队列pdf

    **RabbitMQ实战:高效部署分布式消息队列** 在当今的IT行业中,分布式系统和微服务架构变得越来越普遍,而消息队列作为这些系统中的重要组件,承担着数据同步、异步处理、解耦和负载均衡等关键任务。RabbitMQ,作为...

    RabbitMQ实战 高效部署分布式消息队列(part2)

    RabbitMQ实战 高效部署分布式消息队列(part2).请与part1一起下载解压。

    RabbitMQ高效部署分布式消息队列实战篇

    《RabbitMQ高效部署分布式消息队列实战篇》是一份深度解析RabbitMQ技术的教程,结合实际应用案例,旨在帮助读者深入理解并熟练掌握如何在分布式环境中高效部署和运用消息队列。RabbitMQ作为业界广泛采用的消息中间件...

    RabbitMQ实战:高效部署分布式消息队列 pdf版

    **RabbitMQ实战:高效部署分布式消息队列** 在当今的软件开发中,消息队列作为异步处理和系统解耦的重要工具,被广泛应用。RabbitMQ作为一个开源的消息代理和队列服务器,以其稳定性和易用性赢得了广大开发者的好评...

    RabbitMQ实战:高效部署分布式消息队列

    《RabbitMQ实战:高效部署分布式消息队列》是一本深度解析RabbitMQ技术的书籍,旨在帮助读者理解和掌握如何在实际环境中有效地部署和利用分布式消息队列。RabbitMQ作为一个开源的消息代理和队列服务器,是实现异步...

Global site tag (gtag.js) - Google Analytics