自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)蘿卜一個(gè)坑:短網(wǎng)址開(kāi)發(fā)運(yùn)維經(jīng)驗(yàn)總結(jié)分享

運(yùn)維 系統(tǒng)運(yùn)維
前段時(shí)間955短網(wǎng)址日重定向次數(shù)最高達(dá)400萬(wàn),主要開(kāi)銷(xiāo)是重定向請(qǐng)求的用戶(hù)數(shù)據(jù)儲(chǔ)存與分析。分別經(jīng)歷了內(nèi)存瓶頸、IO 瓶頸后,高峰期達(dá)到 CPU 上限,幾乎榨干了機(jī)器,下文是經(jīng)驗(yàn)總結(jié)分享。

每個(gè)蘿卜下都隱藏一個(gè)坑。

前段時(shí)間955短網(wǎng)址日重定向次數(shù)最高達(dá)400萬(wàn),主要開(kāi)銷(xiāo)是重定向請(qǐng)求的用戶(hù)數(shù)據(jù)儲(chǔ)存與分析。分別經(jīng)歷了內(nèi)存瓶頸、IO 瓶頸后,高峰期達(dá)到 CPU 上限,幾乎榨干了機(jī)器,下文是經(jīng)驗(yàn)總結(jié)分享。

前置條件

由于短網(wǎng)址很難盈利,硬件特別寒磣,帶著鐐銬跳舞反而別有風(fēng)味,當(dāng)然,人力投入,技術(shù)方面也不能和其他大網(wǎng)站比,所以如果要拍磚請(qǐng)輕下手——哎喲。

我們采用的硬件: 盛大云微型,1G內(nèi)存,單核共享型 CPU。 后期追加了一個(gè)同等配置的內(nèi)網(wǎng)機(jī)器做 MongoDB replSet。

Startup 硬件成本:

既然項(xiàng)目本身基本沒(méi)法帶來(lái)收益,要生存就只能充分壓榨硬件,大膽使用新技術(shù)。根據(jù)國(guó)內(nèi)云的計(jì)費(fèi)方式,一般收費(fèi)的維度是

  • 內(nèi)存:使用異步模式代替同步多進(jìn)程。
  • 帶寬:2M雙線(xiàn),301并不需要太多的帶寬開(kāi)銷(xiāo)
  • 硬盤(pán):云硬盤(pán),按容量收費(fèi)
  • CPU:?jiǎn)魏?/li>

由此我們做了對(duì)應(yīng)的技術(shù)選型:

  • Nginx:無(wú)需多說(shuō)了吧?
  • Tornado:Facebook 開(kāi)源的 python 異步微框架
  • MongoDB:性能好,熱數(shù)據(jù)少內(nèi)存開(kāi)銷(xiāo)也少
  • Redis:事實(shí)上 MongoDB 寫(xiě)入的 IO 開(kāi)銷(xiāo)太大
  • nodejs(with coffeescript):后期新增,node.js 是天生的異步
  • supervisord:監(jiān)控進(jìn)程

status

開(kāi)發(fā)與運(yùn)維

既然目前項(xiàng)目投入的開(kāi)發(fā)和運(yùn)維都只有我一個(gè)人,那就可以美其名曰:DevOps 啦。聽(tīng)上去是不是很高端大氣國(guó)際化。

用戶(hù)特點(diǎn)

二八法則基本適用:20% 的 URL 占用了 80% 的資源(尤其是我們默認(rèn)為所有短網(wǎng)址開(kāi)啟了統(tǒng)計(jì)之后)。

監(jiān)控先行

很多小團(tuán)隊(duì)犯的第一個(gè)毛病就是不做監(jiān)控,等到用戶(hù)來(lái)告訴你網(wǎng)站無(wú)法打開(kāi)的時(shí)候就太晚了。為了省事我們用了監(jiān)控寶和阿里云監(jiān)控(主要阿里云監(jiān)控有免費(fèi)短信)。

每次出現(xiàn)無(wú)法打開(kāi)網(wǎng)站的狀態(tài)時(shí),都應(yīng)該定位此次問(wèn)題的原因。如果頻次增加,就要考慮應(yīng)對(duì)策略了。loadavg 很好地反應(yīng)了系統(tǒng)的負(fù)載,可以判斷是否硬件出現(xiàn)瓶頸。

