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

对Riak Core的探索 (4) 数据的分布及处理步骤

阅读更多
haogongju、人人IT网、59n南龙、360doc不要抄我的烂博客了,私人备忘用。


三、Riak Core系统的数据的分布和处理步骤

从原理上讲,Riak Core通过hash算法将数据随机均匀的分布在一个环上,数据的hash值也就是在环上的位置(源码中常用Index表示),知道了Index就知道了对应的分区partition,知道了分区就知道了对应的管理节点。知道了这个节点我们可以向其发送对应的处理命令:如取出这块数据、修改这块数据、对这块数据进行计算等等。

在这样的系统上处理数据的步骤如下:
1) 计算数据在环上的位置;
2) 计算这个位置对应分区partition的管理节点;
3) 向这个(些)节点发送处理命令

对环上分布在不同节点上的这些数据的操作可以并发的进行,因此Riak Core本质上还是一个数据并行的分布式系统。

以上是客户使用时的处理过程(或步骤)。而开发人员在基于Riak Core构建分布式系统时主要面临两个问题:
  1. 数据如何分布:Riak Core通过某种hash算法将数据随机均匀的分布在一个环上。选取那种hash算法,如何hash,可以由开发人员自由选择。例如,如果数据有唯一key,那么可以对key进行hash,具体来讲,riak这个kv 存储系统默认是对bucket+key做hash。(当然riak也可以对不同的bucket配置不同的hash方式,包括hash算法和要hash的数据)
  2. 数据如何处理:也即节点能处理哪些命令,以及这些命令的实现。对数据的处理涉及到系统的业务逻辑,这得由开发人员自己实现。例如对riak来说,主要的业务逻辑就是存储和查找了。


1. 数据如何分布

数据的分布是指如何将给定的数据映射到环上的位置(Index)。数据如何在环上分布可以由我们自己自行决定,本文为了表述方便称之为“数据分布的哈希策略”,这包括两方面:
1. 哈希算法的选择:Riak Core默认的hash算法是SHA算法,当然我们也可以选择自己的hash算法,不过实在没有这个必要。
2. 哈希的对象:hash函数接收一个对象参数,这个参数是一个含两个二进制数据的term;我们根据数据的特点自行确定term的组合方式,例如对于riak这样的key-value数据库,这个term的值就是这样子: {<<"bucket", "key">>}

实际上Riak Core提供的了两个hash函数,一个叫chash_std_keyfun,一个叫chash_bucketonly_keyfun,缺省的是chash_std_keyfun函数。相同的是它们都采用了SHA哈希算法,不同的是哈希对象的选取:

chash_std_keyfun({Bucket, Key}) -> chash:key_of({Bucket, Key}).
chash_bucketonly_keyfun({Bucket, _Key}) -> chash:key_of(Bucket).

可以看到,hash的对象不同,一个对{Bucket,Key}整体做hash,一个只对Bucket做hash,他们都调用的key_of使用的是SHA哈希算法:
-spec key_of(ObjectName :: term()) -> index().
key_of(ObjectName) ->    
     crypto:sha(term_to_binary(ObjectName)).


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

@spec chash_key(BKey :: {binary(), binary()}) -> chash:index()
chash_key({Bucket,Key}) ->
    BucketProps = riak_core_bucket:get_bucket(Bucket),
    {chash_keyfun, {M, F}} = proplists:lookup(chash_keyfun, BucketProps),
    M:F({Bucket,Key}).

代码不是很直观,原因是中间插入了额外的逻辑,为了实现不同bucket可以有不同的hash策略。

可以看到chash_key不做具体的hash计算,它只是调用了配置文件中设定的hash函数(用红色标注),换句话,我们可以自定义自己的hash函数,这个函数有唯一的参数,这个参数也是 {Bucket::binary(), Key::binary()}

2.数据的处理步骤

在解决了数据如何分布的问题后,再来看看如何使用:

数据处理步骤中对应的第1步,计算数据在环上的位置,Riak Core提供了对应的API,及函数riak_core_util:chash_key/1。

以riak这个NoSQL数据库为例,它是通过对数据所在的bucket以及数据的key做hash计算得到数据的分布节点的(即默认的chash_std_keyfun):
BKey={Bucket, Key}
DataIdx = riak_core_util:chash_key(BKey),
DataIdx就是根据数据的分布策略得到的该数据在环上的位置。

数据处理步骤中对应的第2步,计算这个位置对应分区partition的管理节点:
根据环上位置就可以得到对于的节点:
PrefList = riak_core_apl:get_primary_apl(DataIdx, 1, rts),
IdxNode = hd(PrefList), % 数据分布的第一个节点

数据处理步骤中对应的第3步, 向这个(些)节点发送处理命令
知道了数据分布的节点,就可以给该节点发送命令了。

