前幾天跟一個朋友聊了一些關於網站緩存分佈式的一些東西,發現本身的知識仍是太過貧瘠。理論+協議,這是如今我亟待增強的。這個週末買了兩本關於分佈式網站的書,本着好記性不如爛筆頭,便有了這樣一系列的文章。但願一同分享,也請多指教。程序員
code less, play more!web
這個世界上沒有哪一個網站從誕生起就是大型網站;也沒有哪一個網站第一次發佈的時候就擁有龐大的用戶,高併發的訪問,海量的數據;大型網站都是從小型網站發展而來。網站的價值在於它能給用戶提供什麼家宅,在於網站能作什麼,而不在於它是怎麼作的,因此網站在小的時候就去追求網站的架構是捨本逐末,得不償失的。小型網站最須要作的就是爲用戶提供更好的服務來創造價值,獲得用戶承認,活下去,野蠻生長。數據庫
最開始沒有多少人訪問,因此應用程序,數據庫,文件都在同一臺機器上。緩存
應用服務器和數據服務分離安全
應用和數據分離以後,通常須要三臺服務器。應用服務器,文件服務器和數據庫服務器,這三種服務器對於硬件要求各不相同。服務器
使用緩存改善性能網絡
網站的訪問也遵循二八定律:80%的業務集中在20%的數據上。所以能夠把這一小部分數據緩存在內存中,減小數據庫的訪問壓力。架構
網站的緩存能夠分爲兩種:併發
當一臺服務器的處理能力和存儲空間不足的時候,不要企圖更換更強大的服務器。對於大型網站來講,無論多麼強大的服務器,都知足不了網站持續增加的業務需求。此時就能夠考慮集羣的方式,經過負載均衡調度服務器,能夠未來自用戶的請求分發到應用服務器集羣中的任何一臺服務器上。負載均衡
使用緩存後,大部分的數據讀操做訪問均可以不經過數據庫完成,可是仍有部分讀操做(如緩存過時,緩存不命中)和所有的寫操做須要訪問數據庫。
目前大部分數據庫都提供主從熱備的功能,在寫數據的時候,訪問主庫,主庫經過主從複製機制將數據更新同步至從數據庫,在讀的時候就能夠經過從數據庫獲取數據。
使用反向代理和CDN加速網站響應
在《web性能權威指南》中有講到,網站性能的瓶頸,大部分時間都浪費在TCP的握手和傳輸上。所以能夠經過CDN和反向代理的方式來加快響應。
CDN和反向代理的本質都是經過緩存,不一樣的主要是:
隨着業務的發展,依舊不能知足的時候,就採用分佈式的文件和分佈式的數據庫系統。
分佈式數據庫是數據庫拆分的最後手段,只用在單表數據規模特別龐大的時候才使用。更經常使用的拆分手段是業務分庫,將不一樣的業務數據存儲在不一樣的數據庫中。
對數據檢索和存儲愈來愈複雜的時候,就能夠採用一些非關係型數據庫如HBase和非數據庫查詢技術如ElasticSearch等等
業務場景複雜的時候,通常講整個網站業務分爲不一樣的產品線,如首頁,訂單,買家,賣家等等。
技術上也會根據產品線劃分,將一個網站分爲許多不一樣的應用,每一個應用獨立部署維護,應用之間能夠經過一個超連接創建聯繫,也能夠經過消息隊列進行數據分發,固然最多的仍是經過訪問同一個數據存儲系統來構成一個關聯的完整系統。
隨着業務越拆越小,存儲愈來愈大,維護愈來愈困難。此時就能夠將相同業務操做的提取出來,獨立部署。應用系統只須要管理用戶界面,經過分佈式服務調用共同的業務服務完成具體的業務操做。也就是最近概念愈來愈火的——微服務。
大型網站架構解決了海量數據庫管理和高併發事務處理,能夠將這些解決方案應用到網站自身之外的業務上。如今像阿里雲,亞馬遜等雲計算平臺,將計算做爲一種基礎資源出售,中小網站不須要關係技術架構等問題,只須要按需付費,就可使網站隨着業務的增加得到更大的存儲和計算資源。
將來還能變成什麼樣子,我也不清楚,也許之後都不是開發人員來維護了,全部的這些都是AI來完成,程序員要作的就是如何完善AI。也許AI發展到最後,人類都不須要存在了吧。
網站的技術是爲業務而存在的,除此之外毫無心義。在技術選型和架構設計中,脫離業務發展實際,一味的追求新技術,可能會把技術發展引入一個歪路。
技術是用來解決業務的問題,而技術不可能將全部問題都解決掉,涉及業務自身的問題,仍是要經過業務手段去解決。