我對分散式計算框架的理解與設計

xiaofei發表於2017-12-14

謝謝大家來看這篇文章,我想花點時間分享一下我對分散式計算的理解。
分散式服務有很多,比如hbase, hadoop, spark等,我所要講述的重點不是這些服務的原理,而是用更淺顯的話講述更深刻的設計。
如何把多個的機器組合起來完成一件簡單的計算任務,所以這方面的架構設計更多的關注伺服器間的關係。
下面我們來設計一個框架,以進行簡單的分散式計算。
我們假設計算目標有三類:
1.分佈計算能力,簡單多節點計算, 計算1萬以內的質數。
2.map-reduce,以wordcount為例。
3.資源查詢,分散式查詢資料庫

模組設計

在架構上, 可以將服務中的伺服器分三個模組:
image.png

模組 含義
config 配置服務
server 對外介面服務
service 工作服務(worker)

我想讓service接受請求,server進行計算, 流程會是怎麼的呢。

流程設計

一條簡單的請求過來,可能經過的處理過程:
image.png

實際的處理比這個要複雜,比如請求過期處理等。

抽象設計

在框架內通個上,service與server都會向config註冊,通訊以及獲取節點情況等,因此會有很多
相似的邏輯實現,所以很自然地,我把節點的關係重新定義為 config-node

image.png

為了簡單處理,抽象了一個node,service與server共同繼承node, 由node負責與config通訊。

功能設計

config在框架裡起到分配資源與註冊服務的功能。

image.png

node功能

image.png

整體功能

image.png

下面我將對系統設計的協議進行設計。

協議設計

為了簡單方便,我將模組間的通訊採用protobuf。
(實際上在通用對外服務是不能用protobuf的,請大家思考為什麼。)

config:

message ConfigRequest{
    optional ConfigAuthReq auth= 1;
    optional ConfigGetNodesReq get_nodes= 2;
}
message ConfigResponse{
    optional ConfigAuthRsp auth = 1;
    optional ConfigGetNodesRsp  get_nodes= 2;
    optional ConfigNotifyNodes  notify_nodes= 3;
}

server

message ServerRequest{
    required ServerDiag               diags = 1;
    required ServerDiagNodeType       diag_type = 2;
 
    optional ServerAuthReq            auth = 3;
     
    optional PrimeQueryReq            prime = 4;
    optional ServerWordCountReq       wc = 5;
    optional ServerQueryReq           query = 6;
    optional ServerBGReq              bg = 7;
 
}
 
message ServerResponse{
    optional ServerAuthRsp               auth = 1;
    optional PrimeQueryRsp               prime = 2;
    optional ServerWordCountRsp          wc = 3;
    optional ServerQueryRsp              query = 4;
    optional ServerBGResponse            bg = 5;
}

下面來定義我們的程式碼結構

程式碼架構

下面的程式碼架構主要爭對config-node而設計。
config請求處理:

class Config{
  public:
     void OnRequest(const TcpConnPtr& con, ConfigRequest& request);
}

相應的node介面

  class Node{
  protected:
      virtual void onConfigResponse(const TcpConnPtr& con,ConfigResponse& response);
 
  protected:
      void sendToConfig(const TcpConnPtr& con,ConfigResponse& response);
};

service與server繼承node後實現onConfigResponse即可。
image.png

對外介面設計

為了介面方便,對外介面均設為http介面,並支援網頁。

prime:

[get] http://dist.alibaba-inc.com/calc/prime

引數 含義
start 起始值
end 結束值

例:http://dist.alibaba-inc.com/calc/prime?start=1&end=10000

wordcount

[post] http://dist.alibaba-inc.com/calc/wordcount

引數 含義
data 待計算的檔案
tokenize 分隔符

分散式查詢
[post] http://dist.alibaba-inc.com/calc/query

引數 含義
app 應用名
db
collection 連線
data 查詢條件

service與server程式架構

image.png

流程監控設計

為了方便了解每次請求的全鏈路情況,我在原架構中新增了日誌與監控模組
image.png

功能顯示設計

prime

image.png

wordcount

image.png

query

image.png

chat

image.png

業務流程圖

prime

image.png

wordcount

image.png

對於map reduce運算,實際處理過程是這樣的
image.png

query

image.png

這裡的query在設計上是簡化處理了的,生產上可能需要注意結果快取,主從同步等。

從上面的設計上,我們可以發現,分散式處理的基礎需要有一個config(配置伺服器),及內部通訊協議。
另外,節點的備份機制也很重要, 比如 config崩潰或者server崩潰的結果要做到不受影響。

崩潰恢復機制

config

對於config的功能,由於其核心功能是當前節點分佈,是動態資料,因此資料安全可以採用的方法有很多,比如redis,mysql, mongo等。
image.png

其自身的功能崩潰恢復可以採用一種簡單有效的方法。每個config節點都存有所有config的資訊並且同步到各個node(service/server)。
每當新起一個config或者關掉一個,資訊更新一次,node與config失聯後再主動選擇一個連線。

image.png

node

config提供node相互關注的能力, 即node A可以關注node B, 當node B斷開後,config會通知像A一樣所有關注它的node。

image.png


相關文章