-- 摘要
本文以智慧葯房項目為例,主要論述了可靠性技術在項目中的具體應用, 通過將平台服務層進行集群化部署,數據庫分布式主從模式,以及服務器RAID磁盤陣列,對平台服務層、數據庫以及硬件存儲多維度的容錯、容災機制,提高了項目件硬件的可用性,安全性和可擴展性。通過可靠性技術的應用,提供了軟件運行的質量,保障一軟件能夠7*24小時的穩定運行,最終項目成功上線,並獲得了用戶的一致好評
-- 背景(所有論文同一個項目)
軟件可靠性設計主要通過冗余、心跳等技術對軟件進行可靠性的設計,確保軟件的穩定運行。冗余可以從硬件、軟件兩個方面着手,硬件可以使用多台服務器做容災處理,大型項目會應用異地部署服務器的方式,防止因服務器故障、斷網、斷電或地震等不可抗拒的自然災害造成服務不可用,給企業和用戶造成損失,軟件層面可以使用多應用部署群集,確保在一個應用出現異常時,可以繼續工作。同時應用負載均衡,CDN等技術進行用戶請求分流,保證用戶訪問性能的同時,對應用進行減壓,數據庫一般可以采用主從復制的方式部署。
--簡介--中間過度作用
本文以智慧葯房項目為例,將從集群化部署、數據庫主從、軟件冗余部署方面論述了可靠性架構設計在項目中的應用。
--介紹三種的應用
集群化部署:項目為了防止一台服務器出現故障,導致應用系統不可用,采用了多服務器冗余方式,以N+1的標准選了三台服務器做冗余,並且對服務器磁盤做了RAID5陣列,項目采用前后端分離的方式,前台采用Vue.js,后端平台服務采用的Java語言開發,前端Web應用系統分別在服務器上部署了三個節點,並且通過使用Nginx做反向代理,使得應用不直接對外暴露,提高了安全性,同時配置了集群模式,將用戶請求進行分流,提交了系統的可靠性同時也提高了性能,平台服務層以Docker的方式進行發布,並且通過K8S進行管理,同時引入了SkyWalking對接口鏈路進行監控,並且通過Spring Admin 對服務節點進行監控,一旦鏈路應用節點發生故障,立馬發送郵件給運維人員,讓其及時干預,Java服務采用SpringCloud做微服務架構,通過 Nacos 進行服務注冊與發現,通過網關將服務暴露給前端Web層調用。
數據庫主從:項目中數據層采用了關系型數據庫MySQL,以及NoSQL 非關系型 MongoDB同進為了減輕數據庫的壓力,引入了Redis緩存。MySQL主要存放一些業務數據,如醫生開出的處方數據,以及葯品目錄,ymtlwyth以及采購訂單,配送入庫單等,這些數據的特點是使用頻率不同,但極其重要,采用了主從復制的方式對MySQL進行了冗余,在Redis中使用了哨兵主從進行三個節點部署,當Master發生故障時,哨兵從新選出一個主節點,Redis主要存放葯品庫存信息,在醫生開處方時會檢查葯房葯品庫存信息,葯房將葯品發現時會扣除相應的庫存,對同一個葯品的數量變化頻率相當高,而且要及時,否則醫生將葯開出來后,患者到葯房取葯時,取不到葯,增加醫患矛盾,,影響醫生開處方的效率及數據一致性及庫存及時性。因此引入了Redis緩存,在審方模塊中18萬種葯品的相互作用關系數據量以迪卡爾積的量級存在,因些采用了適合處理大數據的MongoDB,MongoDB在配置文件中同樣做了主從方式。
程序容錯設計:程序設計及開發中需要考慮容錯機制,否則出現錯誤后可能導致不可用的情況發生,首選在獲取對象屬性時,要做異常判斷,我們采用了阿里的Java契約插件,可以描述出一些可能出現異常的代碼,實現方式,加入了 try catch 異常處理機制,對於數據訪問層,通過Spring Data中的Redis Template 以及 MongoDB 的 Template 進行主從連接配置,對於MySQL采用 MyCat 進行讀寫分離,在主節點發生故障時,能自動識別新的主節點。微服務開發新業務升級時,不影響現有項目的運行。