日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

对Riak Core的探索 (1) Hello

發(fā)布時(shí)間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对Riak Core的探索 (1) Hello 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
haogongju、人人IT網(wǎng)、59n南龍、360doc不要抄我的爛博客了,私人備忘用。

[size=x-large]基于Riak Core的開發(fā)指南[/size]


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

從riak-core-first-multinode開始一個(gè)hello world應(yīng)用(簡(jiǎn)稱mfmn):訪問[url=https://github.com/rzezeski/try-try-try/tree/master/2011/riak-core-first-multinode]這里[/url]。

這個(gè)Riak Core應(yīng)用有個(gè)最簡(jiǎn)單的vnode,它僅實(shí)現(xiàn)了一個(gè)ping功能,當(dāng)vnode收到ping命令時(shí)會(huì)返回這個(gè)vnode管理的partition在ring中的整數(shù)值。

該文演示了使用一個(gè)rebar定制的riak_core_multinode模版構(gòu)建一個(gè)3節(jié)點(diǎn)的hello world級(jí)別的Riak Core應(yīng)用。

這個(gè)應(yīng)用雖然沒什么實(shí)用價(jià)值,不過可以親手觸摸到dynamo的ring、node這些概念。


[size=large]1.1. Riak Core應(yīng)用的rebar開發(fā)模板[/size]

可以通過rebar模板riak_core_multinode自動(dòng)搭建一個(gè)Riak Core應(yīng)用系統(tǒng)的骨架。

1) 下載rebar_riak_core模板
mkdir -p ~/.rebar/templates; cd~/.rebar/templates
git clone git://github.com/rzezeski/rebar_riak_core.git

2) 通過模板創(chuàng)建Riak Core應(yīng)用骨架
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

模板創(chuàng)建的工程的通用目錄結(jié)構(gòu):
[list]
[*]rebar.config 工程的rebar配置文件
[*]apps目錄下是應(yīng)用的源代碼,mfmn應(yīng)用在mfmn目錄下;
[*]rel目錄下是riak_core應(yīng)用的配置
[*]deps目錄下放置依賴的riak_core及其依賴應(yīng)用,在make后自動(dòng)下載;
[*]dev目錄下放置編譯好的多節(jié)點(diǎn)應(yīng)用。
[/list]

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

當(dāng)前目錄為工程所在的根目錄

1)構(gòu)建3節(jié)點(diǎn)的Riak Core應(yīng)用
make devrel

2)啟動(dòng)所有的物理節(jié)點(diǎn)
for d in dev/dev*; do $d/bin/mfmn start; done

3)把這3個(gè)物理節(jié)點(diǎn)連接起來,一個(gè)ring會(huì)從這3個(gè)物理節(jié)點(diǎn)中自動(dòng)構(gòu)建出來
for d in dev/dev{2,3}; do $d/bin/mfmn-admin join mfmn1@127.0.0.1; done
注意,連接物理節(jié)點(diǎn)的命令只需要執(zhí)行第一次就行了,不要重復(fù)連接。

4)連上某個(gè)物理節(jié)點(diǎn)
./dev/dev1/bin/mfmn attach
注意退出的時(shí)候按Ctrl+D

5)常用make構(gòu)建命令
make rel會(huì)創(chuàng)建一個(gè)節(jié)點(diǎn)的應(yīng)用的發(fā)布(release)。在rel/目錄下的mfmn
make relclean會(huì)清除此應(yīng)用的release

make devrel會(huì)在dev目錄下創(chuàng)建有3個(gè)節(jié)點(diǎn)的應(yīng)用(dev1、dev2和dev3)。
make devclean會(huì)清除這些應(yīng)用的releases


[size=medium]1.3 察看Riak Core系統(tǒng)狀態(tài)[/size]

實(shí)際上rebar模板構(gòu)建的應(yīng)用會(huì)提供一個(gè)察看riak_core ring狀態(tài)的命令:
./dev/dev1/bin/mfmn-admin member_status

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

我們一般用appmon察看應(yīng)用及其進(jìn)程。在應(yīng)用的發(fā)布(release)配置(<my_app>/releases/<version>/<my_app>.rel)中可以看到,riak_core將會(huì)作為一個(gè)application被自動(dòng)啟動(dòng)(當(dāng)然還包括它依賴的其他applications,如riak_system等),當(dāng)然還有用戶的應(yīng)用。(查看[url=http://www.erlang.org/doc/man/rel.html]release的應(yīng)用配制參數(shù)[/url])
如圖所示,這是系統(tǒng)運(yùn)行時(shí)能看到所有的application,mfmn是實(shí)現(xiàn)RTS系統(tǒng)所有業(yè)務(wù)邏輯的application,而riak_core application為整個(gè)RTS系統(tǒng)提供了分布式的系統(tǒng)框架支持。

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

mfmn application的進(jìn)程樹,mfmn_vnode_master是riak_core_vnode_master模塊運(yùn)行時(shí)的一個(gè)進(jìn)程注冊(cè)名,這個(gè)進(jìn)程作為容納業(yè)務(wù)模塊代碼的容器運(yùn)行。如前所述,在進(jìn)程啟動(dòng)時(shí)系統(tǒng)的業(yè)務(wù)邏輯會(huì)嵌入到這個(gè)進(jìn)程中了。

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

一般我們用appmon察看應(yīng)用及其進(jìn)程,但是打包后的應(yīng)用不會(huì)自動(dòng)包含appmon這個(gè)application。有兩個(gè)辦法:
1) 在make前,修改rel/reltool.config,在sys的 {rel, "mfmn", ... } 列出的依賴庫(kù)列表中加入appmon,這樣make出來的應(yīng)用就可以圖形工具appmon察看進(jìn)程了;
2) 直接將erlang安裝目錄lib下的appmon拷到對(duì)應(yīng)的dev/dev1/lib目錄下


