后臺系統可擴展性學習筆記(一)概要

文章目錄

  • 系統大致架構
  • 可擴展性
  • 負載均衡器與會話保持
  • 引入冗余增強系統可用性
  • 緩存減輕數據庫壓力
  • 異步處理
  • 參考

系統大致架構

當一個用戶請求從客戶端出發,經過網絡傳輸,達到 Web 服務層,接著進入應用層,最后抵達數據層,它所途徑的過程如下:
在這里插入圖片描述
對應到系統設計的邏輯層:
在這里插入圖片描述
運作機制如下:
1、客戶端查DNS得到服務對應的IP地址,可能指向位于Web服務之前的負載均衡器,也可能是CDN,就近提供對象存儲中的靜態資源
2、發向Web服務的請求被負載均衡器(如反向代理)按照既定策略分給相應的Web服務器,進入應用層
3、請求到達應用層后,經過Service Discovery、Service Mesh等服務查詢機制找到目標微服務,開始處理請求
4、數據請求會通過一系列讀寫操作轉移到數據層,異步的操作還會進入消息隊列排隊,但最終都會抵達數據層
5、對熱點數據的請求會被數據庫之前的緩存層擋下,其余的落到數據庫,可能是經過分庫分表、反范式優化,并由復制機制保證數據一致性的SQL數據庫,也可能是查詢性能更好的Nosql數據庫抑或是對象存儲來保存數據。

接下來的系統設計主要就是圍繞這幾個關鍵的邏輯組件展開。

可擴展性

可擴展性,意味著能夠通過向系統添加資源的方式應對不斷增加的工作量。而加資源有兩種方式:

  • 縱向擴展(Vertical scaling):即提升單機配置,對單臺機器加內存、處理器、硬盤等硬件資源。投入足夠多的預算,就能砸出一臺配置豪華的服務器
  • 橫向擴展(Horizontal scaling):即加機器,數量上從一臺擴展到多臺,多服務器形成拓撲結構。投入足夠多的預算,就能擁有一個機房,甚至遍布全球的數據中心
    對于系統設計而言,可擴展性要求系統能夠將加入進來的更多資源(如多核、多機)利用起來。
    機器由一臺變成多臺之后,面臨的最大問題是資源分配,如何充分利用這些機器?即,如何均衡負載?

負載均衡器與會話保持

負載均衡器(Load Balancer)負責把用戶請求分發到多個服務器上,具體的,公網 Load Balancer 根據路由規則分發入站 HTTP 請求,決定把數據包實際發送給哪個內網服務器。常見的策略是基于負載情況分發、輪流均分、基于資源依賴情況分發。不建議用 DNS 來充當負載均衡器,因為操作系統以及應用層的 DNS 緩存會破壞這種輪流均分的機制。另一方面,不同類型的服務對資源的依賴情況(帶寬、存儲、計算能力等)可能不一樣,所以也可以采用專用服務器,并根據資源依賴情況分發,比如對 gif、jpg、image、video 等使用不同的專用服務器,并通過子域名等方式來區分
會話保持:
加一層 Load Balancer 解決了資源分配的問題,但又帶來了一個新問題:前后兩個請求可能被負載均衡器轉發到不同的服務器上,如果這兩個請求有關聯(比如登錄和下單),前置的狀態就會丟失(用戶剛登錄完點擊下單接著可能又要求登錄)
一種解決辦法是粘滯會話(Sticky sessions),把相關聯的請求轉發給同一臺服務器:
比如在 Cookie 中帶上服務器的標識信息,之后的一系列請求都轉給那臺服務器,但 Cookie 可能會被禁用,因此一般會綜合使用多種方式來保持會話
另一種方案是把 Session“外包”出去,存放到公共的地方,供其它服務器共享訪問:
每臺服務器都包含完全相同的代碼庫,不在本地光盤或內存中存儲任何與用戶相關的數據,如會話或個人資料圖片。會話需要存儲在所有應用服務器都可以訪問的集中數據存儲中。
至此,我們增加了一些機器,并通過一個負載均衡器讓多臺機器共同分擔運轉起來了,看起來一切都很完美……那么,如果這個負載均衡器 down 掉了呢?

引入冗余增強系統可用性

引入負載均衡器之后,所有請求都要先經過負載均衡器,負載均衡器就成為了網絡拓撲結構中脆弱的單點,一旦發生故障,身后的所有服務器就都無法訪問了。
為了避免單點故障(Single Point of Failure),負載均衡器同樣需要引入冗余(比如使用一對兒負載均衡器),一般有兩種故障轉移(Fail-over)模式:

  • 主動-被動(Active-passive):主動的工作,被動的備用,主動的 down 掉后被動的上
  • 主動-主動(Active-active):同時工作,一個 down 掉之后不影響
    無論采用哪種工作模式,引入冗余都能縮短宕機時間,提升系統可靠性與可用性

