读书人

对riak_core的探索 (三)

发布时间: 2012-07-20 10:38:30 作者: rapoo

对riak_core的探索 (3)
三、riak_core系统的工作方式

从原理上讲,riak_core通过一致性hash算法将数据随机均匀的分布在一个环上,对这些数据的操作可以并发的进行,因此riak_core本质上还是一个数据并行的分布式系统。

因此,基于riak_core构建分布式系统涉及到两个问题:
对数据如何分布:riak_core通过某种hash算法将数据随机均匀的分布在一个环上。选取那种hash算法,如何hash,都由开发人员进行选择。如果数据有唯一key,那么可以对key进行hash,具体来讲,riak这个kv 存储系统默认是对bucket+key做hash。(当然riak也可以对不同的bucket配置不同的hash方式,包括hash算法和要hash的数据)对数据如何处理:对数据的处理涉及到系统的业务逻辑,这得由开发人员自己实现。例如对riak来说,主要的业务逻辑就是存储和查找了。

2. 关于数据的分布

实际上数据hash的工作一般是通过riak_core提供助手模块riak_core_util中的函数chash_key进行,在交给vnode_master之前就预先计算好了数据在ring上的位置了(Index)。

ping() ->    DocIdx = riak_core_util:chash_key({<<"ping">>, term_to_binary(now())}),    PrefList = riak_core_apl:get_primary_apl(DocIdx, 1, rts),    [{IndexNode, _Type}] = PrefList,    riak_core_vnode_master:sync_spawn_command(IndexNode, ping, rts_vnode_master).


riak_kv中的例子要复杂很多,不过基本过程还是类似的。

to be continue...

4. 其它

在每个物理节点上会为每一类vnode启动一个riak_core_vnode_master进程,该进程控制这个物理节点上的所有同类vnode进程(通过上面提到的API)。所有这些riak_core_vnode_master进程的注册遵循一套约定的命名规则:master进程的注册名就是该类vnode的模块名字加上尾缀 "_master"。例如应用系统实现了一类vnode,其模块叫rts_stat_vnode,对应的riak_core_vnode_master进程名就在erlang中注册为“rts_stat_vnode_master”。

可以通过riak_core:vnode_modules()察看当前有多少vnode模块。(它实际上反映了通过riak_core:register_mod/3注册的模块,该函数将vnode模块信息放置在application环境中。许多函数调用了它,例如riak_core:register_vnode_module/1)

vnode进程是懒加载的,由riak_core_vnode_sup这个supervisor负责动态创建vnode进程(可以通过supervisor:which_children(riak_core_vnode_sup).察看当前的所有vnode_worker进程)。


浏览rts实时日志统计的代码有助于了解基于riak_core的应用系统的工作方式。
应用系统的功能由rts这个application实现,在rts_app这个application behaviour中可以看到它启动了rts_sup,成功后注册了3类vnode,并作为服务启动

读书人网 >开源软件

热点推荐