組件分佈在網絡計算機上,組件之間僅僅經過消息傳遞來通訊並協調行動。node
完成一組完整邏輯的程序個體,對應於server上的一個獨立進程。mysql
在分佈式系統中還存在着一種狀態:超時,意味着結果徹底不肯定。分佈式協議就是保證系統在各類異常情形下仍能正常的工做。sql
強一致性和強可用性在實際的系統中每每不能同時兼得,須要根據需求來權衡選擇;服務器
也即數據的分佈式存儲方式,主要有如下幾個方式:網絡
每條數據經過某種計算方式計算出Hash值並分配到對應的服務器上;架構
int serverId = data.hashcode % serverTotalNum; 經過這種方式就能夠將數據對應到不一樣的服務器上;分佈式
優勢:簡單易用,只須要根據數據的鍵值計算出serverid便可;函數
缺點:可擴展性不高,當須要增長服務器時會出現大量數據遷移;並且容易形成數據傾斜的問題;
測試
將數據的某個特徵值按照值域分爲不一樣區間。好比按時間、區間分割,不一樣時間範圍劃分到不一樣server上。code
優勢:數據區間能夠自由分割,當出現數據傾斜時,即某一個區間的數據量很是大,則能夠將該區間split而後將數據進行重分配;集羣方便擴展,當添加新的節點,只需將數據量多的節點數據遷移到新節點便可。
缺點:須要存儲大量的元信息(數據區間和server的對應關係)。
這樣的存儲方式和數據的特徵類型沒有關係,能夠理解成將一個大的文件分紅固定大小的多個block。
優勢:不會有數據傾斜的問題,並且數據遷移時速度很是快(由於一個文件由多個block組成,block在不一樣的server上,遷移一個文件能夠多個server並行複製這些block)。
缺點:須要存儲大量的meta信息(文件和block的對應關係,block和server的對應關係)。
把數據用hash函數(如MD5),映射到一個很大的空間裏,如圖所示。數據的存儲時,先獲得一個hash值,對應到這個環中的每一個位置。一致性哈希和哈希的數據分佈方式大概一致,惟一不一樣的是一致性哈希hash的值域是個環。
優勢:集羣可擴展性好,當增長刪除節點,隻影響相鄰的數據節點。
缺點:當一個節點掛掉時,將壓力所有轉移到相鄰節點,有可能將相鄰節點壓垮。
當某臺服務器出現故障時,這臺服務器上的數據就不可訪問,爲了保證系統仍談能正常運轉,須要對數據存儲多個副本。
引入多個副本後,引來了一系列問題:多個副本之間,讀取時以哪一個副本的數據爲準呢,更新時什麼纔算更新成功,是全部副本都更新成功仍是部分副本更新成功便可認爲更新成功?這些問題其實就是CAP理論中可用性和一致性的問題。其中primary-secondary副本控制模型則是解決這類問題行之有效的方法。
副本更新基本流程:數據更新操做發到primary節點,由primary將數據更新操做同步到其餘secondary副本,根據其餘副本的同步結果返回客戶端響應。
以mysql的master slave簡單說明下,一般狀況下,mysql的更新只須要master更新成功便可響應客戶端,slave能夠經過binlog慢慢同步,這種情形讀取slave會有必定的延遲,一致性相對較弱,可是系統的可用性有了保證;另外一種slave更新策略,數據的更新操做不只要求master更新成功,同時要求slave也要更新成功,primary和secondray數據保持同步,系統保證強一致性,但可用性相對較差,響應時間變長。
根據quorum協議,在保證必定的可用性同時又保證必定的一致性的情形下,設置副本更新成功數爲總副本數的一半(即N/2+1)性價比最高。
副本的讀取策略和一致性的選擇有關,若是須要強一致性,咱們能夠只從primary副本讀取,若是須要最終一致性,能夠從secondary副本讀取結果,若是須要讀取最新數據,則按照quorum協議要求,讀取相應的副本數。
當系統中某個副本不可用時,須要從剩餘的副本之中選取一個做爲primary副原本保證後續系統的正常執行。
Client模塊:負責用戶和系統內部模塊的通訊。
Master模塊:負責元數據的存儲以及節點健康狀態的管理。
Data節點模塊:用於數據的存儲和數據查詢返回。
數據的查詢流程一般分兩步:
1. 向master節點查詢數據對應的節點信息;
2. 根據返回的節點信息鏈接對應節點,返回相應的數據。
如何作到exactly once, 須要在數據處理各個階段作些保證:
由於數據計算的節點都是無狀態的,只要啓動任務副本便可。
其中任務恢復策略有如下幾種:
在數據處理中,常常會擔憂這樣一個問題:數據處理的上游消費數據速度太快,會不會壓垮下游數據輸出端如mysql等。 一般的解決方案:上線前期咱們會作詳細的測試,評估數據下游系統承受的最大壓力,而後對數據上游進行限流的配置,好比限制每秒最多消費多少數據。