[size=medium]1.5 ping[/size]

這個(gè)hello world級(jí)應(yīng)用系統(tǒng)對(duì)外提供了一個(gè)API(在mfmn.erl中),它只有一個(gè)叫ping的函數(shù)。
%% @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. 一個(gè)更復(fù)雜點(diǎn)的應(yīng)用:RTS[/size]

[size=medium]2.1 簡(jiǎn)介[/size]

這是一個(gè)實(shí)時(shí)統(tǒng)計(jì)應(yīng)用(RTS)。它對(duì)外提供了兩類服務(wù):接收并分析用戶的日志數(shù)據(jù);對(duì)日志進(jìn)行實(shí)時(shí)統(tǒng)計(jì)(比如目前為止一共收到多少請(qǐng)求,有多少GET請(qǐng)求、POST請(qǐng)求,瀏覽器類型等等)。訪問見這里:[url=https://github.com/rzezeski/try-try-try/tree/master/2011/riak-core-the-vnode]riak-core-the-vnode[/url]。

[size=medium]2.2 數(shù)據(jù)分布策略[/size]

目標(biāo)是得到不同用戶上傳日志的各類統(tǒng)計(jì)信息:不同用戶上傳自己的日志信息,RTS應(yīng)用對(duì)每個(gè)用戶上傳的日志的各類狀態(tài)分別統(tǒng)計(jì)。所以數(shù)據(jù)分布方式是根據(jù)用戶信息和統(tǒng)計(jì)狀態(tài)隨機(jī)分布,:
DocIdx = riak_core_util:chash_key({list_to_binary(Client), list_to_binary(StatName)})

[size=medium]2.3 服務(wù)及其API[/size]

接收日志數(shù)據(jù)的服務(wù)在rts_entry_vnode模塊中實(shí)現(xiàn),統(tǒng)計(jì)日志的服務(wù)在rts_stat_vnode模塊中實(shí)現(xiàn)。

同時(shí),這兩類服務(wù)對(duì)外提供的調(diào)用API也在對(duì)應(yīng)的模塊中。

每當(dāng)接收日志服務(wù)收到一條日志,會(huì)用正則表達(dá)式分析日志,根據(jù)分析結(jié)果調(diào)用統(tǒng)計(jì)服務(wù)對(duì)日志信息進(jìn)行計(jì)數(shù)。

最后由一個(gè)rts模塊作為Facade包裝這兩個(gè)服務(wù),統(tǒng)一對(duì)外提供API。

BTW:由于每個(gè)日志信息的上傳都要新建一個(gè)HTTP連接,這里就成了系統(tǒng)輸入的性能瓶頸。因此即使使用多個(gè)物理節(jié)點(diǎn)時(shí)也不會(huì)感受到系統(tǒng)性能的提高。


[size=medium]2.4 對(duì)外HTTP接口[/size]

為了實(shí)驗(yàn)方便,這個(gè)例子系統(tǒng)對(duì)外實(shí)現(xiàn)了一個(gè)HTTP接口,這樣用戶通過腳本利用curl工具就可以上傳日志數(shù)據(jù)了。

這個(gè)HTTP接口借助了webmachine應(yīng)用實(shí)現(xiàn),具體邏輯在rts_wm_entry模塊中,會(huì)在rts_app啟動(dòng)時(shí)完成這個(gè)模塊的webmachine加載。


[size=medium]2.5 實(shí)現(xiàn)[/size]

這里的重點(diǎn)是了解和學(xué)習(xí)Riak Core的vnode接口如何使用實(shí)現(xiàn)業(yè)務(wù)邏輯:基于riak_core_vnode behaviour實(shí)現(xiàn)相關(guān)回調(diào)函數(shù)。

對(duì)于每個(gè)partition,會(huì)有一個(gè)rts_stat_vnode進(jìn)程負(fù)責(zé)該分區(qū)內(nèi)日志數(shù)據(jù)的各種狀態(tài)統(tǒng)計(jì),這個(gè)vnode進(jìn)程內(nèi)維護(hù)一個(gè)字典數(shù)據(jù)結(jié)構(gòu)(dict),用來存儲(chǔ)這個(gè)partition上的各種日志狀態(tài)。字典的key是狀態(tài)名,value是整數(shù)或者list。

不過我覺得這個(gè)rts例子的處理邏輯似乎有問題,不能處理多個(gè)用戶的錄入。

riak_core_vnode behaviour的回調(diào)函數(shù):
1) 生命周期回調(diào)函數(shù):
init(Partition) 初始化vnode進(jìn)程的狀態(tài)(類似gen_server/gen_fsm的狀態(tài)),回調(diào)函數(shù)的參數(shù)是代表此vnode負(fù)責(zé)的分區(qū)的ring整數(shù);
terminate(Reason, State)

handle_exit/3 當(dāng)與vnode進(jìn)程有l(wèi)ink的其它進(jìn)程崩潰時(shí)被調(diào)用

用戶定制的riak_core_vnode回調(diào)函數(shù)模塊被稱為'vnode_moudles',可以調(diào)用application:get_env(riak_core, vnode_modules). 查詢當(dāng)前應(yīng)用的vnode模塊。這些在riak_core:register_vnode_module注冊(cè)。


to be continue...

Riak Core配置
http://wiki.basho.com/Configuration-Files.html

總結(jié)

以上是生活随笔為你收集整理的对Riak Core的探索 (1) Hello的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。