如果是在事發(fā)時(shí)間,我們可以借助這些工具查看系統(tǒng)狀態(tài):htop(定位哪個(gè)進(jìn)程的問(wèn)題)、iftop(是否有異常的流量和ip)、iotop(定位 io 瓶頸)。此外就是看日志。

如果事發(fā)時(shí)在睡覺(jué),那么就看監(jiān)控歷史記錄。

慘痛教訓(xùn)一:硬盤(pán)容量——為將來(lái)留下后路

MongoDB在硬盤(pán)容量不夠的時(shí)候會(huì)拒絕啟動(dòng)。而如果之前沒(méi)有使用 lvm 這類(lèi)工具,將無(wú)法快速擴(kuò)展容量,而國(guó)內(nèi)的云不像 Linode 那么智能地在后臺(tái)提供容量的一鍵 resize(雖然這個(gè)功能曾把文件系統(tǒng)搞出錯(cuò)了)。后果很可能是停機(jī)幾個(gè)小時(shí)。

慘痛教訓(xùn)二:最大打開(kāi)文件描述符

異步模式下不可避免遇到新問(wèn)題——最大打開(kāi)文件描述符。我們先后遇上了 tornado 和 nginx 的最大打開(kāi)文件描述符問(wèn)題。 tornado 的表現(xiàn)為:CPU 100%,日志里出現(xiàn)500;Nginx 則在日志里報(bào)錯(cuò),打開(kāi)緩慢。

要避免此類(lèi)問(wèn)題,要做相應(yīng) ulimit 的設(shè)置。

用ulimit -n顯示的只是當(dāng)前會(huì)話(huà)的(!important)。正確做法是查看進(jìn)程的 limits: cat /proc/{$pid}/limits

Nginx 的配置文件里還需要設(shè)置兩個(gè)參數(shù):

worker_connections  9999; #根據(jù)自己的情況設(shè)置
worker_rlimit_nofile 60000; #根據(jù)自己的情況設(shè)置

下圖是 nginx 達(dá)到上限的監(jiān)控圖,很明顯被卡在1000左右了 —— Linux 默認(rèn)限制為 1024。 

nginx

慘痛教訓(xùn)三:Python 不是天生異步的語(yǔ)言

說(shuō)實(shí)話(huà),用 Python 來(lái)設(shè)計(jì)的過(guò)程可不是一個(gè)愉快的過(guò)程。為了避免潛在編碼問(wèn)題,我們使用了 python3。下面的問(wèn)題是:

缺乏異步的支持:

  • Redis 異步驅(qū)動(dòng)只支持 Python2(當(dāng)然,等了大約半年后 tornado-redis 的作者終于更新了對(duì) python3 的支持)。
  • 不少組件仍然無(wú)法支持 python3, pip install 后直接報(bào)錯(cuò)的感覺(jué)就是:傻眼了。
  • Bitly 的 asyncmongo 簡(jiǎn)直是沒(méi)有文檔,最后只能選了 Motor。
  • Tornado 本身的文檔也不夠詳盡

后來(lái)一部分組件使用 nodejs 開(kāi)發(fā)后,簡(jiǎn)直是相見(jiàn)恨晚,CoffeeScript 語(yǔ)法糖的表現(xiàn)也很出色。

慘痛教訓(xùn)四:謹(jǐn)慎選用數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)幾乎是web應(yīng)用里最關(guān)鍵的一部分,越是有大局觀(guān)的技術(shù)人員越會(huì)謹(jǐn)慎選型。 事實(shí)上我們把所有壓力都放 MongoDB 的做法還是過(guò)于激進(jìn)了。

MongoDB 的范式化與反范式化。

幾乎所有對(duì) MongoDB一知半解的人都會(huì)告訴你不要用 SQL 的思維來(lái)思考 MongoDB,要使用內(nèi)嵌文檔來(lái)實(shí)現(xiàn)需求。但是他們忘記告訴你,不斷增長(zhǎng)的內(nèi)嵌文檔將導(dǎo)致 IO 瓶頸(參考《深入學(xué)習(xí) MongoDB》73頁(yè))。

事實(shí)上范式化和反范式化(內(nèi)嵌文檔)還有很多要考慮的因素。

復(fù)雜查詢(xún)時(shí) MongoDB 的無(wú)力