理論上,有了可靠的負載均衡機制,我們就能將 1 臺服務器輕松擴展到 n 臺,然而,如果這 n 臺機器仍然使用同一數據庫的話,很快數據庫就會成為系統的性能瓶頸和可靠性瓶頸
如法炮制,我們可以擴展數據庫的處理能力,多加幾個庫,即引入冗余,一般有兩種模式:

  • 主從復制:主庫直接讀寫,從庫在主庫收到查詢時,執行相同的查詢。如果主庫 down 掉了,就在從庫里面提升一個作為主庫
  • 主主復制:都可以寫,寫操作也會被復制到另一個庫中
    數據庫引入冗余之后,甚至還能對多個從庫進行負載均衡(尤其適用于讀密集的場景):
    在這里插入圖片描述
    以及按內容特點分區存儲(Partitioning):
    在這里插入圖片描述
    將姓名以 A-M 開頭的數據存放到左邊的幾個數據庫,N-Z 開頭的存放到右邊

同時,也可以通過分庫分表(Sharding)、反范式化(Denormalization)、SQL 調優(SQL tuning)等方式優化查詢

緩存減輕數據庫壓力

盡可能減少數據庫操作,比如在 Web 服務與數據之間增加一層內存緩存,查詢時優先走緩存,緩存中沒有才從數據庫中取。
一般有兩種緩存模式:

  • 緩存查詢結果
  • 緩存對象
    緩存所有查詢結果最大的問題在于,數據發生變化后,很難判定緩存是否過期:
在緩存復雜查詢時,很難刪除緩存的結果(誰沒有?)。
當一段數據發生更改(例如表單元格)時,需要刪除可能包含該表單元格的所有緩存查詢。

而緩存對象是指緩存根據原始數據組裝出的數據模型(比如一個 Java 類實例),優勢在于獲知數據變化之后,能夠丟棄與之具有邏輯關聯的數據對象,從而解決緩存過期的難題。
至此,我們已經自下而上地討論了包括硬件資源、數據庫、緩存在內的可擴展性問題,那么,Web 服務自身應該如何擴展?

異步處理

對于 Web 服務而言,提升可擴展性的主要途徑是將耗時的同步工作改成異步處理,從而允許將這些工作“外包”給多個 Worker 去做,或者提前完成能夠預知的部分.

參考

1、http://gotocon.com/dl/goto-aar-2012/slides/MartinThompson_ItsAllANumbersGameTheDirtyLittleSecretOfScalableSystems.pdf
2、http://www.ayqy.net/blog/scalability-in-the-real-world/
3、https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

poj 3728(LCA + dp)

題目鏈接:http://poj.org/problem?id3728 思路:題目的意思是求樹上a -> b的路徑上的最大收益(在最小值買入,在最大值賣出)。 我們假設路徑a - > b 之間的LCA(a, b) f, 并且另up[a]表示a - > f之間的最大收益…

成功之路

1、每天都要有進步,都要有新知識的收獲。 2、工作認真負責,高效的完成,多總結。 3、自己多練習一些感興趣的東西,實踐!!! 4、寫博客。 5、百度、騰訊、阿里是目標,差距還很大&#x…

后臺系統可擴展性學習筆記(二)權衡取舍

文章目錄性能與可擴展性延遲與吞吐量可用性與一致性一致性模式可用性模式可用性衡量參考系統設計中也面臨許多權衡取舍:性能與可擴展性延遲與吞吐量可用性與一致性 性能與可擴展性 可擴展,意味著服務能以加資源的方式成比例地提升性能,性能…

iOS中使用子線程的完整方法

第一步:開啟子線程 //開啟子線程到網絡上獲取數據myFirstThread [[NSThread alloc]initWithTarget:self selector:selector(thread1GetData) object:nil];[myFirstThread setName:"第一個子線程,用于獲取網絡數據"];[myFirstThread start]; 第二步&…

DIV的表單布局

表單布局其實用表格最好了&#xff0c;可是表格的話&#xff0c;無法定位&#xff0c;這個是一個硬傷。 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>表單布局</title> <link rel"stylesheet" …

后臺系統可擴展性學習筆記(三)DNS機制原理

文章目錄DNS概念梳理域名基本概念資源記錄基本概念路由策略DNS 域空間結構實現原理復制機制查詢機制緩存機制參考DNS概念梳理 DNS&#xff08;Domain Name System&#xff09;相當于互聯網的通訊錄&#xff0c;能夠把域名翻譯成 IP 地址。 從技術角度來講&#xff0c;DNS 是個…

