有一天,我突發奇想建立了一個站點,基於 LNMP 架構,起初只有我本身訪問,後來由於我點兒正,訪問量愈來愈大,因此最終致使下面的架構演變。php
單臺機器由於只是一個小站,訪問量一天也沒有多少uv(100之內),因此用一臺1核1g的機器足夠了。機器上安裝的是 CentOS 系統,而後搭建了 nginx+php-fpm+mysql 的環境。html
訪問量愈來愈大,日uv突破5000,單臺機器不夠了,本能夠增長機器配置編程4核8G,可是考慮到還要換機器,因此直接添置一臺 DB 服務器單獨跑 MySQL服務。原來的服務器只須要跑 nginx+php-fpm,新加服務器跑 MySQL 服務。 在這裏,每每會遇到一個問題,就是如何在多臺機器上編譯安裝 LAMP 環境,在單臺機器上編譯都沒有問題,PHP 放在最後,由於它依賴 MySQL,但咱們這裏須要把 MySQL 放到另外一臺機器,因此編譯確定會報錯。解決這個問題,其實很簡單,即便 WEB 上不須要 MySQL,咱們也要安裝一下,由於編譯 PHP 的時候依賴它。前端
訪問量持續增長,uv上w了,DB 服務器和 WEB 服務器壓力愈來愈大,這時候咱們須要加一個緩存來緩解 DB 服務器的壓力。一樣是兩臺機器,只不過 WEB機器配置須要升級了,原來的1核1g不夠用了,不只要加 cpu 還要加內存,由於在 WEB 上咱們須要運行 memcached 服務,同時 php 也須要安裝memcache 擴展。mysql
訪問量又擴大了,uv到了5w,數據庫服務器由於一開始配置就挺高,因此沒有壓力,可是 WEB 服務器負載有點高了,在高峯期能夠感受到網站訪問變慢。因此,這時候不得不考慮要加一臺 WEB 服務器。另外,數據庫是單點,若是磁盤損壞,可能會帶來意想不到的後果,因此咱們有必要加一臺從 DB 服務器,做爲數據的備份。nginx
在這裏,兩臺 WEB 服務器咱們並無作負載均衡,由於爲了節省資源,暫時先不去購買服務器作負載均衡,咱們使用 DNS 輪詢的方法來把用戶的請求發到兩臺機器上,但這種該架構有個問題,一旦一臺 WEB 機器宕機,將會有一半的用戶訪問不到業務。還有一個問題,咱們也須要考慮到,如何保證 WEB 服務器上的數據一致,好比用戶可能會上傳圖片到 WEB 服務器上,假如他上傳到了 WEB1 上,那 WEB2 是不存在這個圖片的。因此咱們須要作一個共享存儲讓 WEB1 和 WEB2 同時能夠訪問,因此在這裏我把 WEB1 的一個目錄使用 NFS 共享出來,讓 WEB2 去掛載。還有一個問題就是memcached服務如何分配,在這裏,我是把 memcaced 服務分別安裝到兩臺 WEB 上的,本身用本身的 memcached 服務。redis
訪問量持續上升,uv 已經到了數十萬。網站在高峯期老是會卡頓那麼一段時間。經排查,發如今 MySQL 服務器上有不少慢查詢,通過各類調優依然沒有太明顯效果,最後決定作讀寫分離。sql
作讀寫分離有兩種方案,第一能夠藉助程序來實現,把全部的寫操做指向到主 MySQL ,全部的讀操做指向到從 MySQL。對於這種方案,機器數量和環境不用作任何調整,惟一要作的是程序代碼要改一下。第二能夠藉助 mysql-proxy 來實現,不用修改代碼,節省開發成本,但須要增長一個角色。架構是這樣的。數據庫
兩臺 WEB 服務器由於有一臺比較老,因此在高峯期時,終究是沒有能扛住而掛掉。結果影響了一半的用戶訪問不到網站了。通過這次事故,我不得不修改架構,儘可能避免單點,因而在 WEB 前端設置了負載均衡器,而且作了高可用。編程
在這裏我拿 nginx 作了負載均衡器,並無使用 lvs,由於我以爲 nginx 更容易操做,更好控制。爲了節省成本,我並無單獨把 mysql-proxy 摘出來做爲獨立服務器,由於那樣的話,也得爲它考慮單點問題。在這個架構中,其實還有一個缺陷,就是 NFS 服務端也是有風險的,更加保險的作法是單獨搞一臺服務器作NFS服務。緩存
uv上升到100w,兩臺 WEB 服務器明顯不夠用了,而瓶頸並不在 MySQL 上。因此,只增長 WEB,同時把 NFS 服務器單獨摘出來,並作一個備用 NFS 服務器。
uv近1000w,三臺 WEB 服務器也早已不夠,增長到5臺,而 MySQL 服務器壓力逐漸變大,針對 MySQL 的慢查詢,發現壓力主要體如今個別 SQL 語句上,該優化的已經優化到極致,對於這幾個查詢,實際上是可使用 NoSQL 的。因而,我找懂php開發的朋友幫我修改了程序,把一些訪問量大的數據存儲到redis,從而減小了對 MySQL 服務器的壓力。 而 Redis 爲了防止單點也作了主從。