大規模網站架構
•PHP
–facebook,yahoo
•Java
–taobao,163
•Python
•.NET
–MySpace
語言不是可伸縮性的關鍵,架構纔是關鍵
網站架構的目標
•高可用性(High Availability)
•可伸縮性(Scalability)
•高性能(High Performance)
事務
傳統的事務(ACID)
•原子性(Atomicity)
•一致性(Consistency)
•隔離性(Isolation)
•持久性(Durability)
CAP原則
•Consistency 一致性
•Availability 可用性
•Partition Tolerance分區耐受性
•在任意時刻,只有兩項能同時成立
•不要浪費精力可能突破上面限制
新的事務策略-BASE策略
•避免分佈式事務
–基本可用(Basically Available)
–軟狀態(Soft state)
選擇最終一致(Eventually consistent
數據庫讀寫分離
MySQL Proxy(數據庫讀寫分離)
•load balancing
•failover
•query analysis
•R/W Splitting
數據庫Shard
•水平分區
•垂直分區
Sharding vs Partition
|
Sharding |
Partition |
存儲依賴 |
可跨越DB 可跨越物理機器 |
可跨越表空間,不同的物理屬性 不能跨DB存儲 |
存儲方式 |
分佈式 |
集中式 |
擴展性 |
Scale Out(橫向擴展,增加便宜設備) |
Scale Up(升級設備) |
可用性 |
無單點 |
存在單點(DB數據本身) |
價格 |
低廉 |
適中,甚至昂貴 |
應用場景 |
web 2.0網站 |
多數傳統應用 |
垂直分區
水平分區
DAL(數據訪問層)
•對應用透明的使用數據庫的水平分區及垂直分區
DAL Proxy(實現1)
DAL API(實現2)
兩種實現方式
•獨立的DAL Proxy服務器
–MySQL: Amoeba
–PostgreSQL: PL/Proxy (Skype)
•DAL API
–Java: Hibernate Shard,Ibatis Shard,HiveDB
–Python: Pyshards
shard改變數據庫設計
•儘量避免join
•數據冗餘/反範式
數據冗餘 for shard
•shard before
–comment(id,blog_id,content)
•shard after
–comment(id,blog_id,content,user_id)
數據分區策略
•水平分區
–2 * N(如定單,購買者與網店各一份)
–N / n (按日期或ID範圍分區)
–hash(N) % n( 按hash分)
–查找表
•垂直分區
–按功能分(論壇,博客)
消息隊列(MessageQueue)
•程序解耦
•隔離
•消息的可靠傳輸(物理存儲中轉消息)
消息總線
應用場景
•耗時操作
–郵件發送/短消息發送
•日誌
•程序解耦(A掛了,但B繼續可以使用)
MQ產品
•開源
–RabbitMQ(Erlang)
–ActiveMQ(JAVA)
•商業
–IBM MQ
–WebLogic MQ
回顧CAP及BASE
負載均衡
•DNS負載均衡
•反向代理負載均衡
•直接路由
•......
failover
DNS負載均衡
•簡單
•缺少靈活性(DNS緩存)
反向代理負載均衡
–nginx
–HAProxy
–apache httpd
–LVS(網絡第四層工作)
–F5(硬件,四層/七層)
Linux Virtual Server(LVS)
網絡地址轉換(NAT):VS-NAT
IP隧道方式:VS-TUN
直接路由方式:VS-DR
其它工作模式
•Virtual Server via NAT(VS-NAT)
–用地址翻譯實現虛擬服務器。地址轉換器有能被外界訪問到的合法IP地址,它修改來自專有網絡的流出包的地址。外界看起來包是來自地址轉換器本身,當外界包送到轉換器時,它能判斷出應該將包送到內部網的哪個節點。優點是節省IP 地址,能對內部進行僞裝;缺點是效率低,因爲返回給請求方的流量經過轉換器。
•Virtual Server via IP Tunneling (VS-TUN)
–用IP隧道技術實現虛擬服務器。這種方式是在集羣的節點不在同一個網段時可用的轉發機制,是將IP包封裝在其他網絡流量中的方法。爲了安全的考慮,應該使用隧道技術中的VPN,也可使用租用專線。 集羣所能提供的服務是基於TCP/IP的Web服務、Mail服務、News服務、DNS服務、Proxy服務器等等.
•Virtual Server via Direct Routing(VS-DR)
–用直接路由技術實現虛擬服務器。當參與集羣的計算機和作爲控制管理的計算機在同一個網段時可以用此法,控制管理的計算機接收到請求包時直接送到參與集羣的節點。優點是返回給客戶的流量不經過控制主機,速度快開銷少。
高可用性
•使用雙機熱備
•故障時切換至備份機
•工具(Linux-HA)
–heartbeat
緩存
•讓數據更靠近用戶
本地緩存
•節點有狀態,狀態更新需要同步至其它服務器
–可以使用組播方式通知數據改變
–需要通知的服務器過多會存在性能問題
•比遠程緩存更高性能
•慎用,不具備可伸縮性
Share Nothing Architecture
•無共享架構
•數據緩存(memchched)
•動態內容緩存
•瀏覽器緩存
•分佈式memchched
•基本滿足大部分性能要求
動態內容緩存
•頁面片段緩存
•靜態化內容
反向代理緩存
•squid 巨無霸
•Varnish
靜態資源分離
•img,js,css使用單獨的服務器處理請求
現實網站圖片存儲分析
•圖片服務器的域名不同
•多臺機器保存相同的圖片(img3,img2子域名)
•同一頁面不同圖片隨機生成不同的子域名進行負載均衡
•CDN ?
Content Delivery Network
瀏覽器優化
•節省帶寬:js,css的靜態gzip壓縮
–http header: Content-Encoding: gzip
•瀏覽器緩存
–http header: Etag,Last-Modified
•小圖片,css,js合併
js混淆工具
•JSA(推薦)
–js壓縮
–多個js合併爲一個
–可以與ant集成
Session
•cookie(強烈推薦)
•集中式session memcached(推薦)
•session複製(過多服務器複製存在性能問題)
分佈式文件系統
•MogileFS
–Automatic file replication
–No single point of failure
自動化
總結
•CAP原則
•BASE策略
•異步(MessageQueue)
•數據庫
• 數據的水平切分及垂直切分
• 數據庫讀寫分離
• 避免分佈式事務
• 反範式的數據庫設計
•負載均衡
• DNS負載均衡
• 反向代理負載均衡
• LVS
•緩存
• 數據庫緩存
• 服務器緩存/頁面緩存/數據緩存/靜態化
• 反向代理緩存
•Session/Share Nothing Architecture架構
•瀏覽器優化
• 瀏覽器緩存/CDN/小圖片合併
•分佈式文件系統(MogileFS)