你見過凌晨四點的北京嗎?
你見過凌晨四點的洛杉磯嗎?
科比見過
那是他新一天訓練時間的開始
你見過凌晨四點的北京嗎?
地鐵工作人員見過
當第一輛列車於5點準時駛出時
它的工作人員早在一個小時前就開始了工作
迎接「高並發」時刻的到來
打開今日頭條,查看更多圖片欄杆圍成七拐八拐迷宮一般的通道
進站和出站的人流按照指定的路線前行
為的就是舒緩運輸壓力,
讓地鐵運行高效、有序
這個思路在IT系統里也有著異曲同工之妙
「讀」和「寫」有點像一對冤家
一塊磁碟如果同時進行讀和寫工作,
勢必會影響整體性能的發揮
因而「讀寫分離」思路應運而生
分享一篇「硬核」文章
介紹IT架構的「讀寫分離」設計思路
如果把公司經營比作摩天大樓,IT系統架構就相當於摩天大樓的地基,如今越來越多的IT人士開始重視系統架構設計。但架構設計非常複雜,其複雜性主要來源於IT系統的高性能、高可用、高擴展需求,而「讀寫分離」則是架構設計中解決這幾個需求的關鍵設計思路之一。
讀寫分離原理本身非常簡單,即讀、寫操作的實現由不同資源獨立完成,但要考慮到資源分配的合理性和數據同步的時效性,讀寫分離技術真正用起來也並不是看著那麼簡單。
目前,在企業的IT架構中,讀寫分離設計思想的應用確實存在改善空間。筆者將嘗試從四個不同層面對讀寫分離設計思路的應用進行整體闡述,包括表示層、資料庫層、緩存層和存儲介質層。
表示層讀寫分離設計.....
表示層是後台提供給客戶端的入口,讀寫分離設計主要體現為動靜分離。以Web為例(如下圖),後台既有html、圖片、JS/CSS等基本維持不變的靜態頁面,該部分頁面以讀操作為主,也有針對不同用戶、不同場景進行定製化的變化頁面,該部分頁面需要讀寫結合。
Web讀寫分離的應用,有以下多方面益處:
? 第1, 可縮短靜態頁面的訪問路徑、改善用戶體驗。
? 第2, 動態頁面靜態化,進一步改善系統性能。
? 第3, 預留更多資源用於處理訪問路徑更長的動態頁面。
在動靜分離的應用過程中,需要注意的是,頁面靜態化不宜過度,否則會因靜態頁面太大反而導致用戶體驗降低。
資料庫讀寫分離的設計.....
一談到讀寫分離,很多人往往最先想到資料庫。隨著業務的快速發展和數據的高速增長,傳統關係資料庫軟體的性能瓶頸逐漸凸顯,進而影響了擴展能力甚至可用性,這對用戶來說是不可接受的。為此,資料庫平台紛紛推出主從集群模式應用讀寫分離技術。
資料庫主從集群如下圖所示▼。
簡單來說,主從模式就是資料庫主機負責寫操作,資料庫從機負責讀操作,通過合理分配演算法,從機可以大幅減輕主機的負載,從而提高性能。
引入資料庫從機後,需要額外考慮讀寫操作分配和資料庫連接管理,主要有應用層實現和中間層實現兩種方式。
>>>>
應用層實現資料庫讀寫分離
在應用層可以通過配置多資料庫來源實現讀寫分離,在應用模塊中對讀寫請求進行分流,對此業界有不少平台可以實現,包括Spring JDBC、Hibernet等。這種實現方式不需要額外引入中間件,因而具備策略靈活、易於調整、實現簡單的特點,但該方式也增加了應用層的複雜性,包括分流、均衡、安全等方面都需要考慮。
由於擴容過程中讀寫分離策略變更等比較複雜,應用層讀寫分離主要用於小規模應用系統。
>>>>
中間層實現資料庫讀寫分離
引入中間件,也是另一種讀寫操作分配的實現方式,其原理是由中間層提供SQL介面供業務訪問,後台讀寫操作由中間件統一處理。該方式能向業務屏蔽資料庫節點的故障,簡化業務設計,但中間件本身的性能也需要特別關注。
另外,由於資料庫主從之間的數據同步必然導致資料庫從機缺失少量最新數據,可通過多種方式解決此類問題。以MySQL為例(MySQL Router如下圖),有三種解決思路比較常見。
第1, 在資料庫寫入操作完成後,可以將讀操作指定發給資料庫主伺服器。
第2, 從機讀取失敗後再讀一次主機。
第3, 也可以將關鍵業務讀寫操作全部指向資料庫主機。
需要注意的是,三種方式需要相互結合。
緩存層讀寫分離設計.....
針對讀多寫少的資料庫,有一種在大型系統中非常普遍有效的方法,就是採用專用緩存資料庫,將熱點數據複製到緩存節點的大內存中,為大批量的讀取操作更快速地提供數據,從而減輕主資料庫的負載壓力。這類緩存資料庫讀取性能非常高,通過緩存資料庫節點的橫向擴展後則性能更高。以MemCache為例,單節點簡單查詢TPS可達50000以上,多節點查詢TPS則呈準線性增加。
在緩存資料庫的應用過程中,熱點數據管理粒度是一個非常關鍵的問題,粒度太大,達不到最佳的緩存效果;粒度太小,則耗費過多的系統資源。在多節點應用對緩存進行操作時,可能出現緩存失效引起性能急劇下降的問題,所以在應用平台上需要引入ZooKeeper等集群管理組件對多節點的緩存操作進行有效管理。
存儲介質層讀寫分離設計.....
存儲介質是數據的最終歸屬地,談及IT性能優化,存儲介質是個避不開的話題。由於固態硬碟(SSD)相對於機械硬碟有數百倍的性能提升,且每TB價格越來越接近機械硬碟,因此固態硬碟成為IT行業的香餑餑,幾乎每一個大型應用都需要考慮使用固態硬碟。
從讀寫分離的角度看,目前的應用主要基於SSD緩存,但大部分SSD緩存技術僅能實現讀緩存,如此高價值的SSD竟然沒能作為永久存儲使用,不得不說是一個遺憾。不過受戴爾易安信SC系列存儲系統「讀寫分離」技術的啟發,這個遺憾是完全能避免的。
細究該「讀寫分離」技術,其實現原理很容易理解。SSD分為寫密集型和讀密集型兩種,其中,寫密集型SSD的DWPD(Drive Writes per Day)通常大於10,遠高於讀密集型SSD,寫入壽命更長,而且寫入性能也高出讀密集型SSD數倍。
另外,各種RAID技術如下圖所示▼。
RAID 10的寫懲罰要優於RAID 5數倍,所以寫入性能也要高出不少。「讀寫分離」技術的實現原理就在於利用這兩方面的差異。
一方面,寫入操作時,重負載I/O寫操作基於RAID10的寫密集型SSD,另一方面,通過軟體調度,把寫密集型SSD上的數據在後台自動遷移到讀密集型SSD,並將RAID10在後台自動轉換成RAID5,從而使得讀操作主要由基於RAID5的讀密集型SSD承載。難能可貴的是這項技術不僅可以提高性能,也能兼顧到成本效益。
該技術已經被不少技術前瞻性較高的企業或組織採用。例如,華中某科技公司的郵件系統,郵箱數量上萬,系統改造前,I/O延時達到10毫秒左右,已經滿足不了企業對於員工體驗和工作效率的需求。
架構師對整套系統進行了分析,發現寫入操作佔比70%左右,由於RAID5方式的寫懲罰、寫入操作對存儲介質IOPS的消耗非常大,架構師嘗試將存儲改成RAID10的方式,但容量利用率又滿足不了企業的實際需求。
最後,架構師通過引入戴爾易安信SC存儲的讀寫分離技術進行優化,即採用寫密集型和讀密集型兩種SSD,並採用RAID10和RAID5兩種RAID方式動態組合,由存儲系統自動完成調度。最終,系統I/O延時下降到1毫秒以內,這次優化顯著提升了該公司郵件的收發效率。
總結
在「讀寫分離」設計思路的實際應用中,要根據不同應用系統的需求,將表示層、緩存層、資料庫層和存儲介質層部分結合使用,以補足薄弱環節。
從當前各行業對「讀寫分離」設計思路的應用來看,筆者觀察到互聯網行業走在最前面,政企、醫療、教育行業也都已經開始廣泛引入,相信「讀寫分離」架構設計思路會服務于越來越多的行業和用戶,進一步夯實IT系統這座摩天大樓的地基。
※Connect() 2018:微軟發布面向Visual Studio開發者的AI生產力工具
※平安云:釋放平安科技實力,為全行業賦能
TAG:至頂網 |