对Riak Core的探索 (1) Hello
生活随笔
收集整理的這篇文章主要介紹了
对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
[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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html怎么设置顶部导航栏,互联网常识:
- 下一篇: 双限(窗口)比较器