<button id="hu96j"><acronym id="hu96j"></acronym></button><dd id="hu96j"><pre id="hu96j"></pre></dd>
        <video id="hu96j"><font id="hu96j"><th id="hu96j"></th></font></video>
          <nav id="hu96j"></nav>
        <tbody id="hu96j"><center id="hu96j"><video id="hu96j"></video></center></tbody>

      1. <dd id="hu96j"><track id="hu96j"></track></dd>

        <dd id="hu96j"></dd>
        <rp id="hu96j"><acronym id="hu96j"></acronym></rp>
      2. <button id="hu96j"></button>

        • 保存到桌面加入收藏設為首頁
        服務器技術

        百萬級訪問量網站的技術準備工作

        時間:2016-07-05 10:40:03   作者:老譚   來源:IDCSPED   閱讀:4341   評論:0
        內容摘要:當今從純網站技術上來說,因為開源模式的發展,現在建一個小網站已經很簡單也很便宜,所以很多人都把創業方向定位在互聯網應用。這些人里大多數不是很懂技術,或者不是那么精通,而網站開發維護方面的知識又很分散,學習成本太高,所以這篇文章將這些知識點結合起來,系統的h說,一個從日幾千訪問的小小網站,到日訪問一兩百萬的小網站,中間可...

        當今從純網站技術上來說,因為開源模式的發展,現在建一個小網站已經很簡單也很便宜,所以很多人都把創業方向定位在互聯網應用。這些人里大多數不是很懂技術,或者不是那么精通,而網站開發維護方面的知識又很分散,學習成本太高,所以這篇文章將這些知識點結合起來,系統的來說,一個從日幾千訪問的小小網站,到日訪問一兩百萬的小網站,中間可能會產生什么問題,以及怎么才能在一開始做足工作盡量避免這些問題。

        對于不同的初期投資成本,技術路線的選擇是不同的。這里假設網站剛剛只是一個構想,計劃第一年服務器硬件帶寬投入5萬左右。于這個資金額度,有很多種方案可選擇,例如租用虛擬主機、租用單獨服務器,或者流行的私有云,或者托管服務器。前兩種選擇,網站發展到一定規模時需遷移,那時再重做規劃顯然影響更大。服務器托管因為配置自主、能完全掌握控制權,所以有一定規模的網站基本都是這種模式。采自己托管服務器的網站,一開始要注意以下幾點。

        一、開發語言

        一般來說,技術人員(程序員)都是根據自己技術背景選擇自己最熟悉的語言,不過不可能永遠是一個人寫程序,所以在語言的選擇上還要是要費些心思。先明確一點,無論用什么語言,最終代碼質量是看管理,因此我們從前期開發成本分析?,F在國內流行的適用于網站的語言,大概有java、php、.net、 python、ruby這五大陣營。python和ruby因為在國內流行的比較晚,現在人員還是相對難招一些。.net平臺的人相對多,但是到后期需要決性能問題時,對人員技能的要求比較高。剩余的java、php用人可以說是最多的。java和php無法從語言層面做比較,但對于初期,應用幾乎都是靠前端支撐的網站來說,php入門簡單、編寫快速,優勢相對大一點。至于后端例如行為分析、銀行接口、異步消息處理等,等真正需要時,就要根據不同業務需求來選擇不同語言了。

        二、代碼版本管理

        稍微有點規模的網站就需要使用代碼版本管理了。代碼版本管理兩點最大的好處,一是方便協同工作,二是有歷史記錄可查詢比較。代碼版本管理軟件有很多,vss/cvs/svn/hg等,目前國內比較流行,其中svn的普及度還是很高的。

        向服務器部署代碼,可以手工部署也可以自動部署。手工部署相對簡單,一般可直接在服務器上svn update,或者找個新目錄svn checkout,再把web root給ln -s過去。應用越復雜,部署越復雜,沒有什么統一標準,只是別再用ftp上傳那種形式,一是上傳時文件引用不一致錯誤率增加,二是很容易出現開發人員的版本跟線上版本不一致,導致本來想改個錯字結果變成回滾。如果有多臺服務器還是建議自動部署,更換代碼的機器從當前服務池中臨時撤出,更新完畢后再重新加入。

        三、服務器硬件

        在各個機房里,靠一臺服務器孤獨支撐的網站數不清,但如果資金稍微充足,建議至少三臺的標準配置,分別用作web處理、數據庫、備份。web服務器至少要8G內存,雙sata raid1,如果經濟稍微寬松,或靜態文件或圖片多,則15k sas raid10。數據庫至少16G內存,15k sas raid 10。備份服務器最好跟數據庫服務器同等配置。硬件可以上整套品牌,也可以兼容機,也可以半品牌半組裝,取決于經濟能力。當然,這是典型的搭配,有些類型應用的性能瓶頸首先出現在web上,那種情況就要單獨分析了。

        web服務器可以既跑程序又當內存緩1,數據庫服務器則只跑主數據庫(假如是MySQL的話),備份服務器所承擔就相對多一些,web配置、緩存配置、數據庫配置都要跟前兩臺一致,這樣WEB和數據庫任意一臺出問題,很容易就可以將備份服務器切換過去臨時頂替,直到解決完問題。要注意,硬件是隨時可能壞掉的,特別是硬盤,所以寧可WEB服務器跟數據庫服務器放在一起,也一定不能省掉備份,備份一定要異機,并且有異步,電力故障、誤操作都可能導致一臺機器上的所有數據丟失。很多的開源備份方案可選擇,最簡單的就是rsync,寫crontab里,定時同步。備份和切換,建議多做測試,選最安全最適合業務的,并且盡可能異地備份。

        四、機房

        三種機房盡量不要選:聯通訪問特別慢的電信機房、電信訪問特別慢的聯通機房、電信聯通訪問特別慢的移動或鐵通機房。機房要盡可能多的實地參觀,多測試,找個網絡質量好,管理嚴格的機房。機房可以說穹淺V匾,直接關系到網站訪問速度,網站訪問速度直接關系到用戶體驗,訪問速度很慢的網站,很難獲得用戶青睞。

        五、架構

        在大方向上,被熟知的架構是web負載均衡+數據庫主從+緩存+分布式存儲+隊列。在一開始,按照可擴展的原則設計和編程就可以。只是要多考慮緩存失效時的雪崩效應、主從同步的數據一致性和時間差、隊列的穩定性和失敗后的重試策略、文件存儲的效率和備份方式等等意外情況。緩存失效、數據庫復制中斷、隊列寫入錯誤、電源損壞,在實際運維中經常發生,如果不注意這些,出現問題時恢復期可能會喑鱸て諍艸な奔洹

        六、服務器軟件

        操作系統Linux很流行。在沒有專業運維人員的情況下,應傾向于擇使用的人多、社區活躍、配置方便、升級方便的發行版,例如RH系列、 debian、ubuntu server等,硬件和操作系統要一起選擇,看是否有適合的驅動,如果確定用某種商業軟件或解決方案,也要提前知曉其對哪種操作系統支持最佳。web服務器方面,apache、nginx、lighttpd三大系列中,apache占有量還是最大,但是想把性能調教好還是需要很專業的,nginx和 lighttpd在不需要太多調整的情況下可以達到一個比較不錯的性能。穆堊≡袷裁慈砑,除非改過這些軟件或你的程序真的不兼容新版本,否則盡量版本越新越好,版本新,意味著新特性增多、BUG減少、性能增加。一個典型的php網站,基本上大多數人都沒改過任何服務器軟件源代碼,絕大多數情況是能平穩的升級到新版本的。類似于jdk5到 jdk6,python2膒ython3這類變動比較大的升級還是比較少見的??纯碈hangeLog,看看升級說明,結合自己情況評估測試一下,越早升級越好,升級的越晚,所花費的成本越高。對于軟件包,盡量使用發行版內置的包管理工具,沒有特殊要求時不建議自己編譯,那樣對將來運維不利。

        七、數據庫

        幾乎所有操作最后都要落到數據庫身上,它又最難擴展(存儲也挺難)。數據庫常見的擴展方法有復制、分片,設計時要考慮到每種應用的數據如何復制、分片,當然這種考慮一般會推遲到技術設計時期。在初期進行數據庫結構設計時,要根據不同的業務類型和增長量預期來考慮是否要分庫、分區,并且盡量不要使用聯合查詢、不使用自增ID以方便分片。復制延時問題、主從數據庫數據一致性問題,可以自己寫或者用已有的運維工具進行檢測。

        用存儲過程是比較難擴展的,這種情形多發生于傳統C/S,特別是OA系統轉換過來的開發人員。低成本網站不是一兩臺小型機跑一個數據庫處理所有業務的模式,是機海作戰。方便水平擴展比那點預分析時間和網絡傳輸流量要重要的多的多。

        另外,現在流行一種概念叫NoSQL,可以理解為非傳統關系型數據庫。實際應用中,網站有著越來越多的密集寫操作、上億的簡單關系數據讀取、熱備等,這都不是傳統關系數據庫所擅長的,于是就產生了很多非關系型數據庫,比如Redis/TC&TT/MongoDB/Memcachedb等,在測試中,這些幾乎都達到了每秒至少一萬次的寫操作,內存型的甚至5萬以上。在設計時,可根據業務特點和性能要求來選擇是否使用這類數據庫。例如 MongoDB,幾句配置就可以組建一個復制+自動分片+failover的環境,文檔化的存儲也簡化了傳統設計庫結構再開發的模式。但是當你決定采用一項技術時,一定要真正了解其優劣,例如可能你所選擇的技術并不能支持你所需要的事務和數據一致性要求。

        八、文件存儲

        存儲的分布幾乎跟數據庫擴展一樣困難,不過只有百萬的PV的情況下,磁盤IO方面一般不會成大問題,一兩臺采用SATA做條帶RAID的機器可以應付,反而是自己做異步備份比較復雜,因為小文件多。如果只有一臺機器做存儲,可以做簡單的優化,例如放最小縮略圖的分區和放中等縮略圖的分區,根據平均大小調整一下塊大小。存儲要規劃好目錄結構,否則文件增多后維護起來復雜,也不利于擴展。同時還要考慮將來擴容,例如采用LVM,或者把文件根據不同規則散列到不同機器。磁盤IO繁重的情況下更容易出現故障,所以要做好備份,若發現有盤壞掉,要馬上行動更換,很多人的硬盤都是壞了一塊之后,接二連三的壞下去。

        為了將來圖片走cdn做準備,一開始最好就將圖片的域名分開,且不用主域名。因為很多網站都將cookie設置到了.domain.ltd,如果圖片也在這個域名下,很可能因為cookie而造成荽媸效,并且占多余流量,還可能因為瀏覽器并發線程限制造成訪問緩慢。

        九、程序

        一定硬件條件下,應用能承載多少訪問量,很大一部分也取決于程序如何寫。程序寫的不好,可能一萬的訪問都承載不了,寫的好,可能一兩臺機器就能承擔幾百軵V。越是復雜、數據實時性要求越高的應用,優化起來越難,但對普通網站有一個統一的思路,就是盡量向前端優化、減少數據庫操作、減少磁盤IO。向前端優化指的是,在不影響功能和體驗的情況下,能在瀏覽器執行的不要在服務端執行,能在緩存服務器上直接返回的不要到應用服務器莩絳蚰苤苯尤〉玫慕峁不要到外部取得,本機內能取得的數據不要到遠程取,內存能取到的不要到磁盤取,緩存中有的不要去數據庫查詢。減少數據庫操作指減少更新次數、緩存結果減少查詢次數、將數據庫執行的操作盡可能的讓你的程序完成(例如join查詢),減少磁盤IO指盡量不使用菁系統作為緩存、減少讀寫文件次數等。程序優化永遠要優化慢的部分,換語法是無法“優化”的。

        然而編程時不應該把重點放在優化上,應該關注擴展性。當今的WEB應用,需求變化非常之快,適應多種需求的架構是不存在的,我們的擴展性就要把要點放在跟底層交互的架構上,例如持久化數據的存取規則、緩存的存取規則等,還有一些共用服務,例如用戶信息等。先把不變的部分做完善,剩下的部分就很容易將精力放在業務邏輯上面了。

        關于作者

        劉志一,從1999年做個人網站開始一直專注于互聯網,目前就職于準掖怪斃幸礐2C網站,做產品和開發方面工作。

        原文鏈接:http://www.infoq.com/cn/articles/lzy-million-visits-site-technical-preparations


        IDCsped 提供最新的IT互聯網資訊,本著分享、傳播的宗旨,我們希望能幫助更多人了解需要的信息!

        部分文章轉載自互聯網、部分是IDCsped原創文章,如果轉載,請注明出處:www.idcsped.com !
        微信號:13430280788  歡迎加微信交流!

        標簽:服務器托管  互聯網應用  checkout  虛擬主機  管理軟件  
        相關評論

        銷售電話:13430280788

        Copyright © 2012-2017 | www.idcsped.com 版權所有

          粵公網安備 44010502001126號  粵ICP備12006439號-1
        Powered by OTCMS V3.61
        日韩欧美永久中文字幕视频
          <button id="hu96j"><acronym id="hu96j"></acronym></button><dd id="hu96j"><pre id="hu96j"></pre></dd>
            <video id="hu96j"><font id="hu96j"><th id="hu96j"></th></font></video>
              <nav id="hu96j"></nav>
            <tbody id="hu96j"><center id="hu96j"><video id="hu96j"></video></center></tbody>

          1. <dd id="hu96j"><track id="hu96j"></track></dd>

            <dd id="hu96j"></dd>
            <rp id="hu96j"><acronym id="hu96j"></acronym></rp>
          2. <button id="hu96j"></button>