在面對(duì)需要計(jì)算的查詢(xún)時(shí),MongoDB 的 map-reduce 很慢;復(fù)雜情況下對(duì)內(nèi)嵌文檔處理有難度;Documents 比 MySQL 更少。年輕人,不要在 mysql 遇到問(wèn)題時(shí)第一時(shí)間想到替換數(shù)據(jù)庫(kù)。

就這個(gè)項(xiàng)目而言,統(tǒng)計(jì)部分要快速出多樣報(bào)表時(shí)明顯有難度。

不要等到著火了才想起 MongoDB replSet

  1. 如果 MongoDB 寫(xiě)入壓力大,并且沒(méi)有做分片,那么單純加機(jī)器不會(huì)緩解寫(xiě)入壓力。如果是讀取壓力倒有所幫助。
  2. 從單機(jī)到 replSet 起碼需要鎖住數(shù)據(jù)庫(kù)。程序代碼也需要修改。打算切換到 replSet 的話(huà),需要提前做準(zhǔn)備。
  3. 最后我們的做法是將頻繁更新的數(shù)據(jù)放 redis,定時(shí)刷入數(shù)據(jù)庫(kù),效果很明顯。

正確使用 Redis

控制內(nèi)存,控制起步成本

如果你打算省錢(qián)的,就不要把所有東西都放 Redis 里,哪怕看上去數(shù)據(jù)量不大——時(shí)間久了也占了不少內(nèi)存。而在 MongoDB 里只有熱數(shù)據(jù)占內(nèi)存。 二八法則也適用這種情況:熱數(shù)據(jù)只占20%。

當(dāng)然如果你是土豪請(qǐng)你走開(kāi)!

不要用 pub/sub 做隊(duì)列

如果不想丟失數(shù)據(jù)就不要用 pub/sub 做隊(duì)列。進(jìn)程重啟時(shí)將丟失訂閱管道的信息。你可以用 lpush 和 brpop 來(lái)實(shí)現(xiàn)隊(duì)列。

受夠盛大云了

  • 內(nèi)網(wǎng)主機(jī)完全不能訪(fǎng)問(wèn)外網(wǎng)。你想 apt-get update 下?臨時(shí)買(mǎi)帶寬吧。
  • 被 DDOS 攻擊?直接斷網(wǎng),沒(méi)有任何通知,你還百思不得其解。
  • io性能太差,讀寫(xiě)大約 5-6M/s 的時(shí)候就要掛了。當(dāng)然阿里云的好像更差。

最后的忠告

「年輕人啊,要多讀書(shū)多看報(bào),多思考多學(xué)習(xí)」——萬(wàn)峰

[[85050]]

看到這里肯定有不少人想噴我了,來(lái)吧,我的微博是: @dai-jie ,有錯(cuò)我改,我改……

原文鏈接:http://segmentfault.com/a/1190000000304859

責(zé)任編輯:黃丹 來(lái)源: segmentfault.com
相關(guān)推薦

2018-12-29 08:15:28

Tomcat應(yīng)用部署

2010-08-05 14:08:26

Flex框架

2012-11-12 09:54:07

項(xiàng)目經(jīng)理項(xiàng)目管理

2009-10-20 14:10:00

CCIE經(jīng)驗(yàn)

2022-05-26 08:12:52

debugSpringFeign

2014-07-08 09:27:24

SQLSERVER腳本

2011-07-08 13:15:52

JSP

2023-03-17 18:33:12

ChatGPTLLM應(yīng)用

2021-11-05 07:59:25

HashMapJava知識(shí)總結(jié)

2020-08-12 11:35:00

Node.js前端緩存

2019-02-28 10:52:44

Shell運(yùn)維經(jīng)驗(yàn)

2020-10-10 06:32:43

IDEA插件環(huán)境

2013-03-08 02:52:03

個(gè)人開(kāi)發(fā)項(xiàng)目糾錯(cuò)

2010-01-26 13:28:11

Android開(kāi)發(fā)要點(diǎn)

2017-03-27 17:49:40

戴爾服務(wù)器

2011-01-10 14:24:35

CIO快樂(lè)運(yùn)維

2022-04-08 08:48:16

線(xiàn)上事故日志訂閱者

2016-03-01 13:48:36

MVVMios快速開(kāi)發(fā)

2011-09-08 13:41:53

Widget
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)