分佈式系統概要和用到的技術

分佈式幾個經常使用概念html

1. 分佈式和集羣
分佈式和集羣在一般狀況下不作嚴格區分,正如同併發和並行同樣,應用狀況下不多會去考究它的區別,許多大公司面試也直接問分佈式集羣怎樣怎樣,通常都拿等同來說了。在這裏只在概念上作一下區別,使你們更合理的去理解,沒有對錯之分。
分佈式:一個電商系統,用戶模塊部署在server1, 訂單模塊部署在server2, 促銷模塊部署在server3, 商品模塊部署在server4,他們之間經過遠程rpc實現服務調用,這就叫分佈式。強調的是不一樣功能模塊,單獨部署在不一樣的server上,全部server加起來是一個完整的系統。mysql

集羣:更多強調的是災備,一個電商系統,完整的部署在server1上一個,完成的部署在server2上一個,server1宕機後,server2仍然能夠正常提供請求服務,這叫集羣。一樣對於某一功能模塊,好比用戶模塊部署在server1上,一樣部署在server2上,也叫作集羣。分佈式系統的每一個功能模塊節點,均可以用多機作成集羣。nginx

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


2. nginx
做用是反向代理和負載均衡。
反向代理是指請求真實是到server1的,可是系統中爲了統一或者作好比單點登陸,會在server2服務器上安裝一個nginx,裏面配置到server1的反向代理,那麼以後請求url就能夠寫server2的地址,發出後到server2, server2會轉發到server1上,相似一種代理的模式。面試

負載均衡是指若是一個系統的請求不少,咱們能夠把請求轉發到不一樣的服務器上,用來分流。就相似於接了一個水管放水,水流量很大時候,水壓大極可能會讓一個水管爆炸,這時候接三個水管,就沒問題了(這三個水管就是一個集羣)。相似的在nginx服務器中配了3個tomcat服務器,每一個tomcat服務器上都部署了整個系統,那麼當請求數大的時候,能夠分發到不一樣的tomcat。(其實這裏每一個tomcat上部署同一個功能模塊也叫集羣)redis


3. rpc(遠程過程調用)
對於分佈式系統來說,tomcat1上部署了用戶模塊,tomcat2上部署了訂單模塊,當用戶下單時,請求到tomcat2,這時候可能要判斷這個用戶是不是vip,或者是否有優惠券,這些方法是在tomcat1用戶模塊上的,那麼tomcat2調用tomcat1的服務獲取這些信息,就叫rpc調用。
常見的rpc框架:輕量級的hessian, 阿里dubbo(噹噹dubbox), 新浪Motan, apache的Thrift,google的grpc, 百度的brpc, 騰訊的tars。
rpc調用底層涉及到對象的序列化,反序列化,http/tcp傳輸,網絡異步傳輸netty。spring


4. 消息中間件
mq消息中間件在分佈式系統中的做用有不少,可是常常用到的仍是異步解耦。
好比天貓下單流程,當用戶支付後,後臺接口執行的操做可能包括:1 驗籤,2 支付密碼校驗,3 扣庫存,4 用戶積分增長等等操做,其實咱們但願的是2操做執行成功後當即給用戶結果提示,而不是等到後續各個操做完成後纔去提示,由於後續的操做每每大部分是rpc調用,方法執行時間相對較長。另外對於下單支付這個操做,3和4是後續業務的須要,在設計上不能和下單支付自己出現強耦合度。因此這裏咱們能夠引入mq解決,也就是說1和2執行完成後,生產者只須要通知下3和4,把後續的操做扔給消息隊列,當即返回。這裏的mq起到的做用一個是異步調用,一個是解耦。sql

5. NoSQL
NoSQL是全部非關係型數據庫的統稱,在分佈式系統中用到不少,主要用來提升QPS(query per second)。
redis: 咱們講緩存,或者內存數據庫,小巧強大,什麼數據適合放在redis也就是緩存中,一個是常常查詢的,須要頻繁磁盤io的,例若有個快件系統,有個需求是當快件狀態爲異常時候,須要發送郵件提醒給系統管理員。接口入參是快件id,一般作法咱們須要拿到id,去數據庫查狀態,而後發送,可是快件基數很大時候天天的問題件也可能會不少,接口調用頻繁時候就須要改進作法,這時咱們能夠把快件狀態信息放在redis裏面,key是快件id, value是快進狀態,每次進入接口時候直接redis裏面取status就能夠,速度很快。另外一個是查詢數據緩慢的,能夠放在緩存中。
mongoDB: 可稱爲分佈式文件數據庫,可用來存儲海量數據,它是NoSQL裏面最像關係型數據庫的,它的數據的存儲形式能夠就理解爲json格式。docker

 

用到的一些技術概念數據庫

  • 負載均衡:

Nginx:高性能、高併發的web服務器;功能包括負載均衡、反向代理、靜態內容緩存、訪問控制;工做在應用層
LVS: Linux virtual server,基於集羣技術和Linux操做系統實現一個高性能、高可用的服務器;工做在網絡層

  • webserver:

Java:Tomcat,Apache,Jboss
Python:gunicorn、uwsgi、twisted、webpy、tornado

service:  
SOA、微服務、spring boot,django

  • 容器:

docker,kubernetes

  • cache:

memcache、redis等

  • 協調中心:

zookeeper、etcd等
zookeeper使用了Paxos協議Paxos是強一致性,高可用的去中心化分佈式。zookeeper的使用場景很是普遍,以後細講。

  • rpc框架:

grpc、dubbo、brpc
dubbo是阿里開源的Java語言開發的高性能RPC框架,在阿里系的諸多架構中,都使用了dubbo + spring boot

  • 消息隊列:

kafka、rabbitMQ、rocketMQ、QSP
消息隊列的應用場景:異步處理、應用解耦、流量削鋒和消息通信

  • 實時數據平臺:

storm、akka

  • 離線數據平臺:

hadoop、spark
PS: apark、akka、kafka都是scala語言寫的,看到這個語言仍是很牛逼的

  • dbproxy:

cobar也是阿里開源的,在阿里系中使用也很是普遍,是關係型數據庫的sharding + replica 代理

  • db:

mysql、oracle、MongoDB、HBase

  • 搜索:

elasticsearch、solr

  • 日誌:

rsyslog、elk、flume

 

參考:

https://blog.csdn.net/u012491783/article/details/79489221

https://www.cnblogs.com/xybaby/p/7787034.html

相關文章
相關標籤/搜索