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

对Riak Core的探索 (2) 基本原理

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

Riak Core采用一致性哈希算法分布数据。

《分布式系统原理介绍》第2节 分布式系统原理 by刘杰 写道
“所谓分布式系统顾名思义就是利用多台计算机协同解决单台计算机所不能解决的计算、存储等问题。单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题,本文称这样的数据拆解为数据分布方式......”

“哈希方式是最常见的数据分布方式,其方法是按照数据的某一特征计算哈希值,并将哈希值与机器中的机器建立映射关系,从而将不同哈希值的数据分布到不同的机器上。所谓数据特征可以是key-value 系统中的 key,也可以是其他与应用业务逻辑相关的值。”


一、Riak Core基本原理

Riak Core是一个分布式系统的开发框架,如果你的应用要采用分布式架构,凑巧你又选中了分布式哈希表这种分布式架构,则可以考虑使用Riak Core,不然自己从底层重新实现一个分布式哈希表实在是太麻烦了。


1. 基于dynamo设计的Riak Core


通过某种hash算法,对数据的某一特征计算哈希值,每份数据会对应着一个唯一的整数。这样处理后,这些数据将均匀的映射到一个整数区间上。

对于Riak Core,它管理着一个整数范围为[0-2^160]整数空间,这个空间形成一个首尾相连的环。

Riak Core把这个环平均划分成多个分区partition(默认是64个分区,当前的版本不能动态修改这个参数,据说将来会),partition在环上的Token作为此partition的唯一标识ID,每个partition交给一个或多个不同类型的vnode进程负责,每类vnode提供一套服务功能。partition的Token(或者说Index,Id)将作为对应vnode进程的id标识。如下图所示

(本图来自basho,版权属于basho。该图为了显示方便,整个环只被分成了32个分区)

多个partition可以挤在一个物理节点上。但是怎么挤是有严格要求的,我觉得看懂这个图的关键在于:每一种颜色代表同一个物理节点;各个颜色按照固定的顺序循环。这保证了任意两个相邻的partition肯定不在同一个物理节点上。因此Dynamo Preference List上的节点不会是同一个物理节点,也即一份数据的多份副本不会在同一个物理节点上了。(这里一个物理节点指一个erlang虚拟机,而不是一个实际的计算机)

Riak Core的基本原理是,通过一致性hash算法,系统要处理的数据(例如,KV要存储的业务数据,或者要处理的用户请求会话)会被riak_core随机的均匀分布在环上的各个分区中, 对每个数据的处理由该分区上的vnode进程负责。

由于hash算法的特点,当我们要对某个数据集进行处理时,这个数据集会随机分布个不同的partition上,所以本质上是个数据并行的处理方式。


dynamo的简单介绍可以看这里: 论文重读: Amazon Dynamoriak官方介绍在这里


2. Riak Core的设计:partition和vnode

按照dynamo的设计思想,要处理的数据将会随机均匀的分布在dynamo ring上,Riak Core进一步将这些数据又以partition为基本单元组织起来。对数据的处理将以partition为单元,通过vnode进程进行处理。数据的处理(或者叫服务)又有很多种,每类服务对应着一类vnode进程。

显然,partition是整个分布式系统并发、复制和容错的基本单元:以partition为单元进行数据并发处理;复制以partition为单元进行;容错也是如此:出错也以partition/vnode为单元出错。。。。

对于基于Riak Core的分布式应用系统开发来说,vnode是最重要的概念,简单的说,每个vnode进程负责一份partition上数据的处理,数据处理逻辑由用户负责实现。

一份partition可以有多个vnode进程管理,所以上图中a single partition/vnode应该是 a single partition with its assorted vnodes。
(用riak_core_node_watcher:services()可以察看应用系统中有哪些vnode服务)。

例子 写道
例如,对riak这个NoSQL数据库来说,最重要的服务是存储,在riak_kv_vnode模块中实现。模块实现了riak_core_vnode接口(实现了riak_core_vnode behaviour的回调函数)。

此外riak还有两类重要的服务:
riak的mapreduce基于riak_pipe实现,其vnode对应着riak_pipe_vnode模块。
riak还提供了二级索引搜索(riak_search)服务,其vnode对应着riak_search_vnode模块。

