三、riak_core系統的工作方式
從原理上講,riak_core通過一致性hash演算法將資料隨機均勻的分布在乙個環上,對這些資料的操作可以併發的進行,因此riak_core本質上還是乙個資料並行的分布式系統。
因此,基於riak_core構建分布式系統涉及到兩個問題:
2. 關於資料的分布
實際上資料hash的工作一般是通過riak_core提供助手模組riak_core_util中的函式chash_key進行,在交給vnode_master之前就預先計算好了資料在ring上的位置了(index)。
%% @spec chash_key(bkey :: riak_object:bkey()) -> chash:index()chash_key() ->
bucketprops = riak_core_bucket:get_bucket(bucket),
} = proplists:lookup(chash_keyfun, bucketprops),
m:f().
(可以看到chash_key不做具體的hash計算,它只是呼叫了配置檔案中設定的hash函式,換句話,我們可以自定義自己的hash函式)
以riak這個nosql資料庫為例,它是通過對bucket和資料的key做hash計算得到資料的分布節點的:
bkey=
docidx = riak_core_util:chash_key(bkey),
類似的,我們使用時主要根據資料計算出它分布的節點,然後
docidx = riak_core_util:chash_key(),preflist = riak_core_apl:get_primary_apl(docidx, 1, rts),
idxnode = hd(preflist), % 資料分布的第乙個節點
riak_core_vnode_master:command(idxnode, ... % 在資料分布節點上進行資料處理
重點是資料如何處理:riak_core提供了乙個統一的介面以控制分布在ring上的資料的計算(操作)。
2. riak_core的資料控制介面
如前所述,每類vnode提供了一套服務,每個服務由在各個partition上的vnode程序組成,這些程序實際分布在各個物理節點上。對於每乙個物理節點,每類服務會有乙個riak_core_vnode_master程序提供統一的介面。實際上riak_core_vnode_master程序的主要作用是將請求**給對應的vnode程序進行處理,無論這個vnode程序在哪個物理節點上。
riak_core_vnode_master模組是乙個gen_server的實現,它對外提供了一套api。
引用用oo打個比方,如果將riak_core_vnode_master比作oo中的乙個類,這些api相當於這個類的靜態公共方法,這些靜態公共方法提供控制這個類的物件的初始化、以及這些物件的控制等,也就是說所有與這些物件打交道的操作統一通過這些靜態公共方法進行。
我們主要通過riak_core_vnode_master模組提供的api控制集群內的所有vnode程序,從而對外提供資料處理服務,這些api有:
可以看到riak_core_vnode_master的主要任務是**使用者請求,可以非同步**,也可以同步**。如何**:根據請求的資料所在的partition,可以算出partition所在的物理節點和對應的vnode程序pid,知道了物理節點和vnode程序的pid後就可以向此物理節點上的vnode程序直接傳送訊息。
不過,vnode程序的生成不由vnode_master直接負責,所有vnode程序的建立實際上由乙個專門的riak_core_vnode_sup模組負責(這可模組實際上是乙個******_one_for_one策略的supervisor,這種啟動策略使它只能管理同一類erlang程序,不過它的特點是能動態的建立無數的相同型別的子程序,見supervision principles )。vnode程序本質上是乙個gen_fsm狀態機(可以看到有乙個active狀態)
3. riak_core的資料處理:乙個完整的例子
try-try-try的例子**要簡單許多,這個例子是隨機ping乙個分割槽vnode,返回結果是該分割槽的id和物理節點,整個過程如下:
ping() ->docidx = riak_core_util:chash_key(),
preflist = riak_core_apl:get_primary_apl(docidx, 1, rts),
= preflist,
riak_core_vnode_master:sync_spawn_command(indexnode, ping, rts_vnode_master).
riak_kv中的例子要複雜很多,不過基本過程還是類似的。
to be continue...
4. 其它
在每個物理節點上會為每一類vnode啟動乙個riak_core_vnode_master程序,該程序控制這個物理節點上的所有同類vnode程序(通過上面提到的api)。所有這些riak_core_vnode_master程序的註冊遵循一套約定的命名規則:master程序的註冊名就是該類vnode的模組名字加上尾綴 "_master"。例如應用系統實現了一類vnode,其模組叫rts_stat_vnode,對應的riak_core_vnode_master程序名就在erlang中註冊為「rts_stat_vnode
_master
」。vnode程序是懶載入的,由riak_core_vnode_sup這個supervisor負責動態建立vnode程序(可以通過supervisor:which_children(riak_core_vnode_sup).察看當前的所有vnode_worker程序)。
瀏覽rts實時日誌統計的**有助於了解基於riak_core的應用系統的工作方式。
工作3年的總結
這篇文章雖然冠以 總結 名字,其實更多的是 流水賬 記錄了我從開始接觸電腦,萌生做程式設計師念頭,到現在成為開發方面能夠獨當一面的 人才 的路程,也提了下以後的職業規劃。稍後會開單獨的文章詳細寫我的職業規劃。考入市排名第二的重點高中,家裡獎勵電腦一台。從此開始解除電腦,主要做遊戲之用。那時的一些軟體...
網域名稱系統的工作原理 網域名稱系統如何工作
網域名稱系統的工作原理 從最基本的角度來看,網域名稱系統 dns 是人類可讀網域名稱 例如google.com或amazon.com 和ip位址之間的翻譯目錄。internet協議位址 ip位址 是分配給連線到計算機網路的每個裝置的數字標籤,該裝置使用internet協議進行通訊。它具有兩個主要功能...
聊天系統的工作原理
本人最近看網路程式設計,有了些感悟,希望這些對同樣喜歡程式設計的你,有幫助,謝謝,我們的口號是 共同進步!伺服器端過程 serversocket c new severocket 8080 建立服務埠 scoket socket c.accept 等待連線 bufferedreader is new...