1. 程式人生 > >分散式系統概念

分散式系統概念

一 分散式系統

分散式系統的由來:
國內來講,移動網際網路的爆發伴隨著分散式系統的突現,移動網際網路最大的特點是2(to)c的o2o產品越來越多,這跟傳統2B的系統最大區別就是使用者量的不同,2C系統的使用者量遠遠要高於2b系統,這就對系統提出了各種各樣的高標準,響應時間,效能,災備,吞吐量等等,各種分散式技術也是為了這些標準而服務。
分散式架構的應用:
分散式檔案系統
分散式快取系統
分散式資料庫
分散式WebService
分散式計算

舉例說明:
分散式檔案系統: 出名的有 Hadoop 的HDFS ,還有 google的 GFS , 淘寶的 TFS 等

分散式快取系統:memcache , hbase , mongdb 等

分散式資料庫 : MySQL , Mariadb, PostgreSQL 等

以分散式MySQL資料庫中介軟體MyCat 為例子,MySQL 在現在電商以及網際網路公司的應用非常多,一個是因為他的免費開源,另外一個原因是因為分散式系統的水平可擴充套件性,隨著移動網際網路使用者的暴增,網際網路公司,像淘寶,天貓,唯品會等電商都採用分散式系統應對使用者的高併發量以及大資料量的儲存。
而在Mycat的商業案例中,有對中國移動的賬單結算專案中,應用實時處理高峰期每天2億的資料量,在對物聯網的專案中,實現處理高達26億的資料量,並提供實時查詢的介面。
在這裡插入圖片描述

二 大型分散式網站系統的效能要求

1.響應時間(Response time)

  2-5-8原則:(據統計當網站慢一秒就會流失十分之一的客戶)

  當用戶再2-5秒之間得到響應時,會感覺系統的響應速度還可以;

  當用戶再5-8秒內得到響應時,感覺蠻,但是還可以接受;

  當用戶大於8秒內得到響應時,感覺無法接受;

2.吞吐量(Throughput)

 指的是在單位時間內客戶端和伺服器成功傳送資料的數量;

3.資源使用率(Resource utilization)

  常見的有:cpu佔用率、記憶體使用率、磁碟I/O、網路I/O;

4.每秒點選數(Hits per Second)

  客戶端每秒向伺服器提交的請求數量,如果客戶端發出的請求數量越多,與之相對的平均吞吐量也應該越大;

5.併發使用者數(Concurrent users)

  客戶端的同一批使用者同時執行一個操作的數量。

三 Java後臺技術

在這裡插入圖片描述

