參考:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/node
業務中的分佈式:git
分佈式存儲:將數據分片到多個節點上,不只能夠提升性能(可擴展性),同時也可使用多個節點對同一份數據進行備份(高可用性)github
分佈式計算:將一個大的計算任務分解成小任務分配到多個節點上去執行,再彙總每一個小任務的執行結果獲得最終結果。MapReduce 是分佈式計算最好的例子。算法
分佈式事務:
指事務的操做位於不一樣的節點上,須要保證事務的 AICD 特性。數據庫
產生的緣由:安全
解決辦法:服務器
1. 兩階段提交協議(很好地解決分佈式事務問題)架構
2. 消息中間件(本質上是一個暫存轉發消息的一箇中間件)app
處理模型:(1)點對點;(2)發佈/訂閱負載均衡
負載均衡的算法與實現:
算法有輪詢(Round Robin)、加權輪詢、最少鏈接(將請求發送給當前最少鏈接數的服務器)、加權最小鏈接、隨機算法
上面的沒有加權的適合服務器性能差很少場景
Zookeeper 是一個爲分佈式應用提供一致性服務的軟件,例如配置管理、分佈式協同以及命名的中心化等,這些都是分佈式系統中很是底層並且是必不可少的基本功能,可是若是本身實現這些功能並且要達到高吞吐、低延遲同時還要保持一致性和可用性,實際上很是困難。
抽象模型:Zookeeper 提供了一種樹形結構級的命名空間,/app1/p_1 節點表示它的父節點爲 /app1。
監聽器:爲一個節點註冊監聽器,在節點狀態發生改變時,會給客戶端發送消息。
節點類型
分佈式鎖實現:
會話超時
若是一個已經得到鎖的會話超時了,由於建立的是臨時節點,所以該會話對應的臨時節點會被刪除,其它會話就能夠得到鎖了。能夠看到,Zookeeper 分佈式鎖不會出現數據庫分佈式鎖的死鎖問題。
羊羣效應(在這裏不存在羊羣效應)
在步驟二,一個節點未得到鎖,須要監聽監聽本身的前一個子節點,這是由於若是監聽全部的子節點,那麼任意一個子節點狀態改變,其它全部子節點都會收到通知(羊羣效應),而咱們只但願它的後一個子節點收到通知。
--------------------------------------------------------
分佈式 Session
在分佈式場景下,一個用戶的 Session 若是隻存儲在一個服務器上,那麼當負載均衡器把用戶的下一個請求轉發到另外一個服務器上,該服務器沒有用戶的 Session,就可能致使用戶須要從新進行登陸等操做。
須要配置負載均衡器,使得一個用戶的全部請求都路由到一個服務器節點上,這樣就能夠把用戶的 Session 存放在該服務器節點中。
缺點:當服務器節點宕機時,將丟失該服務器節點上的全部 Session。
在服務器節點之間進行 Session 同步操做,這樣的話用戶能夠訪問任何一個服務器節點。
缺點:須要更好的服務器硬件條件;須要對服務器進行配置。
將 Session 信息持久化到一個數據庫中。
缺點:有可能須要去實現存取 Session 的代碼。
可使用 Redis 和 Memcached 這種內存型數據庫對 Session 進行存儲,能夠大大提升 Session 的讀寫效率。內存型數據庫一樣能夠持久化數據到磁盤中來保證數據的安全性。