當前位置:工程項目OA系統(tǒng) > 泛普各地 > 湖南OA系統(tǒng) > 益陽OA > 益陽網(wǎng)站建設公司
程序開發(fā):短網(wǎng)址開發(fā)運維經(jīng)驗
每個蘿卜下都隱藏一個坑。
前段時間955短網(wǎng)址日重定向次數(shù)最高達400萬,主要開銷是重定向請求的用戶數(shù)據(jù)儲存與分析。分別經(jīng)歷了內存瓶頸、IO 瓶頸后,高峰期達到 CPU 上限,幾乎榨干了機器,下文是經(jīng)驗總結分享。
前置條件
由于短網(wǎng)址很難盈利,硬件特別寒磣,帶著鐐銬跳舞反而別有風味,當然,人力投入,技術方面也不能和其他大網(wǎng)站比,所以如果要拍磚請輕下手——哎喲。
我們采用的硬件: 盛大云微型,1G內存,單核共享型 CPU。 后期追加了一個同等配置的內網(wǎng)機器做 MongoDB replSet。
Startup 硬件成本:
既然項目本身基本沒法帶來收益,要生存就只能充分壓榨硬件,大膽使用新技術。根據(jù)國內云的計費方式,一般收費的維度是
內存:使用異步模式代替同步多進程。
帶寬:2M雙線,301并不需要太多的帶寬開銷
硬盤:云硬盤,按容量收費
CPU:單核
由此我們做了對應的技術選型:
Nginx:無需多說了吧?
Tornado:Facebook 開源的 python 異步微框架
MongoDB:性能好,熱數(shù)據(jù)少內存開銷也少
Redis:事實上 MongoDB 寫入的 IO 開銷太大
nodejs(with coffeescript):后期新增,node.js 是天生的異步
supervisord:監(jiān)控進程
來照張相——咔嚓
開發(fā)與運維
既然目前項目投入的開發(fā)和運維都只有我一個人,那就可以美其名曰:DevOps 啦。聽上去是不是很高端大氣國際化。
用戶特點
二八法則基本適用:20% 的 URL 占用了 80% 的資源(尤其是我們默認為所有短網(wǎng)址開啟了統(tǒng)計之后)。
監(jiān)控先行
很多小團隊犯的第一個毛病就是不做監(jiān)控,等到用戶來告訴你網(wǎng)站無法打開的時候就太晚了。為了省事我們用了監(jiān)控寶和阿里云監(jiān)控(主要阿里云監(jiān)控有免費短信)。
每次出現(xiàn)無法打開網(wǎng)站的狀態(tài)時,都應該定位此次問題的原因。如果頻次增加,就要考慮應對策略了。loadavg 很好地反應了系統(tǒng)的負載,可以判斷是否硬件出現(xiàn)瓶頸。
如果是在事發(fā)時間,我們可以借助這些工具查看系統(tǒng)狀態(tài):htop(定位哪個進程的問題)、iftop(是否有異常的流量和ip)、iotop(定位 io 瓶頸)。此外就是看日志。
如果事發(fā)時在睡覺,那么就看監(jiān)控歷史記錄。
慘痛教訓一:硬盤容量——為將來留下后路
MongoDB在硬盤容量不夠的時候會拒絕啟動。而如果之前沒有使用 lvm 這類工具,將無法快速擴展容量,而國內的云不像 Linode 那么智能地在后臺提供容量的一鍵 resize(雖然這個功能曾把文件系統(tǒng)搞出錯了)。后果很可能是停機幾個小時。
慘痛教訓二:最大打開文件描述符
異步模式下不可避免遇到新問題——最大打開文件描述符。我們先后遇上了 tornado 和 nginx 的最大打開文件描述符問題。 tornado 的表現(xiàn)為:CPU 100%,日志里出現(xiàn)500;Nginx 則在日志里報錯,打開緩慢。
要避免此類問題,要做相應 ulimit 的設置。
用ulimit -n顯示的只是當前會話的(!important)。正確做法是查看進程的 limits: cat /proc/{$pid}/limits
Nginx 的配置文件里還需要設置兩個參數(shù):
worker_connections 9999; #根據(jù)自己的情況設置
worker_rlimit_nofile 60000; #根據(jù)自己的情況設置
下圖是 nginx 達到上限的監(jiān)控圖,很明顯被卡在1000左右了 —— Linux 默認限制為 1024。
慘痛教訓三:Python 不是天生異步的語言
說實話,用 Python 來設計的過程可不是一個愉快的過程。為了避免潛在編碼問題,我們使用了 python3。下面的問題是:
缺乏異步的支持:
Redis 異步驅動只支持 Python2(當然,等了大約半年后 tornado-redis 的作者終于更新了對 python3 的支持)。
不少組件仍然無法支持 python3, pip install 后直接報錯的感覺就是:傻眼了。
Bitly 的 asyncmongo 簡直是沒有文檔,最后只能選了 Motor。
Tornado 本身的文檔也不夠詳盡
后來一部分組件使用 nodejs 開發(fā)后,簡直是相見恨晚,CoffeeScript 語法糖的表現(xiàn)也很出色。
慘痛教訓四:謹慎選用數(shù)據(jù)庫
數(shù)據(jù)庫幾乎是web應用里最關鍵的一部分,越是有大局觀的技術人員越會謹慎選型。 事實上我們把所有壓力都放 MongoDB 的做法還是過于激進了。
MongoDB 的范式化與反范式化。
幾乎所有對 MongoDB一知半解的人都會告訴你不要用 SQL 的思維來思考 MongoDB,要使用內嵌文檔來實現(xiàn)需求。但是他們忘記告訴你,不斷增長的內嵌文檔將導致 IO 瓶頸(參考《深入學習 MongoDB》73頁)。
事實上范式化和反范式化(內嵌文檔)還有很多要考慮的因素。
復雜查詢時 MongoDB 的無力
在面對需要計算的查詢時,MongoDB 的 map-reduce 很慢;復雜情況下對內嵌文檔處理有難度;Documents 比 MySQL 更少。年輕人,不要在 mysql 遇到問題時第一時間想到替換數(shù)據(jù)庫。
就這個項目而言,統(tǒng)計部分要快速出多樣報表時明顯有難度。
不要等到著火了才想起 MongoDB replSet
如果 MongoDB 寫入壓力大,并且沒有做分片,那么單純加機器不會緩解寫入壓力。如果是讀取壓力倒有所幫助。
從單機到 replSet 起碼需要鎖住數(shù)據(jù)庫。程序代碼也需要修改。打算切換到 replSet 的話,需要提前做準備。
最后我們的做法是將頻繁更新的數(shù)據(jù)放 redis,定時刷入數(shù)據(jù)庫,效果很明顯。
正確使用 Redis
控制內存,控制起步成本
如果你打算省錢的,就不要把所有東西都放 Redis 里,哪怕看上去數(shù)據(jù)量不大——時間久了也占了不少內存。而在 MongoDB 里只有熱數(shù)據(jù)占內存。 二八法則也適用這種情況:熱數(shù)據(jù)只占20%。
當然如果你是土豪請你走開!
不要用 pub/sub 做隊列
如果不想丟失數(shù)據(jù)就不要用 pub/sub 做隊列。進程重啟時將丟失訂閱管道的信息。你可以用 lpush 和 brpop 來實現(xiàn)隊列。
受夠盛大云了
內網(wǎng)主機完全不能訪問外網(wǎng)。你想 apt-get update 下?臨時買帶寬吧。
被 DDOS 攻擊?直接斷網(wǎng),沒有任何通知,你還百思不得其解。
io性能太差,讀寫大約 5-6M/s 的時候就要掛了。當然阿里云的好像更差。
最后的忠告
「年輕人啊,要多讀書多看報,多思考多學習」——萬峰
看到這里肯定有不少人想噴我了,來吧,我的微博是: @dai-jie ,有錯我改,我改……
- 1企業(yè)為何就要求專門的網(wǎng)站設計公司做官網(wǎng)呢?
- 2文案和圖片設計:重點組織圖文的關系
- 3網(wǎng)站運營經(jīng)驗:內容策略更加吸引用戶
- 4營銷型網(wǎng)站規(guī)劃:營銷型網(wǎng)站規(guī)劃從哪些方面入手
- 5GA分析教程:GA整合內容測試分析網(wǎng)站內容
- 6Wordpress高級自定義布局的內容編輯器模板的制作技巧
- 7電商網(wǎng)站用戶研究:通過比較驅使用戶下訂單
- 8移動互聯(lián)網(wǎng)如何才能賺錢的幾種模式
- 9 企業(yè)為什么要做SEO及SEO與百度jingjia的區(qū)別與優(yōu)勢
- 10專題設計細節(jié):微博活動和推廣內容設計
- 11提升WP運行效率:優(yōu)化提升Wordpress速度方法8則
- 12網(wǎng)站建設中關于域名過期和續(xù)費
- 13益陽網(wǎng)站設計談如何做好論壇營銷
- 14網(wǎng)站建設行業(yè)建站公司該如何生存
- 15旅游網(wǎng)站運營經(jīng)驗:旅游網(wǎng)站盈利模式
- 16益陽網(wǎng)站建設淺談地方網(wǎng)站運營的關鍵“互動”
- 17有趣問題:google和baidu首頁為啥不投放廣告?
- 18網(wǎng)站優(yōu)化教程:404頁面如何正確設置
- 19為用戶查找內容節(jié)約時間的電商推薦系統(tǒng)的優(yōu)化
- 20從用戶體驗度談外貿(mào)網(wǎng)站建設的5點細節(jié)要求
- 21天貓新店如何步入市場,做好自己的產(chǎn)品定位?
- 22Google Analytics數(shù)據(jù)分析工具應用到APP應用
- 23中小型電子商務網(wǎng)站的優(yōu)化:更要注意細節(jié)的優(yōu)化
- 24營銷型網(wǎng)站策劃:網(wǎng)站氣質風格策劃
- 25企業(yè)網(wǎng)絡營銷之價格策略
- 26淘寶店的模式:模式?jīng)Q定著你如何賺錢
- 27數(shù)據(jù)分析教程:跳出率bounce rate越低越好嗎?
- 28站群的運營之道 站群的團隊管理
- 292014年地方網(wǎng)站將面臨的主要困難
- 30SEO效果分析:頁面的跳出率和網(wǎng)站點擊率