06.08 系統架構升級之道,關注關鍵服務依賴

系統架構升級之道,關注關鍵服務依賴

【數據庫】

一個典型的互聯網應用,前端服務器可以利用負載均衡服務,組成一個集群,但是隻有一個mysql主庫,這時候,mysql服務就是系統中依賴的關鍵服務。

關鍵服務的性能和波動將成為整個系統的性能瓶頸和主要問題源。

為了減輕只有一個mysql主庫的依賴,我們引入了一主多從的架構,讓更多從庫也來提供查詢服務,減輕主庫的查詢依賴。

這樣升級改造後,系統的性能和穩定性還是有明顯的提升,但是mysql查詢的複雜度和數量增加後,mysql的性能瓶頸依然會很突出。

系統架構升級之道,關注關鍵服務依賴

【緩存層】

於是,繼續升級,引入redis或者memcache,將大量的結果緩存起來,把應用盡量從mysql隔離,減少對數據庫的依賴。

這時候,我們會欣喜的發現,應用的性能比之前完全依賴mysql的時候要強好多,穩定性也響應的提高很多。

隨著我們的系統越來越複雜,訪問量越來越大,緩存層的壓力也會越來越大。

一方面是內存不足的問題,另一方面數據更新更復雜,還有就是訪問壓力以及內網帶寬的瓶頸也增加了。

這時候又要開始對緩存層繼續升級改造了,於是分佈式緩存集群也就出現了。

通過一致性hash算法或者簡單的散列方法,都可以很容易的增加redis/memcache服務來構建更大規模的集群。

這樣一來,隨著服務器增加,單機的內存瓶頸減輕了,訪問壓力以及帶寬壓力也降低了,但是數據更新的問題依然存在。

數據更新的問題,就是數據不一致的問題,本質上就是因為一個數據的多次寫入,中間出現異常的話,就導致出現不一致了。

關於數據一致性問題,我們後面再來詳細分析和講解。

隨著緩存層集群的構建,整個系統架構就變成了多前端服務器,多緩存服務器,一個主庫,多個從庫。

主庫主要承載數據寫入的負載,在大部分的互聯網應用中,寫入的數量相對還是少很多的,所以大部分時候,這樣的架構也就可以安枕無憂啦。

【更大規模】

我們的追求不僅是眼前的苟且,還有更強大的系統和更多的用戶。

當我們的應用,用戶數、訪問量過千萬之後,以前的架構還是會遇到越來越多的挑戰。

這裡面,可能數據庫還是會第一個出現瓶頸,畢竟一個主庫,再強大也是沒法做到一秒鐘數萬次的更新,哪怕只是小小的點擊數的增加。

這時候,就要開始考慮對數據庫做分拆了,把一個數據庫分拆為好幾個數據庫(分表分庫)。

而分拆的方式,大家應該能想到的,比如:水平分拆和垂直分拆。

系統架構升級之道,關注關鍵服務依賴

【水平分拆】

典型的水平分拆就是對數據做歸檔,按照日期(每年歸檔),把舊的數據遷移到歸檔庫裡面,訪問量少,也不會有寫入的壓力。

水平分拆對整個系統的改造和變化相對來說是影響比較小的,畢竟數據結構沒有變化,只是數據源增加了。

而這種分拆帶來的明顯效果就是,數據規模減少,數據庫的讀寫性能都會有明顯的提升,當然對整個應用的性能和穩定性都會有很大提高。

系統架構升級之道,關注關鍵服務依賴

【垂直分拆】

如果只是對數據庫做垂直分拆,只是把一部分數據表遷移到其他獨立數據庫中,比如:把用戶相關的信息表遷移到用戶庫,把商品相關的產品表遷移到商品庫,那這個分拆也不算難。

但是,往往伴隨著系統規模的變大,應用的複雜度也會不斷提高。

所以,這個時候垂直分拆,很可能會同時進行應用的分拆。

比如:把用戶的登錄註冊、信息維護單獨部署和維護,把商品信息的管理和維護單獨部署。

這時候,應用也就同時進行了垂直分拆,即:把大的應用進行組件化、服務化。

系統架構升級之道,關注關鍵服務依賴

【微服務】

到這個階段,大家應該就開始感覺大一個系統的複雜了吧。

一開始說好的做一個互聯網應用,而現在卻出來了很多個應用和服務,他們之間又有很多關聯,組成一個大型的系統。

這時候,系統中的關鍵服務依賴已經不僅僅是緩存層、數據庫服務,而變成了一個個拆分之後的應用、微服務了。

這時候,系統的性能和穩定性就完全依賴各個微服務的性能和穩定性了。

如果,再把每個微服務按照上面的架構升級路線演練一遍,貌似又不那麼困難。

但是,全部組合在一起,新的難點已經是對這些服務的監控、運維、故障排除等治理工作。

系統架構升級之道,關注關鍵服務依賴

【暢想未來】

那麼,系統繼續升級的話,我想,可能就是自動化運維的工作會更多了吧。

一兩個數據庫宕機不用怕,主從自動切換,數據庫集群秒級自動恢復。

幾個緩存服務器網絡不穩定也沒關係,有備份的緩存可以先用著。

微服務的一些服務器不穩定,服務自動降級,並且在微服務穩定後自動恢復以及同步數據。

甚至一個機房斷網、斷電了,其他機房依然正常的提供全面的服務,不影響用戶使用。

【總結】

關鍵服務依賴總是最重要的環節,也是最容易出問題的地方。

系統架構升級,正是對這些關鍵依賴的瓶頸進行針對性優化升級和改造。

應用從小變大,再分拆變小,從一個應用到很多個微服務,這些都是技術不斷變革的過程。

規模化帶來了帶來了的總體容量和總體性能的提高,同時也帶來了關於服務治理的新挑戰。

那麼,是不是開發系統都要用這麼複雜的架構呢?

其實不是,上面的架構升級過程,其實是對線上問題不斷髮現和解決的過程,也是一個不得已的過程。如果一個系統的用戶量、業務量不大,一開始就複用一套龐大的系統架構,那真的就費時費力,累死自己,完全沒必要。所以,合適就好。

如果對JAVA微服務、分佈式、高併發、高可用、大型互聯網架構技術、面試經驗交流感興趣的可以關注我的頭條號,我會在微頭條不定期的發放免費的學習資料和視頻給大家,目前受益良多!


分享到:


相關文章: