- 浏览: 582013 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
JamAndVariousAbalone:
存储方式的不同吧。gb_tree是平衡树,list是线性结构。 ...
gb_trees和lists的访问效率相差很大 -
genesislive:
eporf:analyse()写错了,应该改成eprof:an ...
Erlang程序的性能测试工具(1) -
vampirezh:
高手啊 求带 ! 请列出带徒标准
Erlang的未来(2008) -
aiquantong:
great!
rebar工具使用备忘录 (1) -
wccxiaoan:
basho的资源 都没办法打开,不过还是有帮助,谢谢。
关于webmachine
haogongju、人人IT网、59n南龙、360doc不要抄我的烂博客了,私人备忘用。
基于Riak Core的开发指南
1. hello, Riak Core
从riak-core-first-multinode开始一个hello world应用(简称mfmn):访问这里。
这个Riak Core应用有个最简单的vnode,它仅实现了一个ping功能,当vnode收到ping命令时会返回这个vnode管理的partition在ring中的整数值。
该文演示了使用一个rebar定制的riak_core_multinode模版构建一个3节点的hello world级别的Riak Core应用。
这个应用虽然没什么实用价值,不过可以亲手触摸到dynamo的ring、node这些概念。
1.1. Riak Core应用的rebar开发模板
可以通过rebar模板riak_core_multinode自动搭建一个Riak Core应用系统的骨架。
1) 下载rebar_riak_core模板
2) 通过模板创建Riak Core应用骨架
模板创建的工程的通用目录结构:
1.2 常用操作命令
当前目录为工程所在的根目录
1)构建3节点的Riak Core应用
2)启动所有的物理节点
3)把这3个物理节点连接起来,一个ring会从这3个物理节点中自动构建出来
注意,连接物理节点的命令只需要执行第一次就行了,不要重复连接。
4)连上某个物理节点
注意退出的时候按Ctrl+D
5)常用make构建命令
make rel会创建一个节点的应用的发布(release)。在rel/目录下的mfmn
make relclean会清除此应用的release
make devrel会在dev目录下创建有3个节点的应用(dev1、dev2和dev3)。
make devclean会清除这些应用的releases
1.3 察看Riak Core系统状态
实际上rebar模板构建的应用会提供一个察看riak_core ring状态的命令:
1.4 其它
我们一般用appmon察看应用及其进程。在应用的发布(release)配置(<my_app>/releases/<version>/<my_app>.rel)中可以看到,riak_core将会作为一个application被自动启动(当然还包括它依赖的其他applications,如riak_system等),当然还有用户的应用。(查看release的应用配制参数)
如图所示,这是系统运行时能看到所有的application,mfmn是实现RTS系统所有业务逻辑的application,而riak_core application为整个RTS系统提供了分布式的系统框架支持。
mfmn application的进程树,mfmn_vnode_master是riak_core_vnode_master模块运行时的一个进程注册名,这个进程作为容纳业务模块代码的容器运行。如前所述,在进程启动时系统的业务逻辑会嵌入到这个进程中了。
一般我们用appmon察看应用及其进程,但是打包后的应用不会自动包含appmon这个application。有两个办法:
1) 在make前,修改rel/reltool.config,在sys的 {rel, "mfmn", ... } 列出的依赖库列表中加入appmon,这样make出来的应用就可以图形工具appmon察看进程了;
2) 直接将erlang安装目录lib下的appmon拷到对应的dev/dev1/lib目录下
1.5 ping
这个hello world级应用系统对外提供了一个API(在mfmn.erl中),它只有一个叫ping的函数。
%% @doc Pings a random vnode to make sure communication is functional
2. 一个更复杂点的应用:RTS
2.1 简介
这是一个实时统计应用(RTS)。它对外提供了两类服务:接收并分析用户的日志数据;对日志进行实时统计(比如目前为止一共收到多少请求,有多少GET请求、POST请求,浏览器类型等等)。访问见这里:riak-core-the-vnode。
2.2 数据分布策略
目标是得到不同用户上传日志的各类统计信息:不同用户上传自己的日志信息,RTS应用对每个用户上传的日志的各类状态分别统计。所以数据分布方式是根据用户信息和统计状态随机分布,:
DocIdx = riak_core_util:chash_key({list_to_binary(Client), list_to_binary(StatName)})
2.3 服务及其API
接收日志数据的服务在rts_entry_vnode模块中实现,统计日志的服务在rts_stat_vnode模块中实现。
同时,这两类服务对外提供的调用API也在对应的模块中。
每当接收日志服务收到一条日志,会用正则表达式分析日志,根据分析结果调用统计服务对日志信息进行计数。
最后由一个rts模块作为Facade包装这两个服务,统一对外提供API。
BTW:由于每个日志信息的上传都要新建一个HTTP连接,这里就成了系统输入的性能瓶颈。因此即使使用多个物理节点时也不会感受到系统性能的提高。
2.4 对外HTTP接口
为了实验方便,这个例子系统对外实现了一个HTTP接口,这样用户通过脚本利用curl工具就可以上传日志数据了。
这个HTTP接口借助了webmachine应用实现,具体逻辑在rts_wm_entry模块中,会在rts_app启动时完成这个模块的webmachine加载。
2.5 实现
这里的重点是了解和学习Riak Core的vnode接口如何使用实现业务逻辑:基于riak_core_vnode behaviour实现相关回调函数。
对于每个partition,会有一个rts_stat_vnode进程负责该分区内日志数据的各种状态统计,这个vnode进程内维护一个字典数据结构(dict),用来存储这个partition上的各种日志状态。字典的key是状态名,value是整数或者list。
不过我觉得这个rts例子的处理逻辑似乎有问题,不能处理多个用户的录入。
riak_core_vnode behaviour的回调函数:
1) 生命周期回调函数:
init(Partition) 初始化vnode进程的状态(类似gen_server/gen_fsm的状态),回调函数的参数是代表此vnode负责的分区的ring整数;
terminate(Reason, State)
handle_exit/3 当与vnode进程有link的其它进程崩溃时被调用
用户定制的riak_core_vnode回调函数模块被称为'vnode_moudles',可以调用application:get_env(riak_core, vnode_modules). 查询当前应用的vnode模块。这些在riak_core:register_vnode_module注册。
to be continue...
Riak Core配置
http://wiki.basho.com/Configuration-Files.html
基于Riak Core的开发指南
1. hello, Riak Core
从riak-core-first-multinode开始一个hello world应用(简称mfmn):访问这里。
这个Riak Core应用有个最简单的vnode,它仅实现了一个ping功能,当vnode收到ping命令时会返回这个vnode管理的partition在ring中的整数值。
该文演示了使用一个rebar定制的riak_core_multinode模版构建一个3节点的hello world级别的Riak Core应用。
这个应用虽然没什么实用价值,不过可以亲手触摸到dynamo的ring、node这些概念。
1.1. Riak Core应用的rebar开发模板
可以通过rebar模板riak_core_multinode自动搭建一个Riak Core应用系统的骨架。
1) 下载rebar_riak_core模板
mkdir -p ~/.rebar/templates; cd~/.rebar/templates git clone git://github.com/rzezeski/rebar_riak_core.git
2) 通过模板创建Riak Core应用骨架
mkdir mfmn cd mfmn wget http://cloud.github.com/downloads/basho/rebar/rebar && chmod u+x rebar
./rebar create template=riak_core_multinode appid=mfmn nodeid=mfmn
模板创建的工程的通用目录结构:
- rebar.config 工程的rebar配置文件
- apps目录下是应用的源代码,mfmn应用在mfmn目录下;
- rel目录下是riak_core应用的配置
- deps目录下放置依赖的riak_core及其依赖应用,在make后自动下载;
- dev目录下放置编译好的多节点应用。
1.2 常用操作命令
当前目录为工程所在的根目录
1)构建3节点的Riak Core应用
make devrel
2)启动所有的物理节点
for d in dev/dev*; do $d/bin/mfmn start; done
3)把这3个物理节点连接起来,一个ring会从这3个物理节点中自动构建出来
for d in dev/dev{2,3}; do $d/bin/mfmn-admin join mfmn1@127.0.0.1; done
注意,连接物理节点的命令只需要执行第一次就行了,不要重复连接。
4)连上某个物理节点
./dev/dev1/bin/mfmn attach
注意退出的时候按Ctrl+D
5)常用make构建命令
make rel会创建一个节点的应用的发布(release)。在rel/目录下的mfmn
make relclean会清除此应用的release
make devrel会在dev目录下创建有3个节点的应用(dev1、dev2和dev3)。
make devclean会清除这些应用的releases
1.3 察看Riak Core系统状态
实际上rebar模板构建的应用会提供一个察看riak_core ring状态的命令:
./dev/dev1/bin/mfmn-admin member_status
1.4 其它
我们一般用appmon察看应用及其进程。在应用的发布(release)配置(<my_app>/releases/<version>/<my_app>.rel)中可以看到,riak_core将会作为一个application被自动启动(当然还包括它依赖的其他applications,如riak_system等),当然还有用户的应用。(查看release的应用配制参数)
如图所示,这是系统运行时能看到所有的application,mfmn是实现RTS系统所有业务逻辑的application,而riak_core application为整个RTS系统提供了分布式的系统框架支持。
mfmn application的进程树,mfmn_vnode_master是riak_core_vnode_master模块运行时的一个进程注册名,这个进程作为容纳业务模块代码的容器运行。如前所述,在进程启动时系统的业务逻辑会嵌入到这个进程中了。
一般我们用appmon察看应用及其进程,但是打包后的应用不会自动包含appmon这个application。有两个办法:
1) 在make前,修改rel/reltool.config,在sys的 {rel, "mfmn", ... } 列出的依赖库列表中加入appmon,这样make出来的应用就可以图形工具appmon察看进程了;
2) 直接将erlang安装目录lib下的appmon拷到对应的dev/dev1/lib目录下
1.5 ping
这个hello world级应用系统对外提供了一个API(在mfmn.erl中),它只有一个叫ping的函数。
%% @doc Pings a random vnode to make sure communication is functional
ping() -> DocIdx = riak_core_util:chash_key({<<"ping">>, term_to_binary(now())}), PrefList = riak_core_apl:get_primary_apl(DocIdx, 1, mfmn), [{IndexNode, _Type}] = PrefList, riak_core_vnode_master:sync_spawn_command(IndexNode, ping, mfmn_vnode_master).
2. 一个更复杂点的应用:RTS
2.1 简介
这是一个实时统计应用(RTS)。它对外提供了两类服务:接收并分析用户的日志数据;对日志进行实时统计(比如目前为止一共收到多少请求,有多少GET请求、POST请求,浏览器类型等等)。访问见这里:riak-core-the-vnode。
2.2 数据分布策略
目标是得到不同用户上传日志的各类统计信息:不同用户上传自己的日志信息,RTS应用对每个用户上传的日志的各类状态分别统计。所以数据分布方式是根据用户信息和统计状态随机分布,:
DocIdx = riak_core_util:chash_key({list_to_binary(Client), list_to_binary(StatName)})
2.3 服务及其API
接收日志数据的服务在rts_entry_vnode模块中实现,统计日志的服务在rts_stat_vnode模块中实现。
同时,这两类服务对外提供的调用API也在对应的模块中。
每当接收日志服务收到一条日志,会用正则表达式分析日志,根据分析结果调用统计服务对日志信息进行计数。
最后由一个rts模块作为Facade包装这两个服务,统一对外提供API。
BTW:由于每个日志信息的上传都要新建一个HTTP连接,这里就成了系统输入的性能瓶颈。因此即使使用多个物理节点时也不会感受到系统性能的提高。
2.4 对外HTTP接口
为了实验方便,这个例子系统对外实现了一个HTTP接口,这样用户通过脚本利用curl工具就可以上传日志数据了。
这个HTTP接口借助了webmachine应用实现,具体逻辑在rts_wm_entry模块中,会在rts_app启动时完成这个模块的webmachine加载。
2.5 实现
这里的重点是了解和学习Riak Core的vnode接口如何使用实现业务逻辑:基于riak_core_vnode behaviour实现相关回调函数。
对于每个partition,会有一个rts_stat_vnode进程负责该分区内日志数据的各种状态统计,这个vnode进程内维护一个字典数据结构(dict),用来存储这个partition上的各种日志状态。字典的key是状态名,value是整数或者list。
不过我觉得这个rts例子的处理逻辑似乎有问题,不能处理多个用户的录入。
riak_core_vnode behaviour的回调函数:
1) 生命周期回调函数:
init(Partition) 初始化vnode进程的状态(类似gen_server/gen_fsm的状态),回调函数的参数是代表此vnode负责的分区的ring整数;
terminate(Reason, State)
handle_exit/3 当与vnode进程有link的其它进程崩溃时被调用
用户定制的riak_core_vnode回调函数模块被称为'vnode_moudles',可以调用application:get_env(riak_core, vnode_modules). 查询当前应用的vnode模块。这些在riak_core:register_vnode_module注册。
to be continue...
Riak Core配置
http://wiki.basho.com/Configuration-Files.html
发表评论
-
静态链接与动态链接
2014-09-06 03:24 1558基于gmp开发第三方库,后者以动态链接库(静态库?)对方式发布 ... -
在macbook上安装linux
2014-06-12 10:29 22881. 安装最新的rEFInd > 0.8.2 http: ... -
NIF与OS线程
2013-08-31 01:29 1117NIF的OS线程编程模型可以参考The Art of Mult ... -
关于nif
2013-08-19 10:28 5170一、NIF的误用问题 使用NIF是很危险的,一不小心它就会搞 ... -
遇到的riak性能问题
2013-07-23 10:59 24331。 遇到一个奇怪的性能问题,多个进程中用riakc_pb_ ... -
dialyzer使用备忘
2013-07-04 12:36 1645一、构建PLT文件: 新构建 dialyzer --build ... -
手工从源码制作一个riak安装包
2013-06-22 18:47 1663riak的Makefile文件提供了各个平台上的安装包的生成脚 ... -
folsom_metrics使用备忘
2013-06-07 15:41 1483folsom是一个通用的统计度量工具。使用很简单,关键是搞清它 ... -
git 库永久删除大文件
2013-01-08 11:49 4718无意中把一个装有很多大文件数据的文件夹(./my1202260 ... -
Riak Core与folsom
2012-09-01 11:54 1509folsom是Riak从1.2开始引入。 -
关于Erlang/OTP的application参数配置
2012-08-26 23:27 9149Erlang/OTP中将完成特定功能的一组模块组织起来,称之 ... -
rebar工具使用备忘录 (5)
2012-08-23 18:17 1509haogongju、人人IT网、59n南龙、360doc、as ... -
lager的使用
2012-08-23 15:06 10571haogongju、人人IT网、59n南龙、360doc不要抄 ... -
rebar工具使用备忘录 (4)
2012-08-22 19:20 5636haogongju、人人IT网、59n南龙、360doc、as ... -
rebar工具使用备忘录 (3)
2012-08-22 19:18 1320haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (9) cheatsheet
2012-08-12 12:58 1685haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (8)
2012-08-11 18:52 1261haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (7)
2012-08-10 18:15 1362haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (6) HTTP接口
2012-08-09 16:16 1548haogongju,人人IT网,360do ... -
对Riak Core的探索 (5) 业务逻辑的实现:数据如何处理
2012-08-07 18:18 1665业务逻辑的实现:数据 ...
相关推荐
里亚克核心 Riak Core是分布式系统框架,是分发数据和扩展规模的基础。 更一般而言,可以将其视为构建分布式,可伸缩,容错应用程序的工具包。 对于Riak Core的一些介绍性阅读(这不是纯粹的代码), 有一个古老但...
在本文中,我们将深入探讨如何在 Laravel 框架中集成和使用 Riak 数据库,主要关注连接配置、缓存管理以及会话存储。Riak 是一个分布式键值存储系统,提供高可用性、可扩展性和容错性,特别适合大数据量的应用场景。...
选择 Riak 主要是因为它能应对大规模历史消息数据,这种数据结构非常适合键值对存储,且Riak 的集群配置简单,易于扩展。 **Riak 的核心特性** 1. **分布式存储**:Riak 是一个分布式数据库,数据分散在多个节点上...
了解如何测试Riak与Laravel的交互对调试和维护此系统至关重要。 7. **性能优化**:由于Riak的分布式特性,`laravel-riak-auth`可能会涉及一些性能优化策略,如数据分布策略、读写一致性设置等,以最大化系统性能。 ...
riak-ruby-client, 用于 ruby的Riak客户端 ) 客户端( Riak客户机)riak-client 是一个富 ruby 客户端/工具箱,分布在,数据库中,包含典型操作的基本包装。在 http://basho.github.io/riak-ruby-client/ 可以使用详尽...
riak_pg, 带riak_core的分布式进程组 概述带riak_core的分布式进程组。用法将进程加入组( 不需要预先声明)join(term(), pid()) -> ok | {error, timeout}.如何删除?leave
riak_core_tutorial目录 3.4. 5.7.8.10.1112.环境要跳过设置环境,已经为本教程准备了一个环境: riak_core_env 。 在接下来的章节中,我假设您已运行环境并在链接中提到的RIAK_CORE_ENV/synced/目录中完成所有工作...
riak-session-manager 是使用 Riak 来存储 Tomcat session 信息的项目。 配置方法: <?xml version="1.0" encoding="UTF-8"?> <Manager className="com.jbrisbin.vpc.riak.session.RiakManager" ...
数据库设置钢筋 riak_core 模板git clone https://github.com/basho/rebar_riak_core.gitcd rebar_riak_coremake install创建项目模板mkdir flaviodbcd flaviodb# download rebar and set executable ...
4. 键值存储:Riak以键值对的形式存储数据,支持JSON、BSON等数据格式,方便与其他应用程序集成。 5. 查询语言:虽然主要为键值存储,但Riak还支持查询语言 Riak Search 和 Riak KV MapReduce,允许用户执行更复杂的...
1. **性能监控工具**:这些工具可以实时或周期性地收集Riak服务器的关键指标,如CPU使用率、内存消耗、网络吞吐量和I/O操作。通过这些数据,我们可以识别系统瓶颈,为性能调优提供依据。 2. **基准测试脚本**:基准...
1. **RIAK简介** RIAK是由Basho Technologies开发的开源分布式数据库,其设计灵感来源于Amazon的SimpleDB。RIAK强调高可用性、可扩展性和容错性,采用无中心架构,数据复制策略确保数据安全性。它支持多种数据模型...
Riak Java客户端 Riak Java客户端支持与 (开放源代码,分布式数据库)进行通信,该数据库专注于高可用性,水平可伸缩性和可预测的延迟。 Riak和此代码均由维护。 Java客户端的最新版本同时支持Riak KV 2.0+和Riak...
欢迎来到Riak。 概述 Riak是分布式,分散式数据存储系统。...man / riak.1.gz:riak(1)命令的手册页 riak-admin(1)命令的man / riak-admin.1.gz手册页 raw-http-howto.txt:使用Riak HTTP界面 归档分支: :
带有 NodeJS 的 Riak 命令行工具。 有更好的解决方案,请参考 ->使用带有curl的Riak http api查询riak真的很烦人! 于是工具诞生了。 干杯! 这是一个 Riak 终端查询工具,提供基本的 POST/PUT/DELETE/GET 等方法。...
使用Riak作为后端的服务器监视 该项目是我的学士学位工作的一部分: “ NoSQL数据库和应用程序的比较分析” 米兰比可卡大学 关联者:安德烈·毛里诺(Andrea Maurino) 联合主持人:Blerina ...如果您对Riak配置有任何
1. **集群配置**:Riak 集群需要配置节点间的通信,包括 vnode(虚拟节点)的数量、ring 分区和数据分布策略。通常, vnode 数量应与硬件资源匹配,以平衡性能和资源利用率。 2. **数据模型**:Riak 使用分布式哈希...
1. **Riak Core**:Riak Core 是一个开源框架,由 Basho Technologies 创建,用于构建分布式系统,尤其是分布式数据库。它提供了诸如一致性、复制、分区容忍等关键功能。在 dstwkr 中,Riak Core 可能被用来管理数据...
1. **安装扩展**:首先,你需要在 Laravel 项目中安装对应的 Riak PHP 客户端库,例如使用 `php-riak` 或 `basho/riak-php-client`。这可以通过 Composer 进行管理,运行 `composer require basho/riak-php-client`...
Riak协议缓冲区消息 master : develop : 该存储库包含的基于协议缓冲区的接口的消息定义,以及消息类型的各种Erlang特定的实用程序模块...length是msg_code的长度(1个字节)加上以网络顺序(大端)编码的消息长度