分布式架構前世今生...

      網友投稿 613 2022-05-30

      一、前言

      隨著社會的發展,技術的進步,以前的大型機架構很顯然由于高成本、難維護等原因漸漸地變得不再那么主流了,替代它的就是當下最火的分布式架構,從大型機到分布式,經歷了好幾個階段,我們弄明白各個階段的架構,才能更好地理解和體會分布式架構的好處,那么本文我們就來聊聊分布式架構的演進過程,希望能給大家帶來眼前一亮的感覺。

      二、背景說明

      我們都知道一個成熟的大型網站的系統架構并非一開始就設計的非常完美,也沒有一開始就具備高性能、高并發、高可用、安全性等特性,而是隨著用戶量的增加、業務功能的擴展逐步演變過來的,慢慢的完善的。 在這個過程中,開發模式、技術架構等都會隨著迭代發生非常大的變化。 而針對不同業務特征的系統,各自都會有自己的側重點,例如像淘寶這類的網站,要解決的重點問題就是海量商品搜索、下單、支付等問題; 像騰訊這類的網站,要解決的是數億級別用戶的實時消息傳輸;而像百度這類的公司所要解決的又是海量數據的搜索。每一個種類的業務都有自己不同的系統架構。

      下面我們來簡單模擬一個架構演變過程。 我們以 javaweb 為例,來搭建一個簡單的電商系統,從這個系統中來看系統的演變過程。要注意的是接下來的演示模型, 關注的是數據量、訪問量提升,網站結構的變化, 而不關注具體業務的功能點。其次,這個過程是為了讓大家能更好的了解網站演進過程中的一些問題和應對策略。

      假如我們系統具備以下功能:

      用戶模塊:用戶注冊和管理。

      商品模塊:商品展示和管理。

      交易模塊:創建交易及支付結算。

      三、階段一:單應用架構

      這個階段是網站的初期,也可以認為是互聯網發展的早期,系統架構如上圖所示。我們經常會在單臺服務器上運行我們所有的程序和軟件。 把所有軟件和應用都部署在一臺機器上,這樣就完成一個簡單系統的搭建,這個階段的講究的是效率。效率決定生死。

      四、階段二:應用服務器和數據庫服務器分離

      隨著網站的上線,訪問量逐步上升,服務器的負載慢慢提高,我們應該在服務器還沒有超載的時候就做好規劃、提升網站的負載能力。假若此時已經沒辦法在代碼層面繼續優化提高,那么在單臺機器的性能遇到瓶頸的時候,增加機器是一個比較簡單好用的方式,投入產出比相當高。這個階段增加機器的主要目的是將 web 服務器和 數據庫服務器拆分開來,這樣做的話不僅提高了單機的負載能力,也提高了整個系統的容災能力。

      這個階段的系統架構如上圖所示,應用服務器和數據庫服務器完全隔離開來,相互互不影響,大大減少了網站宕機的風險,此階段我們已經開始關注到應用服務器的管理了。

      五、階段三:應用服務器集群

      這個階段,隨著訪問量的繼續不斷增加,單臺應用服務器已經無法滿足我們的需求。 假設我的數據庫服務器還沒有遇到性能問題,那我們可以通過增加應用服務器的方式來將應用服務器集群化,這樣就可以將用戶請求分流到各個服務器中,從而達到繼續提升系統負載能力的目的。此時各個應用服務器之間沒有直接的交互,他們都是依賴數據庫各自對外提供服務。

      系統架構發展到這個階段,各種問題也會接踵而至:

      用戶請求交由誰來轉發到具體的應用服務器上(誰來負責負載均衡)

      用戶如果每次訪問到的服務器不一樣,那么如何維護session,達到session共享的目的。

      那么此時,系統架構又會變成如下方式:

      負載均衡又可以分為軟負載和硬負載。軟負載我們可以選擇Nginx、Apache等,硬負載我們可以選擇F5等。

      而session共享問題我們可以通過配置tomcat的session共享解決。

      六、階段四:數據庫壓力變大,數據庫讀寫分離

      架構演變到上面的階段,并不是終點。通過上面的設計,應用層的性能被我們拉上來了, 但數據庫的負載也在逐漸增大,那如何去提高數據庫層面的性能呢?有了前面的設計思路以后,我們自然也會想到通過增加服務器來提高性能。但假如我們單純的把數據庫一分為二,然后對于數據庫的請求,分別負載到兩臺數據庫服務器上,那必定會造成數據庫數據不統一的問題。 所以我們一般先考慮將數據庫讀寫分離。

      這個架構設計的變化會帶來如下幾個問題:

      主從數據庫之間的數據需要同步(可以使用 mysql 自帶的 master-slave 方式實現主從復制 )

      應用中需要根據業務進行對應數據源的選擇( 采用第三方數據庫中間件,例如 mycat )

      七、階段五:使用搜索引擎緩解讀庫的壓力

      我們都知道數據庫常常對模糊查找效率不是很高,像電商類的網站,搜索是非常核心的功能,即使是做了讀寫分離,這個問題也不能得到有效解決。那么這個時候我們就需要引入搜索引擎了,使用搜索引擎能夠大大提升我們系統的查詢速度,但同時也會帶來一 些附加的問題,比如維護索引的構建、數據同步到搜索引擎等。

      八、階段六:引入緩存機制緩解數據庫的壓力

      然后,隨著訪問量的持續不斷增加,逐漸會出現許多用戶訪問同一內容的情況,那么對于這些熱點數據,沒必要每次都從數據庫重讀取,這時我們可以使用到緩存技術,比如 redis、memcache 來作為我們應用層的緩存。另外在某些場景下,如我們對用戶的某些 IP 的訪問頻率做限制, 那這個放內存中就又不合適,放數據庫又太麻煩了,那這個時候可以使用 Nosql 的方式比如 mongDB 來代替傳統的關系型數據庫。

      九、階段七:數據庫的水平/垂直拆分

      我們的網站演進的變化過程,交易、商品、用戶的數據都還在同一 個數據庫中,盡管采取了增加緩存,讀寫分離的方式,但是隨著數 據庫的壓力持續增加,數據庫的瓶頸仍然是個最大的問題。因此我 們可以考慮對數據的垂直拆分和水平拆分。

      垂直拆分:把數據庫中不同業務數據拆分到不同的數據庫。

      分布式架構的前世今生...

      水平拆分:把同一個表中的數據拆分到兩個甚至更多的數據庫中,水平拆分的原因是某些業務數據量已經達到了單個數據庫的瓶頸,這時可以采取將表拆分到多個數據庫中。

      十、階段八:應用的拆分

      隨著業務的發展,業務量越來越大,應用的壓力越來越大。工程規模也越來越龐大。這個時候就可以考慮將應用拆分,按照領域模型將我們的用戶、商品、交易拆分成多個子系統。

      這樣拆分以后,可能會有一些相同的代碼,比如用戶操作,在商品和交易都需要查詢,所以會導致每個系統都會有用戶查詢訪問相關操作。這些相同的操作一定是要抽象出來,否則就是一個坑。所以通過走服務化路線的方式來解決。

      那么服務拆分以后,各個服務之間如何進行遠程通信呢? ?通過 RPC 技術,比較典型的有:dubbo、webservice、hessian、http、RMI 等等。前期通過這些技術能夠很好的解決各個服務之間通信問題,但是, 互聯網的發展是持續的,所以架構的演變和優化也還在持續。

      十一、總結

      通過本文,我們通過一個電商的案例,就了解到了分布式架構的演進過程,一環套一環,環環緊密相扣。都是通過業務量和訪問量的提升來考慮重構架構設計,以便能夠適應當前的環境。不可一蹴而就,也急不來,初創企業必須穩扎穩打,一步一個腳印的走出一條專屬自己的路。加油,everybody!

      分布式 緩存 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Java線程安全和鎖Synchronized概念
      下一篇:AI入門之Python數據分析工具Numpy常用函數丨【百變AI秀】
      相關文章
      亚洲女人影院想要爱| 亚洲色偷偷av男人的天堂| 亚洲专区先锋影音| 精品亚洲综合久久中文字幕| 久久亚洲AV永久无码精品| 午夜亚洲av永久无码精品| 久久亚洲精品无码gv| 亚洲人av高清无码| 亚洲gay片在线gv网站| 亚洲AV无码一区二区三区性色| 亚洲精品天堂无码中文字幕| 亚洲熟妇无码AV不卡在线播放 | 亚洲精品无码久久久久久| 亚洲另类无码一区二区三区| 亚洲人成色777777精品| 亚洲精华国产精华精华液| 国产午夜亚洲精品不卡免下载| 亚洲国产精品自在拍在线播放| 亚洲精品视频久久久| 狠狠亚洲婷婷综合色香五月排名 | 亚洲三级在线观看| 最新亚洲春色Av无码专区| 亚洲欧美综合精品成人导航| 亚洲另类无码专区首页| 日韩亚洲国产综合久久久| 亚洲乱码中文字幕手机在线| 亚洲中文字幕久久精品无码喷水 | 亚洲成av人片在线观看无码不卡| 久久久久亚洲Av片无码v| 老司机亚洲精品影院无码| 亚洲天堂电影在线观看| 亚洲视频无码高清在线| 国产精品无码亚洲精品2021 | 亚洲国产一区二区三区| 国产亚洲精品a在线观看| 亚洲AV无码一区二区二三区入口| 亚洲精品国产成人专区| 亚洲乱码在线播放| 久久人午夜亚洲精品无码区| 亚洲午夜精品第一区二区8050| 亚洲国产精品无码一线岛国|