四 技術名詞解釋

  1. 分散式和叢集

    分散式和叢集在通常情況下不做嚴格區分,正如同併發和並行一樣,應用情況下很少會去考究它的區別,許多大公司面試也直接問分散式叢集怎樣怎樣,一般都拿等同來講了。在這裡只在概念上做一下區別,使大家更合理的去理解,沒有對錯之分。

    分散式:一個電商系統,使用者模組部署在server1, 訂單模組部署在server2, 促銷模組部署在server3, 商品模組部署在server4,他們之間通過遠端rpc實現服務呼叫,這就叫分散式。強調的是不同功能模組,單獨部署在不同的server上,所有server加起來是一個完整的系統。

    叢集:更多強調的是災備,一個電商系統,完整的部署在server1上一個,完成的部署在server2上一個,server1宕機後,server2仍然可以正常提供請求服務,這叫叢集。同樣對於某一功能模組,比如使用者模組部署在server1上,同樣部署在server2上,也叫做叢集。分散式系統的每個功能模組節點,都可以用多機做成叢集。

    抽象問題具體化:拿做菜示例,假如一個廚師做菜要經歷切菜,炒菜兩個功能,飯店為了提高速度招了兩個廚師,每個廚師的工作一樣,都是切菜,炒菜,這是叢集。還有另一種方法提高效率,飯店招了一個切菜師傅,配合廚師,廚師不管切菜,只管炒菜了,和切菜師傅共同配合把菜做好,這叫分散式。

  2. Nginx

    作用是反向代理和負載均衡。

    反向代理是指請求真實是到server1的,但是系統中為了統一或者做比如單點登入,會在server2伺服器上安裝一個nginx,裡面配置到server1的反向代理,那麼之後請求url就可以寫server2的地址,發出後到server2, server2會轉發到server1上,類似一種代理的模式。

    負載均衡是指如果一個系統的請求很多,我們可以把請求轉發到不同的伺服器上,用來分流。就類似於接了一個水管放水,水流量很大時候,水壓大很可能會讓一個水管爆炸,這時候接三個水管,就沒問題了(這三個水管就是一個叢集)。類似的在nginx伺服器中配了3個tomcat伺服器,每個tomcat伺服器上都部署了整個系統,那麼當請求數大的時候,可以分發到不同的tomcat。(其實這裡每個tomcat上部署同一個功能模組也叫叢集)

  3. Java在分散式下的通訊
    在這裡插入圖片描述
    RPC(遠端過程呼叫)
    對於分散式系統來講,tomcat1上部署了使用者模組,tomcat2上部署了訂單模組,當用戶下單時,請求到tomcat2,這時候可能要判斷這個使用者是否是vip,或者是否有優惠券,這些方法是在tomcat1使用者模組上的,那麼tomcat2呼叫tomcat1的服務獲取這些資訊,就叫rpc呼叫。

    常見的rpc框架:輕量級的hessian, 阿里dubbo(噹噹dubbox), 新浪Motan, apache的Thrift,google的grpc, 百度的brpc, 騰訊的tars。

    rpc呼叫底層涉及到物件的序列化,反序列化,http/tcp傳輸,網路非同步傳輸netty。

  4. 訊息中介軟體(MQ)

    mq訊息中介軟體在分散式系統中的作用有很多,但是經常用到的還是非同步解耦。

    比如天貓下單流程,當用戶支付後,後臺介面執行的操作可能包括:1 驗籤,2 支付密碼校驗,3 扣庫存,4 使用者積分增加等等操作,其實我們希望的是2操作執行成功後立即給使用者結果提示,而不是等到後續各個操作完成後才去提示,因為後續的操作往往大部分是rpc呼叫,方法執行時間相對較長。另外對於下單支付這個操作,3和4是後續業務的需要,在設計上不能和下單支付本身出現強耦合度。所以這裡我們可以引入mq解決,也就是說1和2執行完成後,生產者只需要通知下3和4,把後續的操作扔給訊息佇列,立即返回。這裡的mq起到的作用一個是非同步呼叫,一個是解耦。

  5. NoSQL(非關係型資料庫)

    NoSQL是所有非關係型資料庫的統稱,在分散式系統中用到很多,主要用來提高QPS(query per second)。

    Redis: 我們講快取,或者記憶體資料庫,小巧強大,什麼資料適合放在redis也就是快取中,一個是經常查詢的,需要頻繁磁碟io的,例如有個快件系統,有個需求是當快件狀態為異常時候,需要傳送郵件提醒給系統管理員。介面入參是快件id,通常做法我們需要拿到id,去資料庫查狀態,然後傳送,但是快件基數很大時候每天的問題件也可能會很多,介面呼叫頻繁時候就需要改進做法,這時我們可以把快件狀態資訊放在redis裡面,key是快件id, value是快進狀態,每次進入介面時候直接redis裡面取status就可以,速度很快。另一個是查詢資料緩慢的,可以放在快取中。

    MongoDB: 可稱為分散式檔案資料庫,可用來儲存海量資料,它是NoSQL裡面最像關係型資料庫的,它的資料的儲存形式可以就理解為json格式。之前曾經兩次用到過mongoDB,一次是系統裡面有個實時監控裝置電流電壓的功能,硬體裝置實時會把資料同步到資料庫裡面,我們系統2-3s需要去拉次列表。另一個系統是一個輕型的行業IM工具,每天會有很大的聊天資料儲存,我們直接用了mongoDB儲存,後來系統相當穩定,從來沒有出現過效能瓶頸。