《架構(gòu)學習之路——高可用高并發(fā)系統(tǒng)設(shè)計原則》要點:
本文介紹了架構(gòu)學習之路——高可用高并發(fā)系統(tǒng)設(shè)計原則,希望對您有用。如果有疑問,可以聯(lián)系我們。
本系列博客主要是學習開濤《億級流量網(wǎng)站架構(gòu)核心技術(shù)》一書學習筆記及自己的感悟:
架構(gòu)設(shè)計三大定律
墨菲定律 – 任何事沒有表面看起來那么簡單 – 所有的事都會比預(yù)計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發(fā)生,那么它就更有可能發(fā)生
康威定律 – 系統(tǒng)架構(gòu)師公司組織架構(gòu)的反映 – 按照業(yè)務(wù)閉環(huán)進行系統(tǒng)拆分/組織架構(gòu)劃分,實現(xiàn)閉環(huán)、高內(nèi)聚、低耦合,減少溝通成本 – 如果溝通出現(xiàn)問題,應(yīng)該考慮進行系統(tǒng)和組織架構(gòu)的調(diào)整 – 適合時機進行系統(tǒng)拆分,不要一開始就吧系統(tǒng)、服務(wù)拆分拆的非常細,雖然閉環(huán),但是每個人維護的系統(tǒng)多,維護成本高 – 微服務(wù)架構(gòu)的理論基礎(chǔ) – 康威定律 https://yq.aliyun.com/articles/8611 – 每個架構(gòu)師都應(yīng)該研究下康威定律 http://36kr.com/p/5042735.html
二八定律 – 80%的結(jié)果取決于20%的原因
系統(tǒng)設(shè)計遵循的原則
1高并發(fā)原則
無狀態(tài)
- 無狀態(tài)應(yīng)用,便于水平擴展
- 有狀態(tài)配置可通過配置中心實現(xiàn)無狀態(tài)
- 實踐: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
- 系統(tǒng)維度:按照系統(tǒng)功能、業(yè)務(wù)拆分,如購物車,結(jié)算,訂單等
- 功能維度:對系統(tǒng)功能在做細粒度拆分
- 讀寫維度:根據(jù)讀寫比例特征拆分;讀多,可考慮多級緩存;寫多,可考慮分庫分表
- AOP維度: 根據(jù)訪問特征,按照AOP進行拆分,比如商品詳情頁可分為CDN、頁面渲染系統(tǒng),CDN就是一個AOP系統(tǒng)
- 模塊維度:對整體代碼結(jié)構(gòu)劃分Web、Service、DAO
服務(wù)化
- 服務(wù)化演進: 進程內(nèi)服務(wù)-單機遠程服務(wù)-集群手動注冊服務(wù)-自動注冊和發(fā)現(xiàn)服務(wù)-服務(wù)的分組、隔離、路由-服務(wù)治理
- 考慮服務(wù)分組、隔離、限流、黑白名單、超時、重試機制、路由、故障補償?shù)?/li>
- 實踐:利用Nginx、HaProxy、LVS等實現(xiàn)負載均衡,ZooKeeper、Consul等實現(xiàn)自動注冊和發(fā)現(xiàn)服
消息隊列
- 目的: 服務(wù)解耦(一對多消費)、異步處理、流量削峰緩沖等
- 大流量緩沖: 犧牲強一致性,保證最終一致性(案例:庫存扣減,現(xiàn)在Redis中做扣減,記錄扣減日志,通過后臺進程將扣減日志應(yīng)用到DB)
- 數(shù)據(jù)校對: 解決異步消息機制下消息丟失問題
數(shù)據(jù)異構(gòu)
- 數(shù)據(jù)異構(gòu): 通過消息隊列機制接收數(shù)據(jù)變更,原子化存儲
- 數(shù)據(jù)閉環(huán): 屏蔽多從數(shù)據(jù)來源,將數(shù)據(jù)異構(gòu)存儲,形成閉環(huán)
緩存銀彈
- 用戶層:
- DNS緩存
- 瀏覽器DNS緩存
- 操作系統(tǒng)DNS緩存
- 本地DNS服務(wù)商緩存
- DNS服務(wù)器緩存
- 客戶端緩存
- 瀏覽器緩存(Expires、Cache-Control、Last-Modified、Etag)
- App客戶緩存(js/css/image…)
- 代理層:
- CDN緩存(一般基于ATS、Varnish、Nginx、Squid等構(gòu)建,邊緣節(jié)點-二級節(jié)點-中心節(jié)點-源站)
- 接入層:
- Opcache: 緩存PHP的Opcodes
- Proxy_cache: 代理緩存,可以存儲到/dev/shm或者SSD
- FastCGI Cache
- Nginx+Lua+Redis: 業(yè)務(wù)數(shù)據(jù)緩存
- Nginx為例:
- PHP為例:
- 應(yīng)用層:
- 頁面靜態(tài)化
- 業(yè)務(wù)數(shù)據(jù)緩存(Redis/Memcached/本地文件等)
- 消息隊列
- 數(shù)據(jù)層:
- NoSQL: Redis、Memcache、SSDB等
- MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
- 系統(tǒng)層:
- CPU : L1/L2/L3 Cache/NUMA
- 內(nèi)存
- 磁盤:磁盤本身緩存、dirtyratio/dirtybackground_ratio、陣列卡本身緩存
并發(fā)化
2高可用原則
降級
- 降級開關(guān)集中化管理:將開關(guān)配置信息推送到各個應(yīng)用
- 可降級的多級讀服務(wù):如服務(wù)調(diào)用降級為只讀本地緩存
- 開關(guān)前置化:如Nginx+lua(OpenResty)配置降級策略,引流流量;可基于此做灰度策略
- 業(yè)務(wù)降級:高并發(fā)下,保證核心功能,次要功能可由同步改為異步策略或屏蔽功能
限流
- 目的: 防止惡意請求攻擊或超出系統(tǒng)峰值
- 實踐:
- 惡意請求流量只訪問到Cache
- 穿透后端應(yīng)用的流量使用Nginx的limit處理
- 惡意IP使用Nginx Deny策略或者iptables拒絕
切流量
- 目的:屏蔽故障機器
- 實踐:
- DNS: 更改域名解析入口,如DNSPOD可以添加備用IP,正常IP故障時,會自主切換到備用地址;生效實踐較慢
- HttpDNS: 為了繞過運營商LocalDNS實現(xiàn)的精準流量調(diào)度
- LVS/HaProxy/Nginx: 摘除故障節(jié)點
可回滾
- 發(fā)布版本失敗時可隨時快速回退到上一個穩(wěn)定版本
3業(yè)務(wù)設(shè)計原則
- 防重設(shè)計
- 冪等設(shè)計
- 流程定義
- 狀態(tài)與狀態(tài)機
- 后臺系統(tǒng)操作可反饋
- 后臺系統(tǒng)審批化
- 文檔注釋
- 備份
4總結(jié)
先行規(guī)劃和設(shè)計時有必要的,要對現(xiàn)有問題有方案,對未來有預(yù)案;欠下的技術(shù)債,遲早都是要還的.
本文作者為網(wǎng)易高級運維工程師
文章來自微信公眾號:云技術(shù)實踐
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4251.html