后臺系統可擴展性學習筆記(四)CDN機制原理

文章目錄概念梳理CDN拓撲結構CDN內容分發方式架構原理工作原理實現原理概念梳理 CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是由分布在不同地理位置的代理服務器及其數據中心組成的網絡&#xff0c;希望在空間距離上為用戶就近提供服務&am…

Javascript 基礎—變量 運算符

經過找工作筆試的洗禮&#xff0c;感覺自己js語法方面掌握的不是很系統&#xff0c;今天來梳理下——變量以及運算符。 基礎篇 和C語言的不同點&#xff1a;是一種弱類型語言&#xff0c;申明變量時不需要指定類型&#xff1b;變量名的命名方法也有不同&#xff1b;簡單類型種類…

后臺系統可擴展性學習筆記(五)負載均衡

文章目錄Load balancer(負載均衡器)請求傳輸拆解DNS 負載均衡客戶端負載均衡OSI 七層模型回顧2 層、3 層負載均衡3/4 層負載均衡7 層負載均衡在 第一節談到了系統的橫向擴展在于從單機擴展到多機&#xff0c;那么面臨的第一個問題就是這些機器如何協同工作&#xff0c;即如何調…

Struts2第一個工程helloStruts極其基本配置

前面已經準備好了Struts-2.3.15&#xff0c;現在就可以直接搭建Struts2的工程了。前面http://blog.csdn.net/huangchnegdada/article/details/9179041有對Struts-2.3.15的準備工作的詳述。 首先打開MyEclispe新建一個Web Project&#xff0c;名字就叫Struts2_0100_Introduction…

[LeetCode]Find Minimum in Rotated Sorted Array

題目描述&#xff1a; Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 解題方案&#xff1a; 直接貼代碼&…

后臺系統可擴展性學習筆記(六)反向代理

文章目錄Web代理服務反向代理反向代理作用Web代理服務 Web 代理服務指的是在客戶端資源請求和提供這些資源的 Web 服務之間充當中介的角色&#xff0c;代理服務可以實現在客戶端&#xff0c;或者從客戶端到目標服務器中間的任意環節。 例如&#xff0c;客戶端不直接向提供目標…

(C)單鏈表

老師版 1 #include <stdio.h>2 #include <stdlib.h>3 4 // 定于Node數據類型5 struct Node6 {7 int data; // 數據域8 struct Node *next; // 指針域9 };10 11 // 創建一個單鏈表&#xff0c;并把head節點返回&#xff1b;…

實驗:sigsuspend(),sigprocmask()

實驗&#xff1a;sigsuspend(),sigprocmask()源代碼&#xff1a;/* * Program: pause_suspend.c * To test the difference between sigsuspend() and paus(). * Author: zsl * Date: 2014-10-17 * First release. * 參見網頁&#xff1a;http://blog.csdn.net/liwentao1091/ar…

后臺系統可擴展性學習筆記(七)Service Discovery與微服務

文章目錄應用層微服務架構服務注冊查詢 Service Discovery客戶端 Service DiscoveryDNS-SD DNS-based Service Discovery服務端 Service Discovery服務注冊與注銷自注冊模式第三方注冊模式總結參考應用層 在簡單的 3 層結構中&#xff0c;Web 服務層既要處理請求&#xff0c;又…

很久沒寫代碼了,這(那)幾天真是累死了。。。先寫一個幻方的程序吧

1 #include <stdio.h>2 #include <stdlib.h>3 #include <windows.h>4 5 #define EVEN_DOUBLE_4 4 //雙偶的最基本類型&#xff0c;4階雙偶6 #define SCREEN_SIZE 19 //屏幕顯示不變形的最大尺寸&#xff08;主要是因為窗口大小限制&#xff09;7 #defi…

#pragma once

http://baike.baidu.com/view/1276747.htm?fraladdin 轉載于:https://www.cnblogs.com/prayer521/p/4069040.html

后臺系統可擴展性學習筆記(八)Service Mesh

文章目錄網絡傳輸可靠性將微服務控制下沉到網絡棧&#xff1f;Sidecar從 Sidecar 到 Service MeshService Mesh 部署平臺參考網絡傳輸可靠性 從計網的學習過程中我們可以知道數據在網絡傳輸中可能會出現一些異常狀況&#xff1a; 數據丟失&#xff1a;數據包可能會到達一個緩…

關于Spring batch的學習之CSV2DB

最近在學習Spring batch相關的內容&#xff0c;網上也有不少Spring Batch相關的知識&#xff0c;不過大多都是使用xml進行配置的。這里是我用注解的方式進行相關的學習心得。 首先我們來看如何將一個文本文件中的內容導入到數據庫中。 我們先來看一下我們所需要的環境。我們這里…