架構的演變之路


關於分布式系統,一直不知道該怎么寫,這里就先介紹下架構的演變

1.在最開始時,使用的架構是這樣的:

 

 瀏覽器向后台服務器發送請求,然后服務器請求數據庫,獲取數據,在響應給瀏覽器,這是最早期的架構,服務器和數據庫放在一台主機上,

 

這樣的架構帶來的問題是:

  當訪問量逐漸增大時,服務器的負載就會越來越大,負載達到一定限制時,服務器就會宕機,一旦服務器宕機,前端就獲取不到任何數據

2.為了解決這個問題,就提出了第二套架構

 

 通過將數據庫分離出來成為一個單獨的服務器,來減小放web項目的服務器的壓力,這樣雖然解決了第一種架構的問題,但是新的問題出現了:

  當有十萬並發請求web服務器時,服務器就會宕機,服務器宕機,瀏覽器仍然獲取不到任何數據,核心功能在web服務器上

3.因此就出現了第三種架構

 

 為了解決上一種架構的問題,於是就提出了使用web服務器集群來部署項目,這樣當節點1宕機的話,就會請求節點2處理請求,那么問題也隨之而來:

  如果訪問量非常大,導致節點1宕機的話,那么所有的請求就會被節點2接受,節點1宕機,節點2最后必然也會宕機,

4.負載均衡

 

 針對上面的架構的問題,就有了解決辦法:

  使用nginx來做負載均衡,使用輪詢算法,一條給節點1,一條給節點2,下一個請求還給節點1,這樣就解決了上面的問題,但是又迎來了新的問題:

  假設節點1的最大負載是8萬,那么當節點1上現在已經達到滿載8萬時,下一條請求就是壓死駱駝的最后一根稻草,當下一次請求進入節點1,節點1的負載就到了8萬零一條,

這時節點1就會宕機。當節點1宕機后,nginx會繼續嘗試連接節點1,當嘗試幾次還是連接不上后,就會放棄連接,並將節點1標記為宕機狀態。

  節點1宕機后,所有的請求就會壓在節點2上,那么最后結果是節點2也必然宕機

5.架構五,將項目拆分

 

將一個項目於分兩個節點來存放,節點1就只存放門戶網站,節點2存放登錄的項目, 這樣就將請求分不同的服務器處理了

假設此時又十萬並發過來了,這十萬並發中有兩萬是請求門戶網站的,就訪問節點1、3,八萬是請求登錄項目的就訪問節點2、4,這樣高並發的問題就解決了。可以查看dubbo架構:https://github.com/Zs-xiazhi/dubbo

  並發的問題解決了,數據庫又出現問題了:想象一下,隨着項目的越來越大,用戶越來越多,數據庫中的用戶表中的數據也越來越多,數據的查詢就會非常慢,而且服務器集群中所有的服務器都是訪問這一個數據庫,那么數據庫的壓力就會很大。隨着數據庫中的數據越來越多,壓力越來越大,數據庫就會宕機,而服務器集群訪問的只有這一台數據庫,一旦數據庫宕機,那么所有的項目都獲取不到數據了。

6.架構六,設置主從數據庫

因為上面已經解決了服務器集群高並發問題,因此就不詳細畫該部分了:

 

 數據庫設置主從關系庫,正常運行時web服務器訪問主庫,所有的數據都存放在DB1上,當DB1宕機時,訪問DB2,發現沒有數據,因此DB1和DB2之間要做數據同步。

當DB1宕機期間,所有的數據都存放在DB2上,如果DB1修好了,這時發現DB2上有的數據DB1上沒有,DB2就會自動向DB1同步數據,速度非常快,為了加快速度,可以將經常使用的且不經常修改的數據放入redis緩存中

這種架構出現的問題是:

  1.如果DB1宕機,如何切換從庫?

    啟用監聽。項目啟動后,web項目連接數據庫DB1,當DB1連接超時,啟用監聽,切換數據庫DB2

  2.單表數據過大,數據庫承受訪問壓力過大

    單表數據量過大:分庫分表

    數據庫承受訪問壓力過大:獨寫分離

7.分庫分表

 

 如上圖所示,假設項目用戶越來越多,那么用戶表user內的數據就會越來越多,這時查詢數據非常慢,使用分庫分表,就是將同一張表放入不同的數據庫中。

假設user表中有10萬條數據,那么就在db1放1-5萬條數據, db2中放5-10萬條數據

在分庫分表中,沒有主從概念,所有的數據庫都是平等的

問題:如何知道要查詢的數據在那兒個數據庫中?

  假設用戶需要查詢一條數據, 那么服務器如何知道這條數據存在哪兒個數據庫的表中的呢?所以需要在服務器和數據庫之間建立一個命名節點,這也是一個數據庫,里面存放的數據是每個數據庫節點的數據范圍。如:DB1---1-5萬,DB2--5-10萬。這樣服務器訪問數據庫時,先到命名節點中查詢要查的數據庫是在哪兒個數據庫上,然后再到相應的數據庫中查詢數據。

8.讀寫分離

分庫分表完美解決了大量數據的存儲問題,但是單個服務器壓力過大的問題還沒有解決,讀寫分離解決但服務器壓力過大問題:中間的命名節點仍然存在,這里畫漏了

 

 讀寫分離:

  就是把服務器端的select和增刪改操作分離開來,對每一個數據庫做標識(read-->只做select操作,write-->只做增刪改操作)

讀寫分離是有主從概念的,並不是真的有主庫和從庫的區分,是有這個概念,讀為主,寫為從。

上圖使用的是獨寫分離加上分庫分表,這兩種方式可以同時使用,也可以分開單獨使用,並不沖突  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM