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

[size=x-large]基于Riak Core的开发指南[/size]

[size=large]1. hello, Riak Core[/size]

从riak-core-first-multinode开始一个hello world应用(简称mfmn):访问[url=https://github.com/rzezeski/try-try-try/tree/master/2011/riak-core-first-multinode]这里[/url]。

这个Riak Core应用有个最简单的vnode,它仅实现了一个ping功能,当vnode收到ping命令时会返回这个vnode管理的partition在ring中的整数值。

该文演示了使用一个rebar定制的riak_core_multinode模版构建一个3节点的hello world级别的Riak Core应用。

这个应用虽然没什么实用价值,不过可以亲手触摸到dynamo的ring、node这些概念。

[size=large]1.1. Riak Core应用的rebar开发模板[/size]

可以通过rebar模板riak_core_multinode自动搭建一个Riak Core应用系统的骨架。

1) 下载rebar_riak_core模板

mkdir -p ~/.rebar/templates; cd~/.rebar/templatesgit clone git://github.com/rzezeski/rebar_riak_core.git

2) 通过模板创建Riak Core应用骨架

mkdir mfmncd mfmnwget http://cloud.github.com/downloads/basho/rebar/rebar && chmod u+x rebar
./rebar create template=riak_core_multinode appid=mfmn nodeid=mfmn

模板创建的工程的通用目录结构:
[list]
[*]rebar.config 工程的rebar配置文件
[*]apps目录下是应用的源代码,mfmn应用在mfmn目录下;
[*]rel目录下是riak_core应用的配置
[*]deps目录下放置依赖的riak_core及其依赖应用,在make后自动下载;
[*]dev目录下放置编译好的多节点应用。
[/list]

[size=medium]1.2 常用操作命令[/size]

当前目录为工程所在的根目录

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

[size=medium]1.3 察看Riak Core系统状态[/size]

实际上rebar模板构建的应用会提供一个察看riak_core ring状态的命令:

./dev/dev1/bin/mfmn-admin member_status

[size=medium]1.4 其它[/size]

我们一般用appmon察看应用及其进程。在应用的发布(release)配置(<my_app>/releases/<version>/<my_app>.rel)中可以看到,riak_core将会作为一个application被自动启动(当然还包括它依赖的其他applications,如riak_system等),当然还有用户的应用。(查看[url=http://www.erlang.org/doc/man/rel.html]release的应用配制参数[/url])
如图所示,这是系统运行时能看到所有的application,mfmn是实现RTS系统所有业务逻辑的application,而riak_core application为整个RTS系统提供了分布式的系统框架支持。

[img]http://dl.iteye.com/upload/attachment/0064/5997/30d986ee-6279-3f97-aa0c-7dd3ef8b19fe.png[/img]

mfmn application的进程树,mfmn_vnode_master是riak_core_vnode_master模块运行时的一个进程注册名,这个进程作为容纳业务模块代码的容器运行。如前所述,在进程启动时系统的业务逻辑会嵌入到这个进程中了。

[img]http://dl.iteye.com/upload/attachment/0064/6005/65a1447f-210d-3e00-ac8e-712ee1c7e787.png[/img]

一般我们用appmon察看应用及其进程,但是打包后的应用不会自动包含appmon这个application。有两个办法:
1) 在make前,修改rel/reltool.config,在sys的 {rel, "mfmn", ... } 列出的依赖库列表中加入appmon,这样make出来的应用就可以图形工具appmon察看进程了;
2) 直接将erlang安装目录lib下的appmon拷到对应的dev/dev1/lib目录下

[size=medium]1.5 ping[/size]

这个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).

[size=large] 2. 一个更复杂点的应用:RTS[/size]

[size=medium]2.1 简介[/size]

