大型互聯網架構介紹

李达文 2024-10-02 04:44 12次浏览 0 条评论 taohigo.com

前言

  • 熟悉linux常用指令
  • 熟悉SSM框架
  • 具備java基礎
  • 最好做過企業級項目**分享目標**

大型互聯網項目的特點——三高

  • 高並發:同一時間訪問量大
  • 高可用:保證系統365 * 7 * 24不間斷運行
  • 高性能:響應時間快

一、高並發

1、什麼是高並發

高並發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。高並發相關常用的一些指標有 響應時間(Response Time),吞吐量(Throughput),每秒查詢率 QPS(Query Per Second),並發用戶數 等。

  • 響應時間: 系統對請求做出響應的時間。例如系統處理一個 HTTP 請求需要 200ms,這個 200ms 就是系統的響應時間。
  • 吞吐量: 單位時間(年,月,日,時,分,秒)內處理的請求數量。
  • QPS: 每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯。
  • 並發用戶數: 同時承載正常使用系統功能的用戶數量。例如一個即時通訊系統,同時在線量一定程度上代表瞭系統的並發用戶數。

二、高可用

1、什麼是高可用

故障監測 與 排除、消除達點故障 , 互備和容災

高可用註意如果使用單機,一旦掛機將導致服務不可用,可以使用集群來代替單機,一臺服務器掛瞭,還有其他後備服務器能夠頂上。或者使用分佈式部署項。比如現在redis的高可用的集群方案有: Redis單副本,Redis多副本(主從),Redis Sentinel(哨兵),Redis Cluster,Redis自研。

三、高性能

1、什麼是高性能呢?

高性能是指程序處理速度非常快,所占內存少,cpu占用率低。高性能的指標經常和高並發的指標緊密相關,想要提高性能,那麼就要提高系統發並發能力,兩者互相捆綁在一起。應用性能優化的時候,對於計算密集型和IO密集型還是有很大差別,需要分開來考慮。還有可以增加服務器的數量,內存,IO等參數提升系統的並發能力和性能,但不要浪費資源,要考慮硬件的使用率最高才能發揮到極致。

2、怎麼樣提高性能呢?

避免因為IO阻塞讓CPU閑置,導致CPU的浪費避免多線程間增加鎖來保證同步,導致並行系統串行化免創建、銷毀、維護太多進程、線程,導致操作系統浪費資源在調度上

四、怎樣應對高並發和高可用

互聯網分佈式架構設計,提高系統並發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up) 與 水平擴展(Scale Out)。

2.1、垂直擴展

提升單機處理能力。垂直擴展的方式又有兩種:

  • 增強單機硬件性能,例如:增加 CPU 核數如 32 核,升級更好的網卡如萬兆,升級更好的硬盤如 SSD,擴充硬盤容量如 2T,擴充系統內存如 128G;
  • 提升單機架構性能(提升軟件性能),例如:使用 緩存來減少 IO 次數,使用異步來增加單服務吞吐量,使用無鎖數據結構來減少響應時間;

在互聯網業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用 “增強單機硬件性能” 的方式提升系統並發能力,因為這個階段,公司的戰略往往是發展業務搶時間,而 “增強單機硬件性能” 往往是最快的方法。

不管是提升單機硬件性能,還是提升單機架構性能,都有一個致命的不足:單機性能總是有極限的。所以互聯網分佈式架構設計高並發終極解決方案還是水平擴展。

2.2、水平擴展

隻要增加服務器數量,就能線性擴充系統性能。水平擴展對系統架構設計是有要求的,如何在架構各層進行可水平擴展的設計,以及互聯網公司架構各層常見的水平擴展實踐,是本文重點討論的內容。

2.2.1、傳統單體架構

2.2.2、典型互聯網分層架構

  • 客戶端層:即調用方,如瀏覽器,手機,等能上網的工具
  • 反向代理層: 反向代理(Nginx)
  • 站點應用層: 實現核心應用邏輯,返回 HTML 或者 JSON
  • 數據緩存層: 緩存加速訪問存儲
  • 數據庫層: 數據庫持久化數據存儲

水平擴展分層架構

反向代理層的水平擴展

反向代理層的水平擴展,是通過 DNS 輪詢 實現的:DNS Server 對於一個域名配置瞭多個解析 IP,每次 DNS 解析請求來訪問 DNS Server,會輪詢返回這些 IP。

當 Nginx 成為瓶頸的時候,隻要增加服務器數量,新增 Nginx 服務的部署,增加一個外網 IP,就能擴展反向代理層的性能,做到理論上的無限高並發。

站點應用層的水平擴展

站點層的水平擴展,是通過 Nginx 實現的。通過修改 nginx.conf,可以設置多個 Web 後端。

當 Web 後端成為瓶頸的時候,隻要增加服務器數量,新增 Web 服務的部署,在 Nginx 配置中配置上新的 Web 後端,就能擴展站點層的性能,做到理論上的無限高並發。

服務層的水平擴展

服務層的水平擴展,是通過 服務連接池 實現的。

站點層通過 RPC Client 調用下遊的服務層 RPC Server 時,RPC Client 中的連接池會建立與下遊服務多個連接,當服務成為瓶頸的時候,隻要增加服務器數量,新增服務部署,在 RPC Client 處建立新的下遊服務連接,就能擴展服務層性能,做到理論上的無限高並發。如果需要優雅的進行服務層自動擴容,這裡可能需要配置中心裡服務自動發現功能的支持。

數據層的水平擴展

在數據量很大的情況下,數據層(緩存,數據庫)涉及數據的水平擴展,將原本存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不同服務器上去,以達到擴充系統性能的目的。

按照范圍水平拆分

每一個數據服務,存儲一定范圍的數據

  • db01(user)庫,存儲 uid 范圍 1-1kw
  • db02(user) 庫,存儲 uid 范圍 1kw-2kw

優點:

  • 規則簡單,Service 隻需判斷一下 uid 范圍就能路由到對應的存儲服務
  • 數據均衡性較好
  • 比較容易擴展,可以隨時加一個 uid [2kw,3kw] 的數據服務

缺點:

  • 請求的負載不一定均衡,一般來說,新註冊的用戶會比老用戶更活躍,大范圍的服務請求壓力會更大

按照哈希水平拆分

每一個數據庫,存儲某個 key 值 hash 後的部分數據

  • user0 庫,存儲偶數 uid 數據
  • user1 庫,存儲奇數 uid 數據

優點:

  • 規則簡單,Service 隻需對 uid 進行 hash 能路由到對應的存儲服務
  • 數據均衡性較好
  • 請求均勻性較好

缺點:

  • 不容易擴展,擴展一個數據服務,hash 方法改變時候,可能需要進行數據遷移

水平拆分與主從同步

這裡需要註意的是,通過水平拆分來擴充系統性能,與主從同步讀寫分離來擴充數據庫性能的方式有本質的不同。

通過水平拆分擴展數據庫性能

  • 每個服務器上存儲的數據量是總量的 1/n,所以單機的性能也會有提升
  • n 個服務器上的數據沒有交集,那個服務器上數據的並集是數據的全集
  • 數據水平拆分到瞭 n 個服務器上,理論上讀性能擴充瞭 n 倍,寫性能也擴充瞭 n 倍(其實遠不止 n 倍,因為單機的數據量變為瞭原來的 1/n)

通過主從同步讀寫分離擴展數據庫性能

  • 每個服務器上存儲的數據量是和總量相同
  • n 個服務器上的數據都一樣,都是全集
  • 理論上讀性能擴充瞭 n 倍,寫仍然是單點,寫性能不變

典型互聯網完整架構圖