而一个实际的应用系统可能在功能上要比NoSQL数据库更多,它需要根据业务提供各种各样的服务,因此在vnode种类上就显得丰富多彩。比如rts实时日志统计这样一个例子就有两类vnode:riak_core_entry_vnode和riak_core_stat_vode,前者记录它负责的那份partition的所有数据,后者统计它负责的那份partition的所有数据。


分享到:
评论

相关推荐

    Laravel开发-laravel-riak

    2. **自定义会话存储类**:由于 Laravel 默认不支持 Riak 作为会话驱动,你需要创建一个自定义的会话存储类,继承 Laravel 的 `SessionHandlerInterface` 并实现其所有方法,以与 Riak 交互。参考 Laravel 的其他...

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

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

    Laravel开发-laravel-riak-auth

    首先,我们需要理解Laravel和Riak的基本概念。 **Laravel**是PHP世界中最受欢迎的Web应用框架之一,以其优雅的语法和丰富的功能库而闻名。它提供了开箱即用的解决方案,如路由、中间件、视图、模型、控制器等,使得...

    Riak 学习文档

    2. **一致性哈希**:Riak 使用一致性哈希算法来确定数据的存储位置,这使得添加或移除节点时,对整个集群的影响最小化,保证了系统的稳定性。 3. **Key-Value 存储**:Riak 存储的数据模型是键值对,简单且高效,...

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

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

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

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

    riak-session-manager.zip

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

    riak-Erlang.rar

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

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

    数据库设置钢筋 riak_core 模板git clone ...core template with app id set to flavio./rebar create template=riak_core appid=flavio将 riak_core 版本更新为 2

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

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

    riak_core_tutorial

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

    riak-cli:Riak 命令行客户端

    这是一个 Riak 终端查询工具,提供基本的 POST/PUT/DELETE/GET 等方法。安装 $ brew install node$ git clone https://github.com/tim-tang/riak-cli $ cd riak-cli && npm install将RIAK_CLI_HOME和 bin 目录导出...

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

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

    riak-formula:安装和管理 Riak

    2. **数据模型**:Riak 使用分布式哈希表(DHT)存储数据,键值对的存储和检索基于一致性哈希。用户可以通过 Riak 的 HTTP 或 Protocol Buffers API 进行交互。 3. **一致性策略**:Riak 提供多种一致性选项,包括...

    riak-client-1.1.3.zip

    【标题】"Riak Client 1.1.3与specs2 Maven Plugin" 【描述】在软件开发领域,特别是Java生态系统中,Riak是一个分布式键值存储系统,而specs2是一个广泛使用的Scala测试框架,它提供了强大的行为驱动开发(BDD)...

    server_monitoring_riak:使用Riak作为后端的服务器监视

    使用Riak作为后端的服务器监视 该项目是我的学士学位工作的一部分: “ NoSQL数据库和应用程序的比较分析” 米兰比可卡大学 关联者:安德烈·毛里诺(Andrea Maurino) 联合主持人:Blerina ...如果您对Riak配置有任何

    前端开源库-riak-js

    2. **riak-js特点** - **Node.js支持**:riak-js是为Node.js环境量身打造的,利用Node.js的异步I/O特性,实现高效的数据操作。 - **简单API**:提供简洁的JavaScript接口,使得开发者可以轻松地进行数据读写、查询...

    play2-riak:用于播放框架 2.0 的 riak 2

    在实际开发中,了解 Riak 的基本原理,如一致性模型(如 CRDTs)和数据分布策略(如 vnode),对于有效地使用 `play2-riak` 非常重要。同时,熟悉 Play Framework 的模块化架构和 Akka 演化版的并行处理概念也能帮助...

    Laravel开发-laravel-riak .zip

    在本压缩包“Laravel开发-laravel-riak .zip”中,主要涉及的是使用 Laravel 框架集成 Riak 数据库的开发实践。Laravel 是一个基于 PHP 的优雅、强大的 Web 开发框架,它提供了丰富的工具来简化 Web 应用程序的构建...

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

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

Global site tag (gtag.js) - Google Analytics