这是一个实时统计应用(RTS)。它对外提供了两类服务:接收并分析用户的日志数据;对日志进行实时统计(比如目前为止一共收到多少请求,有多少GET请求、POST请求,浏览器类型等等)。访问见这里:[url=https://github.com/rzezeski/try-try-try/tree/master/2011/riak-core-the-vnode]riak-core-the-vnode[/url]。

[size=medium]2.2 数据分布策略[/size]

目标是得到不同用户上传日志的各类统计信息:不同用户上传自己的日志信息,RTS应用对每个用户上传的日志的各类状态分别统计。所以数据分布方式是根据用户信息和统计状态随机分布,:
DocIdx = riak_core_util:chash_key({list_to_binary(Client), list_to_binary(StatName)})

[size=medium]2.3 服务及其API[/size]

接收日志数据的服务在rts_entry_vnode模块中实现,统计日志的服务在rts_stat_vnode模块中实现。

同时,这两类服务对外提供的调用API也在对应的模块中。

每当接收日志服务收到一条日志,会用正则表达式分析日志,根据分析结果调用统计服务对日志信息进行计数。

最后由一个rts模块作为Facade包装这两个服务,统一对外提供API。

BTW:由于每个日志信息的上传都要新建一个HTTP连接,这里就成了系统输入的性能瓶颈。因此即使使用多个物理节点时也不会感受到系统性能的提高。

[size=medium]2.4 对外HTTP接口[/size]

为了实验方便,这个例子系统对外实现了一个HTTP接口,这样用户通过脚本利用curl工具就可以上传日志数据了。

这个HTTP接口借助了webmachine应用实现,具体逻辑在rts_wm_entry模块中,会在rts_app启动时完成这个模块的webmachine加载。

[size=medium]2.5 实现[/size]

这里的重点是了解和学习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相关推荐

  1. Riak Core Guide 1

    Learn Riak Core Step By Step riak core 是 riak的主要组成部分,主要负责分布式的部分,虽然官方有自己的存储后端,但是我们也可以使用其他的后端存储. Parti ...

  2. Riak Core Guide 3

    Learn Riak Core Step By Step 3 Riak Core, Conflict Resolution 这一章主要描述最终一致性和如何实现强一致性. Object 非重重要的一个数 ...

  3. HMS Core积极探索基于硬件耳返的功能,助力唱吧整体唱歌延迟率降低60%

    唱吧的使命是让唱歌更简单.让生活更美好,其布局的K歌业务专注于让曲库更全.音质更好,开创了同框合唱.弹唱等有意思的游戏类K歌玩法.为了让用户拥有更加沉浸的娱乐体验,唱吧与HMS Core积极探索基于硬 ...

  4. 点评可调整大小哈希表:Riak Core和随机切片技术

    \ 本文要点 \\ 哈希表是一种用于管理空间的数据结构.它最初用于单一应用的内存,之后应用于大规模的计算集群.\\t 随着哈希表在一些新领域的应用,原有的哈希表大小调整方法存在一些不好的副作用.\\t ...

  5. WWDC20 Session 清单(06-23)

    又一年 WWDC.今年 session 的数量多达 200+,是往年的 2 倍.小集继续为您整理每天的 session 清单,方便您根据自己的喜好来选择内容. Adopt the new look o ...

  6. android开机默认Launcher(HOME)

    android 版本号 5.1.1 先上结果: 1.luncher: <?xml version="1.0" encoding="utf-8"?> ...

  7. linux热插拔原理,.NET Core 的热插拔机制的深入探索

    原标题:.NET Core 的热插拔机制的深入探索 转自:老禄 cnblogs.com/LucasDot/p/13956384.html 一.依赖文件*.deps.json的读取 依赖文件内容如下.一 ...

  8. 探索 .NET Core 依赖注入的 IServiceProvider

    在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptor ...

  9. Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...

最新文章

  1. PTA基础编程题目集-6-9 统计个位数字
  2. 全国计算机一级wps网络,全国计算机一级《WPS》考试试题及答案
  3. php类模块引擎PDO操作MySQL数据库简单阐述
  4. 基于百度地图js进行地理定位
  5. 【渝粤题库】国家开放大学2021春2718动物生理基础题目
  6. 【转】ABP源码分析二十:ApplicationService
  7. Java数组及二维数组初始化与赋值方法总结
  8. Oracle SQL性能优化40条,值得收藏
  9. 解决jupyter无法自动打开网页
  10. 「 Ansys 」仿真调试错误汇总
  11. 如何用python编写抢票软件哪个好_又到疯狂抢票的高峰期,用python写一个简单的12306抢票软件...
  12. 建立数据驱动,关键字驱动和混合Selenium框架这些你了解吗
  13. HTML正方体滚动特效
  14. 手机上面正常显示网页大小
  15. AIS航行状态和船舶类型
  16. 南京廖华微型计算机原理答案,微机原理习题库含答案
  17. java求约数_[转载]Java求最大公约数与最小公倍数
  18. 血糖仪等蓝牙设备SDK
  19. 数据库SQL SERVER常用命令说明
  20. python实现Content-Type: multipart/form-data; boundary=xxx接口的调用

热门文章

  1. 重装win7旗舰版系统无线网络红叉问题解决办法
  2. 响应式NBA体育赛事资讯类织梦模板(自适应手机端)
  3. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook
  4. 炫!迪奥元宇宙首展、著名建筑师马岩松元宇宙首作落地百度希壤
  5. 拓扑排序——Kahn算法
  6. 基于PyTorch+Conv-GRNN LSTM-GRNN实现中文情感分类任务
  7. 安卓浏览器解析apk文件 大小信息_apk提取器安卓版最新版下载_apk提取器安卓版免root下载2020...
  8. 学习3dsmax用电脑推荐配置
  9. 【229期】Spring Boot 使用令牌桶算法+拦截器+自定义注解+自定义异常实现简单的限流...
  10. web前端学习----4