天天看點

建構高并發網站-網站架構(架構優化)

一、網站架構的角色

1、基本架構

建構高并發網站-網站架構(架構優化)

2、網站架構更新,使用者通路速度提高,提高使用者體驗

CDN 解決南電信北聯通網站通路慢問題,通過代理CDN緩存功能

代理實作負載均衡功能

web伺服器存放音樂、圖檔、視訊等存儲無限擴大

緩存解決資料庫讀寫大、IO高,負載高,伺服器慢問題,否則成為網站的瓶頸

建構高并發網站-網站架構(架構優化)

3、網站的web伺服器角色介紹

web (IIS, Apache, Nginx+php-fpm, Tomcat+jdk(jsp), Nginx+uwsgi+python(豆瓣)等)

資料庫db (MySQL/MariDB, PostgreSQL, Oracle, 非關系型資料庫MongoDB)

緩存 (Memcached, Redis)

代理 (Varnish, Squid, Nginx)

CDN (騰訊雲、阿裡雲、up雲)就是帶有緩存的代理,智能DNS解析,上海和北京的使用者ping 域名解析IP是不同。

參考:http://www.wtoutiao.com/p/1f9wWEw.html

存儲 (GFS, FastdFS, HDFS, TFS, GlusterFS等)

參考 http://www.apelearn.com/bbs/thread-7734-1-1.html

叢集 (keepalived+lvs, heartbeat+nginx, haproxy, mysql-proxy)

4、阿裡CND架構圖

建構高并發網站-網站架構(架構優化)

5、分布式檔案系統

防止其中一台機器當機導緻資料丢失

建構高并發網站-網站架構(架構優化)

6、網站架構角色

建構高并發網站-網站架構(架構優化)
建構高并發網站-網站架構(架構優化)
建構高并發網站-網站架構(架構優化)
建構高并發網站-網站架構(架構優化)

Mysql-Proxy實作讀寫分離

二、中大型網站架構演變過程

參考:

http://www.apelearn.com/bbs/thread-8644-1-1.html

http://www.jianshu.com/p/f8e968e57863

http://blog.jobbole.com/87736/

http://blog.jobbole.com/87737/

假設一個網站(discuz)從最開始通路量很小做到日pv千萬,我們來推測一下它的mysql伺服器架構演變過程。

第一階段

網站通路量日pv量級在1w以下。單台機器跑web和db,不需要做架構層調優(比如,不需要增加memcached緩存)。此時,資料往往都是每日冷備份的,但有時候如果考慮資料安全性,會搭建一個mysql主從。

建構高并發網站-網站架構(架構優化)

第二階段

網站通路量日pv達到幾萬。此時單台機器已經有點負載,需要我們把web和db分開,需要搭建memcached服務作為緩存。也就是說,在這個階段,我們還可以使用單台機器跑mysql去承擔整個網站的資料存儲和查詢。如果做mysql主從,目的也是為了資料安全性。

建構高并發網站-網站架構(架構優化)

第三階段

網站通路量日pv達到幾十萬。單台機器雖然也可以支撐,但是需要的機器配置要比之前的機器好很多。如果經費允許,可以購買配置很高的機器來跑mysql服務,但是并不是說,配置翻倍,性能也翻倍,到了一定階段配置增加已經不能帶來性能的增加。是以,此階段,我們會想到做mysql服務的叢集,也就是說我們可以拿多台機器跑mysql。但,mysql的叢集和web叢集是不一樣的,我們需要考慮資料的一緻性,是以不能簡單套用做web叢集的方式(lvs,nginx代理)。可以做的架構是,mysql主從,一主多從。為了保證架構的健壯和資料完整,主隻能是一個,從可以是多個,注意:不允許在從上寫,從隻能允許讀。

還有一個問題,我們需要想到,就是在前端web層,我們的程式裡面指定了mysql機器的ip,那麼當mysql機器有多台時,程式裡面如何去配置?discuz,其實有一個功能,支援mysql讀寫分離。即,我們可以拿多台機器跑mysql,其中一台寫,其他多台是讀,我們隻需要把讀和寫的ip分别配置到程式中,程式自動會去區分機器。當然,如果不使用discuz自帶的配置,我們還可以引用一個軟體叫做 mysql-proxy, 使用他來實作讀寫分離。它支援一主多從的模式。

建構高并發網站-網站架構(架構優化)

第四階段

用mencached做緩存,mysql資料存在磁盤中,memcache的資料儲存在記憶體中,這樣可以加速使用者通路的常用的一些資料。

建構高并發網站-網站架構(架構優化)

網站通路量日pv到幾百萬。之前的一主多從模式已經遇到瓶頸,因為當網站通路量變大,讀資料庫的量也會越來越大,我們需要多加一些從進來,但是從的數量增加到數十台時,由于主需要把bin-log全部分發到所有從上,那麼這個過程本身就是一件很繁瑣的事情,再加上頻繁讀取,勢必會造成從上同步過來的資料有很大延遲。是以,我們可以做一個優化,把mysql原來的一主多從變為一主一從,然後從作為其他從的主,而前面的主隻負責網站業務的寫入,而後面的從不負責網站任何業務,隻負責給其他從同步bin-log。這樣還可以繼續多疊加幾個從庫。

當通路量很大,nfs依賴的網絡是瓶頸了,買一個商業的SAN,做共享,或者使用分布式檔案存儲也可以。

建構高并發網站-網站架構(架構優化)

第五階段

網站通路量日pv到1千萬的時候,我們發現,網站的寫入量非常大,我們之前架構中隻有一個主,這裡的主已經成為瓶頸了。是以,需要再近一步做出調整。比如,我們可以把業務分子產品,把使用者相關的單獨分離出來,把權限、積分等也可以分離出來單獨跑一個庫,然後再做主從,也就是所謂的分庫。當然也可以換一個緯度,把通路量或者寫入量大的表單獨分離出來,跑在一台伺服器上,也可以把一個表分成多個小表。這一步操作,涉及到一些程式上的改動,是以需要事先和開發同僚做好溝通和設計。總之,這一步要做的就是分庫分表。

建構高并發網站-網站架構(架構優化)

再往後發展,繼續把大表分小表即可。 而國内阿裡淘寶網站的資料量是巨量的,他們的資料庫全部都是mysql,他們的mysql架構就是遵循分庫分表這個原則的,隻不過他們劃分規則會有很多緯度,比如可以根據地域劃分,可以根據買家、賣家劃分,可以根據時間劃分等等。

建構高并發網站-網站架構(架構優化)

緩存的叢集

magent實作memcached叢集,參考:http://www.cnblogs.com/luotianshuai/p/5088581.html

建構高并發網站-網站架構(架構優化)

codis實作redis叢集,參考:http://www.jianshu.com/p/f8e968e57863

建構高并發網站-網站架構(架構優化)

繼續閱讀