在上篇文章中,介紹了八種架構設計模式中的三種,既:查詢分離模式、微服務模式、多級緩存模式,沒有讀過的同學請手動微信關注“碼農原創”公眾號,在歷史消息中尋找。接下來繼續介紹最后的三種架構模式,分別是:分庫分表模式、彈性伸縮模式、多機房模式。
1. 分庫分表模式
這種模式主要解決單表寫入、讀取、存儲壓力過大,從而導致業務緩慢甚至超時,交易失敗,容量不夠的問題。一般有水平切分和垂直切分兩種,這里主要介紹水平切分。這個模式也是技術架構迭代演進過程中的必經之路。
這種模式的一般設計見下圖:
如上圖所示紅色部分,把一張表分到了幾個不同的庫中,從而分擔壓力。是不是很籠統?哈哈,那我們接下來就詳細的講解一下。首先澄清幾個概念,如下:
主機:硬件,指一台物理機,或者虛擬機,有自己的CPU,內存,硬盤等。
實例:數據庫實例,如一個MySQL服務進程。一個主機可以有多個實例,不同的實例有不同的進程,監聽不同的端口。
庫:指表的集合,如學校庫,可能包含教師表、學生表、食堂表等等,這些表在一個庫中。一個實例中可以有多個庫。庫與庫之間用庫名來區分。
表:庫中的表,不必多說,不懂的就不用往下看了,不解釋。
那么怎么把單表分散呢?到底怎么個分發呢?分發到哪里呢?以下是幾個工作中的實踐,分享一下:
主機:這是最主要的也是最重要的點,本質上分庫分表是因為計算與存儲資源不夠導致的,而這種資源主要是由物理機,主機提供的,所以在這里分是最基本的,畢竟沒有可用的計算資源,怎么分效果都不是太好的。
實例:實例控制着連接數,同時受OS限制,CPU、內存、硬盤、網絡IO也會受間接影響。會出現熱實例的現象,即:有些實例特別忙,有些實例非常的空閑。一個典型的現象是:由於單表反應慢,導致連接池被打滿,所有其他的業務都受影響了。這時候,把表分到不同的實例是有一些效果的。
庫:一般是由於單庫中最大單表數量的限制,才采取分庫。
表:單表壓力過大,索引量大,容量大,單表的鎖。據以上,把單表水平切分成不同的表。
大型應用中,都是一台主機上只有一個實例,一個實例中只有一個庫,庫==實例==主機,所以才有了分庫分表這個簡稱。
既然知道了基本理論,那么具體是怎么做的呢?邏輯是怎么跑的呢?接下來以一個例子來講解一下。
這個需求很簡單,用戶表(user),單表數據量1億,查詢、插入、存儲都出現了問題,怎么辦呢?
首先,分析問題,這個明顯是由於數據量太大了而導致的問題。
其次,設計方案,可以分為10個庫,這樣每個庫的數據量就降到了1KW,單表1KW數據量還是有些大,而且不利於以后量的增長,所以每個庫再分100個表,這個每個單表數據量就為10W了,對於查詢、索引更新、單表文件大小、打開速度,都有一些益處。接下來,給IT部門打電話,要10台物理機,擴展數據庫......
最后,邏輯實現,這里應該是最有學問的地方。首先是寫入數據,需要知道寫到哪個分庫分表中,讀也是一樣的,所以,需要有個請求路由層,負責把請求分發、轉換到不同的庫表中,一般有路由規則的概念。
怎么樣,簡單吧?哈哈,too 那義務。說說這個模式的問題,主要是帶來了事務上的問題,因為分庫分表,事務完成不了,而分布式事務又太笨重,所以這里需要有一定的策略,保證在這種情況下事務能夠完成。采取的策略如:最終一致性、復制、特殊設計等。再有就是業務代碼的改造,一些關聯查詢要改造,一些單表orderBy的問題需要特殊處理,也包括groupBy語句,如何解決這些副作用不是一句兩句能說清楚的,以后有時間,我單獨講講這些。
該總結一下這種模式的優缺點的了,如下:
優點:減少數據庫單表的壓力。
缺點:事務保證困難、業務邏輯需要做大量改造。
2. 彈性伸縮模式
這種模式主要解決突發流量的到來,導致無法橫向擴展或者橫向擴展太慢,進而影響業務,全站崩潰的問題。這個模式是一種相對來說比較高級的技術,也是各個大公司目前都在研究、試用的技術。截至今日,有這種思想的架構師就已經是很不錯了,能夠拿到較高薪資,更別提那些已經實踐過的,甚至實現了底層系統的那些,所以,你懂得......
這種模式的一般設計見下圖:
如上圖所示,多了一個彈性伸縮服務,用來動態的增加、減少實例。原理上非常簡單,但是這個模式到底解決什么問題呢?先說說由來和意義。
每年的雙11、六一八或者一些大促到來之前,我們都會為大流量的到來做以下幾個方面的工作:
-
提前准備10倍甚至更多的機器,即使用不上也要放在那里備着,以防萬一。這樣浪費了大量的資源。
-
每台機器配置、調試、引流,以便讓所有的機器都可用。這樣浪費了大量的人力、物力,更容易出錯。
-
如果機器准備不充分,那么還要加班加點的重復上面的工作。這樣做特別容易出錯,引來領導的不滿,沒時間回家陪老婆,然后你的老婆就......(自己想)
在雙十一之后,我們還要人工做縮容,非常的辛苦。一般一年中會有多次促銷,那么我們就會一直這樣,實在是煩!
最嚴重的,突然間的大流量爆發,會讓我們觸不及防,半夜起來擴容是在正常不過的事情,為此,我們偷懶起來,要更多的機器備着,也就出現了大量的cpu利用率為1%的機器。
我相信,如果你是老板一定很震驚吧!!!
哈哈,那么如何改變這種情況呢?請接着看
為此,首先把所有的計算資源整合成資源池的概念,然后通過一些策略、監控、服務,動態的從資源池中獲取資源,用完后在放回到池子中,供其他系統使用。
具體實現上比較成熟的兩種資源池方案是VM、docker,每個都有着自己強大的生態。監控的點有CPU、內存、硬盤、網絡IO、服務質量等,根據這些,在配合一些預留、擴張、收縮策略,就可以簡單的實現自動伸縮。怎么樣?是不是很神奇?深入的內容我們會在的碼農原創的公眾號文章中詳細介紹。
該總結一下這種模式的優缺點的了,如下:
優點:彈性、隨需計算,充分優化企業計算資源。
缺點:應用要從架構層做到可橫向擴展化改造、依賴的底層配套比較多,對技術水平、實力、應用規模要求較高。
3. 多機房模式
這種模式主要解決不同地區高性能、高可用的問題。
隨着應用用戶不斷的增加,用戶群體分布在全球各地,如果把服務器部署在一個地方,一個機房,比如北京,那么美國的用戶使用應用的時候就會特別慢,因為每一個請求都需要通過海底光纜走上個那么一秒鍾(預估)左右,這樣對用戶體驗及其不好。怎么辦?使用多機房部署。
這種模式的一般設計見下圖:
如上圖所示,一個典型的用戶請求流程如下:
-
用戶請求一個鏈接A
-
通過DNS智能解析到離用戶最近的機房B
-
使用B機房服務鏈接A
是不是覺得很簡單,沒啥?其實這里面的問題沒有表面這么簡單,下面一一道來。
首先是數據同步問題,在中國產生的數據要同步到美國,美國的也一樣,數據同步就會涉及數據版本、一致性、更新丟棄、刪除等問題。
其次是一地多機房的請求路由問題,典型的是如上圖,中國的北京機房和杭州機房,如果北京機房掛了,那么要能夠通過路由把所有發往北京機房的請求轉發到杭州機房。異地也存在這個問題。
所以,多機房模式,也就是異地多活並不是那么的簡單,這里只是起了個頭,具體的有哪些坑,會在另一篇文章中介紹。
該總結一下這種模式的優缺點的了,如下:
優點:高可用、高性能、異地多活。
缺點:數據同步、數據一致性、請求路由。
呵呵,至此,整個關於八種架構設計模式及其優缺點概述就介紹完了,大約1W字左右。最后,我想說的是沒有銀彈、靈活運用,共勉!