对Riak Core的探索 (1) Hello
生活随笔
收集整理的這篇文章主要介紹了
对Riak Core的探索 (1) Hello
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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/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
模板創建的工程的通用目錄結構:
[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
[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/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
模板創建的工程的通用目錄結構:
[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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html怎么设置顶部导航栏,互联网常识:
- 下一篇: 双限(窗口)比较器