前言
概念
分佈式系統是由一組通過網絡進行通信、爲了完成共同的任務而協調工作的計算機節點組成的系統
分佈式系統挑戰
分佈式系統需要大量機器協作,面臨諸多的挑戰:
第一,異構的機器與網絡:
分佈式系統中的機器,配置不一樣,其上運行的服務也可能由不同的語言、架構實現,因此處理能力也不一樣;節點間通過網絡連接,而不同網絡運營商提供的網絡的帶寬、延時、丟包率又不一樣。怎麼保證大家齊頭並進,共同完成目標,這四個不小的挑戰。
第二,普遍的節點故障:
雖然單個節點的故障概率較低,但節點數目達到一定規模,出故障的概率就變高了。分佈式系統需要保證故障發生的時候,系統仍然是可用的,這就需要監控節點的狀態,在節點故障的情況下將該節點負責的計算、存儲任務轉移到其他節點
第三,不可靠的網絡:
節點間通過網絡通信,而網絡是不可靠的。可能的網絡問題包括:網絡分割、延時、丟包、亂序。
相比單機過程調用,網絡通信最讓人頭疼的是超時:節點A向節點B發出請求,在約定的時間內沒有收到節點B的響應,那麼B是否處理了請求,這個是不確定的,這個不確定會帶來諸多問題,最簡單的,是否要重試請求,節點B會不會多次處理同一個請求。
分步式簡單架構
概念與實現
那麼對於上面的各種技術與理論,業界有哪些實現呢,下面進行簡單羅列。
當然,下面的這些實現,小部分我用過,知其所以然;大部分聽說過,知其然;還有一部分之前聞所未聞,分類也不一定正確,只是從其他文章抄過來的。羅列在這裏,以便日後或深或淺的學習。
- 負載均衡:
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