PrefList = riak_core_apl:get_primary_apl(DataIdx, 1, rts),
IdxNode = hd(PrefList), % 数据分布的第一个节点
riak_core_vnode_master:command(IdxNode, ...  % 在数据分布节点上进行数据处理

一个完整的例子:rts这个例子中的ping,使用的是根据当前时间数据计算出分布的节点,然后
DataIdx = riak_core_util:chash_key({<<"ping">>, term_to_binary(now())}),
PrefList = riak_core_apl:get_primary_apl(DataIdx, 1, [i]rts[/i]),
IdxNode = hd(PrefList), % 数据分布的第一个节点
riak_core_vnode_master:command(IdxNode, ...  % 在数据分布节点上进行数据处理


这样的效果是每次ping都ping到不同的节点上。


  • 大小: 15.6 KB
  • 大小: 15.2 KB
0
0
分享到:
评论

相关推荐

    Laravel开发-laravel-riak-auth

    4. **数据迁移和模型**:虽然Riak是非关系型数据库,但Laravel仍然可以通过Migrations来定义数据结构。`laravel-riak-auth`可能包含迁移文件来创建必要的用户表(或等效的Riak数据结构)。同时,可能会有自定义User...

    Riak 学习文档

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

    Laravel开发-laravel-riak

    在本文中,我们将深入探讨如何在 Laravel 框架中集成和...通过以上步骤,你可以在 Laravel 应用中充分利用 Riak 的优势,实现高效、可靠的缓存和会话管理。同时,记得根据实际项目需求调整配置和代码,以达到最佳效果。

    riak-Erlang.rar

    4. 键值存储:Riak以键值对的形式存储数据,支持JSON、BSON等数据格式,方便与其他应用程序集成。 5. 查询语言:虽然主要为键值存储,但Riak还支持查询语言 Riak Search 和 Riak KV MapReduce,允许用户执行更复杂的...

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

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

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

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

    Laravel开发-laravel-riak .zip

    4. **使用 Riak 存储和检索数据**:现在,你可以像使用其他 Laravel 数据库一样,通过 Eloquent Model 来存取 Riak 中的数据。例如,`save()` 方法用于保存对象,`findOrFail()` 用于查找特定 ID 的记录,`where()` ...

    前端开源库-riak-js

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

    riak_pg, 带riak_core的分布式进程组.zip

    riak_pg, 带riak_core的分布式进程组 概述带riak_core的分布式进程组。用法将进程加入组( 不需要预先声明)join(term(), pid()) -&gt; ok | {error, timeout}.如何删除?leave

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

    Riak是一款分布式键值存储系统,由Basho Technologies开发,设计用于处理大规模数据存储和检索。在IT行业中,理解并优化数据库系统的性能是至关重要的,特别是对于像Riak这样的NoSQL解决方案,它在高可用性和可扩展...

    riak-formula:安装和管理 Riak

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

    riak-session-manager.zip

    riak-session-manager 是使用 Riak 来存储 Tomcat session 信息的项目。 配置方法:   &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;Manager className="com.jbrisbin.vpc.riak.session.RiakManager" ...

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

    9. **数据分布**:基于 Riak Core 的数据分片和复制策略,dstwkr 可能实现数据的智能分布,提高读写性能。 10. **冷却优化**:虽然描述中的“制冷应用”可能是个误解,但如果确实涉及到大规模数据处理,那么系统...

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

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

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

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

    前端开源库-riakpbc

    2. **缓存策略**:结合前端缓存策略,RiakPBC可以用于优化数据获取,减少对服务器的频繁请求。 3. **离线模式**:在离线模式下,RiakPBC可以作为数据存储的本地备份,待网络恢复后再同步至服务器。 ### 注意事项 ...

    藏经阁-Using Spark and Riak for loT.pdf

    使用 Spark 和 Riak,我们可以快速处理 IoT 数据,并将其存储到 Riak 中,以便进行后续的分析和处理。 本文档提供了一个完整的 IoT 应用设计模式,涵盖了 IoT 项目计划、IoT 设备和网络协议、IoT 数据处理和存储等...

    riak_core_tutorial

    riak_core_tutorial目录 3.4. 5.7.8.10.1112.环境要跳过设置环境,已经为本教程准备了一个环境: riak_core_env 。 在接下来的章节中,我假设您已运行环境并在链接中提到的RIAK_CORE_ENV/synced/目录中完成所有工作...

    Python-Riak是以Erlang编写的一个高度可扩展的分布式数据存储

    Riak是以 Erlang 编写的一个高度可扩展的分布式数据存储,Riak的实现是基于Amazon的Dynamo论文,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 ...

Global site tag (gtag.js) - Google Analytics