日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

web架构延变

發布時間:2025/5/22 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 web架构延变 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在現代的軟件系統中,幾乎所有的系統都使用到了數據庫,不論是關系型數據,例如MySql、SQLite、Oracle、SQLServer等,還是非關系性數據,例如mongoDB、redis等。本文已web系統為例來闡述為什么要降低數據庫的壓力,在提出具體方案之前先大致講解一下現在web系統的架構,要了解web系統的架構和演變過程具體可以參考大型網站架構演變和知識體系這片文章。

現代web系統的架構

現在的大型web系統多采用分布式的架構,分布式系統面臨的最大挑戰就是如何在復雜的、并發的情況下保證數據的一致性問題。通常為了避免由于保證數據一致性問題而帶來的困難,通常情況下都是采用多個實例,單個數據源的架構模式,簡化模式如圖。?
?
在這個架構中,通過不斷的增加實例(webserver)可以降低應用服務器的壓力,所以只要保證應用代碼的質量、應用之間的低耦合性、可擴展性和可維護性等,應用服務器的壓力就不再會成為整體架構中性能瓶頸,但是隨著業務量的不斷增加增長,或者時間的積累,沉淀下來的數據變得越來越來多,隨著而來的數據庫的壓力變得越來越大,慢慢的性能的瓶頸主要集中在數據庫上。


降低數據庫壓力的方法

1.合理增加索引

表索引可以加快對表中數據的檢索速度,但是會降低表中數據的更新速度,所以增加表的索引一定控制在合理范圍內,過多的索引不但不會降低數據庫的壓力,反而可能增大數據庫的壓力,表索引的建立一般要從具體業務場景出發,對于讀多寫少的場景,可以通過適當的增加索引來提高效率,對表的那些列建立索引?建立單獨索引還是建立復合索引?要根據具體的業務場景來決定,建立索引之后可以針對索引對業務邏輯中使用的SQL進行優化,建立索引是最基礎的手段,這里不錯過多的介紹。

2.數據截轉

一般情況下,業務中所處理的數據的都具有一定的時間間隔,所以可以通過對業務進行梳理,將當前時間間隔之外的數據進行截轉,截轉到歷史數據庫中,通過對業務進行拆分,當需要歷史數據時,可以轉到歷史數據庫中進行查詢,或者修改,通過減少當前數據庫的數據量,來減輕當前業務數據的壓力。數據截轉一般情況下是按照時間來進行,所以在業務員數據庫設計的時候就要考慮到時間這個因素。?
數據截轉可以進行間隔一段時間做一次手工的數據截轉,也可以啟動一個定時器,每個一段時間進行一次數據截轉,推薦的方式是準實時截轉,及每天在業務量較小的時間,啟動任務實時截轉。?
數據截轉需要注意的幾個問題:(1)外鍵關聯關系(特別是有主鍵ID的關聯的)注意在截轉的歷史數據庫中的關聯關系是否正確。(2)保證生產庫和歷史庫的業務關聯關系,從而避免歷史庫的數據需要關聯生產庫中的數據。

3.增加緩存

緩存是降低數據壓力一個強有力的手段,基本是所有系統大型web系統中都會使用到,所以現代的大型web系統的架構一般如圖。?
?
請求1到達webserver之后,首先執行2訪問緩存,如果hit則返回,miss則執行3訪問數據庫,在執行4同步到緩存中,再返回。但是不是緩存并不是萬能的,緩存也有其使用的業務場景,一般在讀多寫少,數據重復查詢比較集中的場景下,緩存可以大大提高性能,緩存操作順序非常重要,不合理的操作順序,在并發場景下常常會導致數據的不一致,緩存的具體操作可以參考緩存架構設計細節二三事這邊文章。

4.生成寬表,冗余數據

有些業務例如報表、數據匯總等需要數據量較多,此時可能需要進行多表聯合查詢,聯合查詢操作非常消耗數據庫的性能,所以在這種業務場景下為了避免過大的性能消耗,往往需要將查詢時的多個表按照關聯條件進行關聯,生成一張含有冗余信息的包含所有表的多個字段的大寬表,這樣在進行查詢時,只在一張表中進行查詢,性能明顯得到提升。大寬表的生成是在業務流程中生成還是通過異步化任務來生成,根據具體的業務邏輯來定。

5.修改關系型數據庫為非關系性數據庫

