`
cryolite
  • 浏览: 581599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对Riak Core的探索 (5) 业务逻辑的实现:数据如何处理

阅读更多
业务逻辑的实现:数据如何处理

重点是数据如何处理:Riak Core提供了一个统一的接口以控制分布在ring上的数据的计算(操作)。

Riak Core的数据控制接口

如前所述,每类vnode提供了一套服务,每个服务由在各个partition上的vnode进程组成,这些进程实际分布在各个物理节点上。对于每一个物理节点,每类服务会有一个riak_core_vnode_master进程提供统一的接口。实际上riak_core_vnode_master进程的主要作用是将请求转发给对应的vnode进程进行处理,无论这个vnode进程在哪个物理节点上。

riak_core_vnode_master模块是一个gen_server的实现,它对外提供了一套API。

引用
用OO打个比方,如果将riak_core_vnode_master比作OO中的一个类,这些API相当于这个类的静态公共方法,这些静态公共方法提供控制这个类的对象的初始化、以及这些对象的控制等,也就是说所有与这些对象打交道的操作统一通过这些静态公共方法进行。


我们主要通过riak_core_vnode_master模块提供的API控制集群内的所有vnode进程,从而对外提供数据处理服务,这些API有:
  • start_vnode(VNodeModule)函数:启动vnode_master进程(一个gen_server进程)并注入用户逻辑,用户逻辑在VNodeModule参数指定的模块中实现。通过这种方式在启动时将用户的业务逻辑注入进来(类似IoC的构造器注入);
  • get_vnode_pid(PartitionId, VNodeModule)函数:获取某个partition上某类服务的vnode进程,如果不存在则调用riak_core_vnode_sup创建之(也就是说vnode进程是懒加载,不过全部挂在riak_core_vnode_sup这个supervisor树下);
  • 用command/3,sync_command/3,sync_spawn_command/3:会将请求命令(command)发给对应的vnode进程,最后调用用户实现的vnode模块中的handle_command回调函数处理;
  • converage/5函数:稍候研究 to be continue...

可以看到riak_core_vnode_master的主要任务是转发用户请求,可以异步转发,也可以同步转发。如何转发:根据请求的数据所在的partition,可以算出partition所在的物理节点和对应的vnode进程Pid,知道了物理节点和vnode进程的pid后就可以向此物理节点上的vnode进程直接发送消息。


不过,vnode进程的生成不由vnode_master直接负责,所有vnode进程的创建实际上由一个专门的riak_core_vnode_sup模块负责(这可模块实际上是一个simple_one_for_one策略的supervisor,这种启动策略使它只能管理同一类erlang进程,不过它的特点是能动态的创建无数的相同类型的子进程,见supervision principles )。vnode进程本质上是一个gen_fsm状态机(可以看到有一个active状态)



3. 数据处理:一个完整的例子

try-try-try的例子代码要简单许多,这个例子是随机ping一个分区vnode,返回结果是该分区的ID和物理节点,整个过程如下:
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,并作为服务启动
  • 大小: 59.6 KB
分享到:
评论

相关推荐

    Laravel开发-laravel-riak

    - 考虑使用 Riak 的数据类型(如sets, maps, counters)来实现更复杂的业务逻辑。 - 为了提高性能,可以利用 Riak 的二次索引来优化查询。 - 监控 Riak 的性能和健康状况,确保系统的稳定运行。 - 在生产环境中,...

    flaviodb:实现固定消息流存储的 Riak Core 示例项目

    数据库设置钢筋 riak_core 模板git clone https://github.com/basho/rebar_riak_core.gitcd rebar_riak_coremake install创建项目模板mkdir flaviodbcd flaviodb# download rebar and set executable ...

    Riak 学习文档

    3. **Key-Value 存储**:Riak 存储的数据模型是键值对,简单且高效,适合处理非结构化数据。 4. **Secondary Indexes**:Riak 支持二级索引,这允许用户通过多种方式查询数据,而不只是通过键值。 **准备与安装** ...

    Laravel开发-laravel-riak-auth

    在本文中,我们将深入探讨`Laravel开发-laravel-riak-auth`这一主题,这是一个针对Laravel框架的特定身份验证实现,它利用了Riak数据库。首先,我们需要理解Laravel和Riak的基本概念。 **Laravel**是PHP世界中最受...

    riak:Riak是Basho Technologies的去中心化数据存储

    Riak是分布式,分散式数据存储系统。 在Wiki中,您将找到设置和使用Riak的“快速入门”指导。 有关更多信息,请浏览以下文件: 自述文件:此文件 许可证:Riak的发布许可证 doc / admin.org:Riak管理指南 ...

    riak-erlang-http-client:使用HTTP接口的Riak Erlang客户端

    git clone git://github.com/basho/riak-erlang-http-client.gitcd riak-erlang-http-clientmake 如果您对协议缓冲区Riak Erlang客户端( )早已熟悉,则应该发现此客户端很熟悉。 刚刚替补调用riakc_pb_socket通过...

    riak-Erlang.rar

    1. 分布式架构:Riak的数据分布在整个集群中,每个节点都存储数据的一部分,并通过一致性哈希(Consistent Hashing)进行数据分区,实现水平扩展。 2. 冗余与复制:Riak支持多副本机制,可以设置不同的复制因子以...

    riak_core:Riak使用的分布式系统基础架构

    里亚克核心 Riak Core是分布式系统框架,是分发数据和扩展规模的基础。 更一般而言,可以将其视为构建分布式,可伸缩,容错应用程序的工具包。 对于Riak Core的一些介绍性阅读(这不是纯粹的代码), 有一个古老但...

    fakeriak:用于测试和没有 Riak 的机器的内存中 Ruby Riak 驱动程序

    特征支持以下 Riak 功能: 服务器信息基本数据对象查找2.0 之前的计数器Bucket/Bucket Type 道具列出键/桶使用 Javascript 映射/减少二级索引搜索索引/模式CRDT 以下 Riak 功能目前尚未实现: 使用 Solr 搜索查询...

    riak_perf_analysis:探索Riak性能的工具和实验

    5. **配置分析**:项目可能还包括了分析Riak配置参数的工具,这些参数对系统性能有着直接影响。通过调整这些参数,我们可以优化Riak的配置,以适应不同的工作负载和硬件环境。 6. **实验性特性测试**:在"riak_perf...

    Laravel开发-laravel-riak .zip

    5. **处理事务**:由于 Riak 不支持 ACID 事务,你可能需要使用乐观锁或其他并发控制策略来确保数据一致性。 6. **错误处理和故障切换**:集成 Riak 后,应处理可能出现的连接问题和网络异常,确保应用的健壮性。 ...

    docker-riak:DevDB Riak - 用于开发的 docker 镜像

    开发数据库 Riak docker 容器中的 Riak v2.0.0 - 当您需要快速的 Riak 开发节点时。 快速开始 docker pull devdb/riak:latest docker run -d --name riak1 -p 8098:8098 -p 8087:8087 devdb/riak:latest 使用以下...

    riak-java-client:Java的Riak客户端

    Riak Java客户端 Riak Java客户端支持与 (开放源代码,分布式数据库)进行通信,该数据库专注于高可用性,水平可伸缩性和可预测的延迟。 Riak和此代码均由维护。 Java客户端的最新版本同时支持Riak KV 2.0+和Riak...

    前端开源库-riak-js

    - **故障恢复和数据复制**:riak-js库内置了与RIAK服务器的通信机制,能自动处理节点故障,通过数据复制保持数据的高可用性。 3. **使用riak-js** 在项目中引入riak-js,首先需要安装该库,可以通过npm命令完成:...

    Riak是以_Erlang_编写的一个高度可扩展的分布式数据存储,Riak的实现是基于Amazon的_mumu-riak.zip

    Riak是以_Erlang_编写的一个高度可扩展的分布式数据存储,Riak的实现是基于Amazon的_mumu-riak

    前端开源库-riakpbc

    5. **处理响应**:接收到Riak服务器的响应后,根据返回的结果进行相应的业务逻辑处理。 6. **关闭连接**:当不再需要与Riak服务器通信时,记得关闭连接以释放资源。 ### 应用场景 1. **数据存储**:在前端应用中...

    riak-record:RiakRecord 是一个围绕 riak-ruby-client 的薄且不成熟的包装器

    里亚克唱片公司RiakRecord 是一个围绕 riak-ruby-client 的薄且不成熟的包装器。 它为每个类创建一个桶,提供一个简单的查找器,并为数据和索引创建属性访问器。 它在 Riak::Client 上增加了一个层,使与 Riak 的...

    riak-formula:安装和管理 Riak

    4. **故障恢复**:Riak 支持数据复制和自动故障转移,通过设置“N值”(数据副本数量)来实现高可用性。当节点失败时,其他节点会接管其职责,确保服务连续性。 5. **Riak CS**:Riak CS 提供了对象存储服务,支持...

    dstwkr:基于riak_core的分布式worker应用

    5. **可扩展性**:通过 Riak Core 的分布式架构,dstwkr 能够随着需求增加而添加更多的 worker 节点,以扩展处理能力。 6. **并发处理**:Erlang 的并发模型使得 dstwkr 能够同时处理多个任务,提升系统吞吐量。 7...

    riak-ruby-client, 用于 ruby的Riak客户端.zip

    riak-ruby-client, 用于 ruby的Riak客户端 ) 客户端( Riak客户机)riak-client 是一个富 ruby 客户端/工具箱,分布在,数据库中,包含典型操作的基本包装。在 http://basho.github.io/riak-ruby-client/ 可以使用详尽...

Global site tag (gtag.js) - Google Analytics