emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
          <2016年2月>
          31123456
          78910111213
          14151617181920
          21222324252627
          282912345
          6789101112

          公告

          常用鏈接

          留言簿(92)

          隨筆分類(20)

          隨筆檔案(171)

          文章分類(89)

          文章檔案(103)

          相冊

          收藏夾(46)

          友情連接

          收藏

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 〇、背景

                 幾年前由于發(fā)起尋親項(xiàng)目的關(guān)系,和B網(wǎng)站開展了合作。B網(wǎng)站是國內(nèi)最大的尋親網(wǎng)站,幾年來通過該網(wǎng)站和家人團(tuán)聚的案例已經(jīng)達(dá)到1397例。B論壇是網(wǎng)站中最活躍的板塊。當(dāng)時論壇遇到一些不穩(wěn)定的情況,因?yàn)锽論壇是用Discuz!搭建的,而Discuz!當(dāng)時剛好被騰訊收購,要獲得專業(yè)支持相對容易,我們開始把B論壇遷移到騰訊云上面,由Discuz!的志愿者協(xié)助維護(hù)直到去年底離職,把論壇的管理權(quán)限交給我。

          一、論壇出問題了

                我不對于php和linux都不熟,交接后看到論壇工作還算正常,也很長一段時間沒有去關(guān)注,直到前幾天,網(wǎng)站管理員突然發(fā)來了這個:




          這是什么鬼?臣妾不懂啊……只好硬著頭皮登上服務(wù)器去看看。



          還好,大概可以猜到出什么事了:數(shù)據(jù)盤不夠用了。那應(yīng)該很好解決吧?擴(kuò)數(shù)據(jù)盤?

          二、COS

          用騰訊云服務(wù)器而不是自己買服務(wù)器的一個好處就是,很多資源可以按需用,按需擴(kuò),包括硬盤。不過有個限制就是,買服務(wù)器的時候系統(tǒng)盤和數(shù)據(jù)盤都必須要買“云硬盤”而不能用本地盤。買云硬盤還有個附加的好處是可以申請開通硬盤快照功能,遷移復(fù)制服務(wù)器唰唰的。

          但是云硬盤的性能跟本地硬盤是有差距的,處于性能考慮,志愿者選擇了性能更好的本地硬盤,這樣就導(dǎo)致硬盤滿了以后沒有辦法擴(kuò)了。幾年來,尋親的網(wǎng)友們每天上傳大量的高清圖片線索,終于在世紀(jì)寒流這幾天把硬盤擠爆了。



          不過擴(kuò)硬盤本來也不是最佳選擇,比擴(kuò)硬盤更好的選擇是:不用硬盤!

          騰訊云為這種UGC文件提供的解決方案是
          COS(Cloud Object Service ,當(dāng)前版本是COS3.0。COS 大概的意思就是,你有一大堆文件(比如網(wǎng)站用戶上傳的照片),只知道量很大,不知道有多少,不但需要找個地方存著,還隨時有可能需要在某個網(wǎng)頁上引用它。那么平臺提供一個服務(wù)器讓你把文件放上去,并提供web訪問和API上傳和管理接口,你就不用把文件傳到自己服務(wù)器了。

          個人認(rèn)為使用COS的好處是:
          1 能夠提供幾乎無限量的文件存儲空間,按存儲量和訪問量收費(fèi)
          2 很大的免費(fèi)額度:50G的免費(fèi)空間,每計(jì)費(fèi)周期內(nèi)10G的回源流量,每計(jì)費(fèi)周期內(nèi)100萬次的免費(fèi)訪問次數(shù)(實(shí)際上COS通常在CDN后面提供服務(wù),因此實(shí)際上每個計(jì)費(fèi)周期可以提供10G和100萬次回源服務(wù),配合恰當(dāng)?shù)腃DN緩存策略,已經(jīng)可以滿足很大的訪問量)。
          因此用cos不但從此不用糾結(jié)容量爆倉的問題,也不用為沒有使用到的容量預(yù)先買單花冤枉錢,而且還不用自己的服務(wù)器的硬盤和網(wǎng)卡來扛這些流量,服務(wù)器的帶寬和硬盤I/O壓力也立刻就下來了。

          COS的使用也很簡單:
          1 建個倉庫(bucket),以后附件就往這個倉庫里面?zhèn)髁恕?br />

          2 修改上傳附件頁面,使用騰訊云提供的API把文件上傳到COS……開玩笑了,作為懶人,當(dāng)然是提工單申請開通COS的FTP權(quán)限啦



          大概兩個鐘頭后收到消息說ftp開通了。

          3 用論壇創(chuàng)始人身份登錄discuz,打開遠(yuǎn)程附件


          遠(yuǎn)程訪問url可以域名解析到COS源上,不過這樣附件都要走IDC流量,不但貴,也沒有實(shí)現(xiàn)靜態(tài)文件就近訪問的目標(biāo),因此實(shí)際使用的時候最好在COS服務(wù)的上面加一層CDN:
           



          現(xiàn)在用戶新上傳的附件都自動到cos里面了。然后我們來對付舊的附件吧。這時我們要用到回源功能了。先準(zhǔn)備好一個回源專用的域名,修改httpd.conf(apache)或者conf.d(nginx)添加一個新的server,documentroot(或者root)指向服務(wù)器上discuz的附件目錄 data/attachment 并修改域名解析,瀏覽器里面訪問一下確認(rèn)回源域名可以訪問到附件。然后修改cos的回源配置:




          這樣如果有人訪問cos的時候cos上沒有相應(yīng)的文件,服務(wù)器就會到老的服務(wù)器上獲取文件并緩存下來。通過瀏覽器訪問附件確認(rèn)回源成功后,登錄數(shù)據(jù)庫 
          update cdb_attachments set remote = '1' 把所有的附件都更新為遠(yuǎn)程的。這樣數(shù)據(jù)就會隨著用戶的訪問慢慢遷移到cos上了,這個過程平滑無感知,不過就是不知道遷移到什么時候成功。

          可是我想釋放硬盤空間出來啊怎么辦?先裝上ftp神器 lftp再說。不得不說,在linux下,lftp實(shí)在是個神器。打開lftp,open登上COS的ftp服務(wù)器,mirror -RL ..... 老附件通通遷移上COS咯。

          偷懶用ftp而不是修改上傳頁面代碼的一個代價是,有的時候ftp失敗,會有一些附件仍然被扔在CVM硬盤上。可以定期
          update cdb_attachments set remote = '1' 把附件都改成遠(yuǎn)程的,讓cos回源到CVM上。不過就算這樣,冷門的附件仍然可能長時間沒有辦法同步到cos上。crontab一個lftp任務(wù)定期把附件同步上COS可以解決問題。不過如果懂一點(diǎn)點(diǎn)開發(fā)的話,寫一點(diǎn)點(diǎn)腳本用inotify自動同步一下顯得會看起來好點(diǎn)兒:







          三、 CDN優(yōu)化:動靜分離

                內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network)大概的意思就是,我大騰訊在全國成百上千個機(jī)房里面屯有無數(shù)的服務(wù)器,如果某個邊遠(yuǎn)地區(qū)的用戶要訪問你放在上海的一份數(shù)據(jù),山長水遠(yuǎn)的跑到上海機(jī)房來拉數(shù)據(jù)肯定快不了,如果我把這份數(shù)據(jù)先放在這個邊遠(yuǎn)地區(qū)里,離用戶最近的一個機(jī)房呢?那速度就不一樣了。而且這個邊遠(yuǎn)地區(qū)的機(jī)房流量還比我大上海三通機(jī)房的流量便宜了一大截。不過有個前提是服務(wù)器要提前知道用戶將要訪問的數(shù)據(jù),并提前拉取這份數(shù)據(jù)緩存在當(dāng)?shù)兀虼艘话阒挥脕矸?wù)靜態(tài)的圖片、樣式表、腳本、超文本、flash這些資源。



                B論壇其實(shí)去年就用上了CDN,不過用的是一個比較冷門的用法:動態(tài)加速。這個用法就是說,先假設(shè)我網(wǎng)站的所有請求都是靜態(tài)的,這樣用戶所有的請求都訪問在當(dāng)?shù)氐姆?wù)器(邊緣服務(wù)器),然后邊緣服務(wù)器檢查一下這個請求的資源我有沒有緩存啊,沒有的話邊緣服務(wù)器再受累跑去你的服務(wù)器上拉這個數(shù)據(jù),把數(shù)據(jù)返回給你,并且嘗試緩存這個數(shù)據(jù)以備下次使用。然后對于不允許緩存的動態(tài)請求,只要聲明一個策略,比如“php文件緩存時間0秒”這樣,讓邊緣服務(wù)器直接訪問源CVM服務(wù)器就好了。

              這樣做的好處是配置簡單,不需要關(guān)心動靜分離,并且不但靜態(tài)的文件都可以被邊緣服務(wù)器緩存,動態(tài)的請求也可以獲得cdn網(wǎng)絡(luò)的傳輸加速 。壞處就是“流量double”。也就是說,你不但要給cvm購買外網(wǎng)帶寬,cvm的動態(tài)數(shù)據(jù)送到邊緣服務(wù)器以后,你還要再購買一次從邊緣服務(wù)器到用戶那里的cdn帶寬(或者流量)。

              另外一個附加的“缺點(diǎn)”是,CDN網(wǎng)絡(luò)總是盡可能快的從CVM服務(wù)器拉取全部數(shù)據(jù),再按照訪客用戶網(wǎng)絡(luò)的速度再把數(shù)據(jù)吐出去。這其實(shí)是最佳策略,因?yàn)镃VM的帶寬已經(jīng)買單了,不跑慢也是浪費(fèi),但是帶來的問題就是CVM監(jiān)控上看起來,再多的帶寬都會被跑滿,好像帶寬永遠(yuǎn)都不夠用。因此前任的管理員購買了非常多的帶寬來試圖滿足永遠(yuǎn)喂不飽的CDN網(wǎng)絡(luò),帶寬成了B論壇最沉重的成本。
              

           
          (15M的帶寬,經(jīng)常性的被CDN跑滿) 


              貿(mào)然的減少帶寬也是不合適的,最好的做法還是做盡量徹底的動靜分離,靜態(tài)的部分還是用cos托管源和FTP托管源來喂飽CDN網(wǎng)絡(luò),讓用戶盡可能體驗(yàn)好;動態(tài)的部分直接訪問CVM,根據(jù)用戶日常實(shí)際產(chǎn)生的帶寬情況再加上足夠充分的冗余來采購就可以。

              傳統(tǒng)的動靜分離手段是最好的:直接修改html、css和js,通過靜態(tài)專用域名訪問靜態(tài)資源。但是這樣做需要很多的開發(fā)工作量,作為懶人,我直接用上了大殺器:rewrite!




              懶得給每個域名打馬賽克了,也不是什么機(jī)密。這幾條規(guī)則是這樣:
          1 對于普遍圖片超大的png圖片,自動轉(zhuǎn)向到優(yōu)圖系統(tǒng)進(jìn)行jpg壓縮。因?yàn)楸O(jiān)控發(fā)現(xiàn)少數(shù)png圖片占了很大的流量比重。
          2 對于用戶上傳到附件,自動轉(zhuǎn)向到attachment子目錄(COS源),這樣CVM就不需要承擔(dān)附件文件的存儲了(零星缺失的文件cos回源啟用了回源專用的域名)
          3 對于系統(tǒng)的靜態(tài)文件,自動轉(zhuǎn)向到static子目錄(FTP源),不統(tǒng)一使用cos源的原因是,CDN回源到ftp源是免費(fèi)的,但是ftp源只有6G的存儲空間。回源到cos空間幾乎是無限的,但是是有可能收費(fèi)的。
          這樣就把CVM上出了favicon.ico之外的幾乎所有靜態(tài)文件都分離出去了。要注意的是如果盜鏈嚴(yán)重的話,原本nginx上的防盜鏈規(guī)則也要相應(yīng)的設(shè)置到cdn上去。




          動靜分離后cdn的整體命中率從瓶頸50%以下一下提升到75%以上,對于cvm的壓力大大減小了。看一下分域名的命中率數(shù)據(jù)




          在不對論壇程序做細(xì)致的優(yōu)化的情況下,只是通過策略調(diào)整達(dá)到這樣的命中率,還算比較理想了。

          不過這樣做了以后,CDN的流量費(fèi)用并沒有下降啊。因?yàn)锽論壇的CDN采用了峰值帶寬計(jì)費(fèi)模式,因此觀察了一下cdn監(jiān)控的帶寬數(shù)據(jù),發(fā)現(xiàn)了一個很有意思的問題:



          CDN的峰值帶寬按天波動非常大。細(xì)看到具體的帶寬比較大的一天更明顯:



          這天是央視《感動中國2016》B論壇的兩個發(fā)起人入選帶來的一個訪問波峰。

          像這樣的帶寬曲線模式,按照帶寬購買CDN是非常浪費(fèi)的。果斷切換到流量包計(jì)費(fèi)模式,CDN費(fèi)用從每月>¥500(每年大約¥6000~¥8000)下降到每年<6T(每年大約2000以內(nèi))

          動靜分離后CVM的實(shí)際動態(tài)帶寬需求有多少呢?后面上了負(fù)載均衡之后沒有地方可以截屏幾臺服務(wù)器完整的帶寬總和曲線了,總體是2M帶寬平常跑不滿,但是偶發(fā)集中的訪問會超,所以兩臺CVM做負(fù)載均衡,各開了2M的帶寬,保證平常有超過一倍的帶寬冗余。


          四:memcache和云數(shù)據(jù)庫

          B論壇遷移到騰訊云的時候就使用了云數(shù)據(jù)庫,數(shù)據(jù)量雖然不大,但是數(shù)據(jù)庫訪問量不小,購買的是能支撐2400QPS的50G/2000MB型號。


           (7天后到期,不需要續(xù)了) 

          但是查看了一下discuz的優(yōu)化選項(xiàng),發(fā)現(xiàn)內(nèi)存緩存優(yōu)化項(xiàng)都沒有打開。在CVM里裝上一個memcached測試了一下,數(shù)據(jù)庫請求可以有效的降低到100QPS以下。這樣高配云數(shù)據(jù)庫就太浪費(fèi)了,換個10G/360MB/120QPS的就足夠了。不過性能冗余夠不夠?discuz支持master/slave的,先提個工單申請一個免費(fèi)的slave。



          配置slave后觀察了幾天,即使在峰值查詢接近700QPS的情況下數(shù)據(jù)庫也沒有出現(xiàn)訪問瓶頸,騰訊云數(shù)據(jù)庫的性能還是相當(dāng)厚道的,這個性能冗余是足夠的。




          (某海量網(wǎng)站配置錯誤導(dǎo)致出現(xiàn)大量404頁面,順帶給論壇帶來了很大壓力)

          這樣數(shù)據(jù)庫費(fèi)用從¥2240/年陡降到¥210/年了。已經(jīng)省了這么多錢,再買個C型的memcached好了,每天2元,每年大概700元。
          CVM本機(jī)運(yùn)行一個memcached雖然性能不錯,但是始終要和其他本機(jī)服務(wù)競爭各種資源,而且考慮到后面要做負(fù)載均衡,也希望把登錄態(tài)(session)丟到云里面去。


          (memcache很輕松的扛住了情人節(jié)的感動中國帶來的訪問量)


          修改了一下discuz的配置文件指向memcached,再修改php.ini把session也指向了memcached,這下CVM就沒有“狀態(tài)”了,可以很容易的替換,或者集成多個做負(fù)載均衡。

          五:CVM和負(fù)載均衡



          B論壇在騰訊云上一共兩臺CVM,對外提供服務(wù)的是一臺配置有點(diǎn)豪華的服務(wù)器:



          這臺每年費(fèi)用是 ¥16450,當(dāng)然主要的錢都花在買帶寬去喂CDN了



          另一臺不對外服務(wù),只是有一個大的硬盤做數(shù)據(jù)備份。


          一年¥1550。

          經(jīng)過上面一系列優(yōu)化以后,原本買的CVM性能就太過冗余了,文件都丟到COS上去了,大硬盤備份也沒有必要了。已經(jīng)遷移到cos的文件剔除后,整個系統(tǒng)只剩下了4G,全部回遷到系統(tǒng)盤上面,數(shù)據(jù)盤也不需要了:



          因?yàn)閿?shù)據(jù)庫在云上,附件文件也在cos上,本地沒有什么動態(tài)的數(shù)據(jù),這樣系統(tǒng)備份也簡單的多了,定期對系統(tǒng)盤做一個“系統(tǒng)鏡像”就成,除了有一個問題:做系統(tǒng)鏡像要關(guān)機(jī)。

          墨菲定律告訴我們,永遠(yuǎn)要防著機(jī)器宕機(jī)!前面該清理的清理干凈了,是時候做雙機(jī)熱備了。先把備份機(jī)的論壇服務(wù)也啟動起來,session也指向memcached,然后添加一個負(fù)載均衡:


          訪問低谷的時候把主服務(wù)器關(guān)掉,做鏡像,備份機(jī)自動扛住了全部訪問量。

          有了鏡像以后換機(jī)型就方便了。新購一臺服務(wù)器




          因?yàn)槌浞质褂昧嗽茢?shù)據(jù)庫、memcache、cdn、cos等paas服務(wù),又做了動靜分離,cpu現(xiàn)在已經(jīng)清閑的很,1核的性能是足夠的。內(nèi)存使用率也很低,內(nèi)存其實(shí)1G也足夠,不過cpu不夠了還可以負(fù)載均衡,內(nèi)存不夠了就只有干瞪眼,所以多加1G冗余。

          購買的時候就可以直接指定安裝鏡像,支付每年¥1250的費(fèi)用,10分鐘后,有了一臺全新的服務(wù)器,配置host驗(yàn)證成功,加入到負(fù)載均衡后端列表里面

          把權(quán)重分幾次從原來的高配服務(wù)器分配到新服務(wù)器上,運(yùn)行指標(biāo)都還好,就是負(fù)載有點(diǎn)兒高,訪問速度可能不是最優(yōu),也許是mysql或者memcache要通過網(wǎng)絡(luò)訪問導(dǎo)致的?



          反正要做雙機(jī)熱備的,再買一臺一樣的服務(wù)器,加入負(fù)載均衡后臺分?jǐn)傄话氲脑L問量,觀察了一下cpu利用率和負(fù)載都下來了,雖然偶爾有一些瞬間的毛刺,反問上已經(jīng)感覺不到差別。



          這樣就有了兩臺一模一樣的服務(wù)器,平常分?jǐn)傇L問壓力,一臺宕機(jī)的時候負(fù)載均衡會自動發(fā)現(xiàn)并把訪問全部導(dǎo)向到正常工作的服務(wù)器。未來如果有更大的訪問壓力隨時可以新購機(jī)器,安裝上鏡像后加入負(fù)載均衡后端。

          正好原來購買的服務(wù)器和數(shù)據(jù)庫這陣子都要過期了,就都不用續(xù)費(fèi)了。

          六、對公益捐贈負(fù)責(zé) 

          看看優(yōu)化后比原來節(jié)省了多少:

          CVM: 原來16450+1550=18000 , 優(yōu)化后1250*2=2500



          CDN+COS:原來:¥6000~¥8000,優(yōu)化后約 ¥2000(COS回源流量暫時還沒收費(fèi),附件遷到cos后也不足50G還不需要存儲費(fèi)用,不過未來有可能產(chǎn)生少量費(fèi)用。)

          mysql+memcache :原來 ¥2240,優(yōu)化后210+700=910

          總體相比原來優(yōu)化大約 ¥22000 /年。

            雖然騰訊云一直對于公益組織免費(fèi)扶持云資源,但是我覺得云資源和公益捐贈善款一樣,也要用負(fù)責(zé)的態(tài)度摳門的用好,才是對支持企業(yè)負(fù)責(zé)任的態(tài)度。

          最后,感謝騰訊云對公益事業(yè)的慷慨支持。打完收工。






          posted on 2016-02-19 17:56 emu 閱讀(1218) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 独山县| 雷州市| 榆树市| 五指山市| 北碚区| 宣城市| 竹山县| 乐亭县| 伊春市| 内江市| 拜城县| 盱眙县| 商城县| 改则县| 玉田县| 托克逊县| 泗阳县| 宁津县| 六安市| 浑源县| 社会| 杂多县| 望谟县| 青田县| 昔阳县| 朝阳区| 安阳市| 扬中市| 崇州市| 肥城市| 太仆寺旗| 林芝县| 凉城县| 尉犁县| 河西区| 瑞金市| 稻城县| 璧山县| 大竹县| 琼海市| 通海县|