非關系型數據庫,也就是我們通常說的NoSQL數據,最常見就是key/value類型的數據庫,這類數據庫不強調表的關系,但是查詢速度非常快,所在某些具體場景下,我們應該優先選擇NoSQL數據庫,例如字典信息表的查詢。

6.讀寫分離

如果采用單點數據數據庫,就算對數據進行上述的相關優化,但是由于其本身的單點性,所以隨著流量的激增,數據庫仍然會成為系統的瓶頸,如何對數據進行拆分來解決這個問題了,讀寫分離就是最常用的方法,讀寫分離的原理如下圖。?
?
讀寫分離技術現在已經應用的很成熟,通過將數據拆分為兩個實例,讀寫分離操作改善了數據單點的瓶頸,分攤了數據庫壓力,而且當主數據庫宕機之后可以迅速的切換到從庫,而不會導致業務不可用,同時也起到數據備份的作用,由于存在兩個數據實例,所以數據怎么由主庫同步到從庫、主從之間延遲引發的數據不一致問題,以及怎么來分離業務中讀和寫操作成為要解決的問題成為要解決的問題。主從同步可以參考Mysql主從架構的復制原理及配置這篇文章,從主數據一致可以參考DB主從一致性的幾種解決方法這篇文章。

7.數據庫拆分

采用讀寫分離之后,數據庫已經變為兩份實例,數據庫的壓力已經得到分攤,如果數據庫的壓力還是過大時,這是就要從業務方面著手,將具體業務細分,將業務對應的表分拆到不同的數據庫當中,如下圖。?

業務變動較大,同時要對系統內部之間的相互調用提供接口,調用方式可以選用RPC、Restful、JMQ消息等方式。一般情況下,數據庫垂直拆分做的足夠細分的話,加上讀寫分離技術,加上適當的數據截轉就可以滿足一般的大型業務系統對性能的需求。

8.表的垂直拆分

數據庫可以進行垂直拆分,當然也可以對數據庫中的表進行垂直拆分,對表進行拆分就是對數據拆分的再拆分,如圖。種解決方法只適用于一些特定的場景,例如對表進行垂直拆分,通過異步化調用將所有任務異步化,前提是總的任務可以進行分布的異步化操作,在實際應用比較少,因為設計的表只要復合三范式的要求,一般是很難在進行拆分的,應用較多是對表進行水平拆分。?

9.表的水平拆分

如果已經做了數據庫拆分,并且進行了讀寫分離,數據壓力還是過大,主要原因就是數據庫表中的記錄太多,或者對數據進行了截轉,但是對歷史數據的操作還是比較頻繁的,且隨著截轉的歷史數據越來越多,歷史數據庫的壓力也邊的也變的越來越大,這時有兩種解決方案:第一種方案就是對數據庫中的表進行垂直拆分,從而不用在截轉數據,通過不斷對表進行水平拆分,保證數據數據庫中單表的記錄數保持在一個高性能合理的范圍之類,通過擴容將不同分配到不同的數據中(分庫分表)來保證數據庫的壓力,應用在訪問時,通過分庫分表的條件進行路由,就可以取到數據。第二種就是仍舊對數據進行截轉,當歷史數據信息過多從而導致數據庫壓力過大時,采用搜索引擎的方式來解決。相比于第一種操作第二種方案適用于讀操作上,對與寫操作,具有一定的局限性,第一種方案具有一定的通用性。對表進行水平拆分的過程如圖所示。?
?
在進行進行具體水平拆分之前,我們需要考慮這樣幾個問題

  • 制定什么樣的路由規則
  • 如何盡量避免跨庫或者跨表操作
  • 如何盡可能的避免全庫全表掃描
  • 如何保證每個庫的負載處于基本盡可能均衡的狀態
  • 如何實時跨庫訪問事物
  • 如何實時聚合操作
  • 如何保證擴容的方便性
  • 1. 制定什么樣的路由規則

    2. 如何盡量避免跨庫或者跨表操作

    3. 如何盡可能的避免全庫全表掃描

    4. 如何保證每個庫的負載處于基本盡可能均衡的狀態

    5. 如何實時跨庫訪問事物

    6. 如何實時聚合操作

    7. 如何保證擴容的方便性

    轉載于:https://www.cnblogs.com/liangxiaofeng/p/6408103.html

    總結

    以上是生活随笔為你收集整理的web架构延变的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。