網站Web業務架構從小到大演變

來源:互聯網
上載者:User

標籤:避免   span   memcache   http   mysq   分享   讀寫分離   方法   帶來   

有一天,我突發奇想建立了一個網站,基於 LNMP 架構,起初只有我自己訪問,後來因為我點兒正,訪問量越來越大,所以最終導致下面的架構演變。

1、單台機器

單台機器因為只是一個小站,訪問量一天也沒有多少uv(100以內),所以用一台1核1g的機器足夠了。機器上安裝的是 CentOS 系統,然後搭建了 nginx+php-fpm+mysql 的環境。

2、一台變兩台

訪問量越來越大,日uv突破5000,單台機器不夠了,本可以增加機器配置編程4核8G,但是考慮到還要換機器,所以直接添置一台 DB 伺服器單獨跑 MySQL服務。原來的伺服器只需要跑 nginx+php-fpm,新加伺服器跑 MySQL 服務。 在這裡,往往會遇到一個問題,就是如何在多台機器上編譯安裝 LAMP 環境,在單台機器上編譯都沒有問題,PHP 放在最後,因為它依賴 MySQL,但我們這裡需要把 MySQL 放到另一台機器,所以編譯肯定會報錯。解決這個問題,其實很簡單,即使 WEB 上不需要 MySQL,我們也要安裝一下,因為編譯 PHP 的時候依賴它。

3、增加memcached

訪問量持續增加,uv上w了,DB 伺服器和 WEB 伺服器壓力越來越大,這時候我們需要加一個緩衝來緩解 DB 伺服器的壓力。同樣是兩台機器,只不過 WEB機器配置需要升級了,原來的1核1g不夠用了,不僅要加 cpu 還要加記憶體,因為在 WEB 上我們需要運行 memcached 服務,同時 php 也需要安裝memcache 擴充。

4、增加WEB並做MySQL主從

訪問量又擴大了,uv到了5w,資料庫伺服器因為一開始配置就挺高,所以沒有壓力,但是 WEB 伺服器負載有點高了,在高峰期可以感覺到網站訪問變慢。所以,這時候不得不考慮要加一台 WEB 伺服器。另外,資料庫是單點,如果磁碟損壞,可能會帶來意想不到的後果,所以我們有必要加一台從 DB 伺服器,作為資料的備份。

在這裡,兩台 WEB 伺服器我們並沒有做負載平衡,因為為了節省資源,暫時先不去購買伺服器做負載平衡,我們使用 DNS 輪詢的方法來把使用者的請求發到兩台機器上,但這種該架構有個問題,一旦一台 WEB 機器宕機,將會有一半的使用者訪問不到業務。還有一個問題,我們也需要考慮到,如何保證 WEB 伺服器上的資料一致,比如使用者可能會上傳圖片到 WEB 伺服器上,假如他上傳到了 WEB1 上,那 WEB2 是不存在這個圖片的。所以我們需要做一個共用儲存讓 WEB1 和 WEB2 同時可以訪問,所以在這裡我把 WEB1 的一個目錄使用 NFS 共用出來,讓 WEB2 去掛載。還有一個問題就是memcached服務如何分配,在這裡,我是把 memcaced 服務分別安裝到兩台 WEB 上的,自己用自己的 memcached 服務。

5、MySQL讀寫分離

訪問量持續上升,uv 已經到了數十萬。網站在高峰期總是會卡頓那麼一段時間。經排查,發現在 MySQL 伺服器上有很多慢查詢,經過各種調優依然沒有太明顯效果,最後決定做讀寫分離。

做讀寫分離有兩種方案,第一可以藉助程式來實現,把所有的寫操作指向到主 MySQL ,所有的讀操作指向到從 MySQL。對於這種方案,機器數量和環境不用做任何調整,唯一要做的是程式碼要改一下。第二可以藉助 mysql-proxy 來實現,不用修改代碼,節省開發成本,但需要增加一個角色。架構是這樣的。

6、避免單點引入負載平衡

兩台 WEB 伺服器因為有一台比較老,所以在高峰期時,終究是沒有能扛住而掛掉。結果影響了一半的使用者訪問不到網站了。經過此次事故,我不得不修改架構,盡量避免單點,於是在 WEB 前端設定了負載平衡器,並且做了高可用。

在這裡我拿 nginx 做了負載平衡器,並沒有使用 lvs,因為我覺得 nginx 更容易操作,更好控制。為了節省成本,我並沒有單獨把 mysql-proxy 摘出來作為獨立伺服器,因為那樣的話,也得為它考慮單點問題。在這個架構中,其實還有一個缺陷,就是 NFS 服務端也是有風險的,更加保險的做法是單獨搞一台伺服器做NFS服務。

7、繼續擴充

uv上升到100w,兩台 WEB 伺服器明顯不夠用了,而瓶頸並不在 MySQL 上。所以,只增加 WEB,同時把 NFS 伺服器單獨摘出來,並做一個備用 NFS 伺服器。

8、引入NoSQL

uv近1000w,三台 WEB 伺服器也早已不夠,增加到5台,而 MySQL 伺服器壓力逐漸層大,針對 MySQL 的慢查詢,發現壓力主要體現在個別 SQL 陳述式上,該最佳化的已經最佳化到極致,對於這幾個查詢,其實是可以使用 NoSQL 的。於是,我找懂php開發的朋友幫我修改了程式,把一些訪問量大的資料存放區到redis,從而減少了對 MySQL 伺服器的壓力。 而 Redis 為了防止單點也做了主從。

9、MySQL架構演變

http://www.cnblogs.com/liwei0526vip/p/6424605.html

 

網站Web業務架構從小到大演變

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.