日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Web系統(tǒng)架構(gòu)與研發(fā)

 悟靜 2011-06-20
主持人:馮大輝,現(xiàn)任丁香園 (http://www.dxy.cn)網(wǎng)站CTO。曾歷任支付寶架構(gòu)師、數(shù)據(jù)庫團(tuán)隊負(fù)責(zé)人等職。  
許式偉:作為系統(tǒng)架構(gòu)師,您一般會從哪些方面來保證網(wǎng)站的高可用性(降低故障時間)?


  張宴:很多因素都會導(dǎo)致網(wǎng)站發(fā)生故障,從而影響網(wǎng)站的高可用性,比如服務(wù)器硬件故障、軟件系統(tǒng)故障、IDC機房故障、程序上線前測試未發(fā)現(xiàn)的Bug、遭受分布式攻擊、突發(fā)訪問人數(shù)劇增等。

  一套良好的網(wǎng)站系統(tǒng)架構(gòu),應(yīng)該盡可能地避免只有一臺服務(wù)器、一個數(shù)據(jù)庫、一套軟件節(jié)點等單點故障的存在。單點故障一旦發(fā)生,將直接導(dǎo)致網(wǎng)站服務(wù)不可用,恢復(fù)正常服務(wù)所需的時間也比較長,甚至還可能無法恢復(fù)。負(fù)載均衡集群、雙節(jié)點熱備、分布式處理等都可以用來解決單點故障,比如提供相同業(yè)務(wù)的Web服務(wù)器、MySQL數(shù)據(jù)庫從庫,都可以構(gòu)建負(fù)載均衡集群。一旦集群中的一臺服務(wù)器、一個服務(wù)出現(xiàn)故障,自動實時摘除,對用戶來說是不可感知的,不會影響到整個網(wǎng)站的訪問,可以為運維工程師留下足夠的時間去排查和解決故障。

  對于重要的MySQL數(shù)據(jù)庫主庫,我們習(xí)慣于從硬件層和軟件層來實現(xiàn)熱備,避免單點。越是復(fù)雜的設(shè)備,發(fā)生故障的概率越大。在磁盤沒有損壞的情況下,應(yīng)用程序?qū)е路?wù)器宕機的概率,遠(yuǎn)高于簡單的磁盤陣列宕機的概率。所以,從硬件層解決的話,可以在兩臺服務(wù)器上安裝相同的數(shù)據(jù)庫版本、進(jìn)行相同的配置,用SAS或SCSI線連接一臺磁盤陣列,將數(shù)據(jù)庫數(shù)據(jù)文件存放到盤陣上。正常情況下用服務(wù)器A掛載盤陣分區(qū),啟動MySQL,綁定虛擬IP;如果服務(wù)器A宕機,則用服務(wù)器B掛載盤陣分區(qū),啟動MySQL,接管虛擬IP。從軟件層解決的話,則可以借助DRBD等軟件做鏡像。

  IDC機房發(fā)生故障的概率較小,但如果發(fā)生的話,影響面也是最大的。如果所有服務(wù)器都托管在一個IDC機房,一旦該機房遭遇長時間流量攻擊、斷電、斷網(wǎng)、地方政策性封網(wǎng)等,通常只能聯(lián)系IDC去處理,除此之外束手無策,解決時間也比較長。如果成本允許,將網(wǎng)站服務(wù)器分布在兩個以上的IDC機房,當(dāng)某個IDC發(fā)生故障時,可以臨時切換DNS域名解析來優(yōu)先恢復(fù)服務(wù)。

  雖然程序代碼上線前,經(jīng)過了測試人員的嚴(yán)格測試,但測試環(huán)境和生產(chǎn)環(huán)境畢竟有差異,所以一些會急劇影響性能、正常服務(wù)的Bug往往在程序上線之后,才會被發(fā)現(xiàn),這就要求我們在發(fā)現(xiàn)Bug后,能夠迅速回滾到上一正常版本。我們在SVN的基礎(chǔ)上,開發(fā)了Web代碼發(fā)布系統(tǒng),會將每個發(fā)布版本之間的文件變更記錄下來,一鍵實現(xiàn)程序代碼在多臺Web服務(wù)器上的發(fā)布和回滾。

  遭遇DDOS分布式拒絕服務(wù)攻擊,使用防火墻來對付半連接、假IP,還算比較容易。而那種專挑復(fù)雜動態(tài)應(yīng)用程序URL進(jìn)行的分布式CC攻擊,來源為真實IP、真實HTTP請求,具有模擬正規(guī)瀏覽器User-Agent、單個IP的每秒請求數(shù)不高、有成千上萬個攻擊源等特征,很難與正常訪問區(qū)分開,比較難對付。但是,正常通過瀏覽器訪問一個URL,會加載該URL中引入的 JavaScript腳本、CSS樣式、圖片等文件。遇到CC攻擊,需要及時分析日志,找出訪問量異常上漲的URL,然后用事先寫好的shell腳本找出哪些IP的請求只訪問了該URL,而不加載該URL引入的文件,對這些IP進(jìn)行自動封鎖。

  系統(tǒng)架構(gòu)設(shè)計時,需要事先考慮到高于目前訪問量多少倍的突發(fā)訪問。對于網(wǎng)游站點來說,訪問量受廣告集中時間段投放、線上活動的影響較大,帶寬峰值時間不固定,對于靜態(tài)內(nèi)容,可以使用商業(yè)CDN,按實際使用量計費。對于動態(tài)內(nèi)容,如果遇到突發(fā)訪問人數(shù)劇增,超過現(xiàn)有服務(wù)器處理能力,最簡單的臨時處理辦法就是增加服務(wù)器。上架新服務(wù)器需要時間,但是,同一個IDC機房內(nèi),可以借助其他業(yè)務(wù)的服務(wù)器,在不同端口開啟一組新進(jìn)程,加入到原有負(fù)載均衡池中。另外,可以臨時關(guān)閉一些Web中的次要功能,來減少服務(wù)器消耗。



  許式偉:您在任務(wù)切分上,有什么經(jīng)驗分享?您通過哪些手段保證任務(wù)的獨立性?

  張宴:相信很多人都遇到過這種情況:在一個老項目上修改、增加一些新功能所花費的時間,不比重新來做一個包含所有功能的新項目時間用得少。一個需要長期維護(hù)的項目,不可避免地會面臨老員工的離職、新員工的接手,很多時候,項目代碼的可維護(hù)性將決定一個項目的生存周期。讓一個新員工在規(guī)定開發(fā)時間的壓力下,去面對一個文檔不夠詳細(xì)、陌生的、功能復(fù)雜的龐大項目,短時間弄明白所有功能邏輯不是一件容易的事。所以,任務(wù)需要切分,將一個大的任務(wù)切分成一個個小模塊之后,各模塊之間可以做到代碼獨立,互不影響,可維護(hù)性也大大增強。

  關(guān)于任務(wù)切分,我以本人今年負(fù)責(zé)的兩個重要項目架構(gòu)設(shè)計為例來介紹一下。在第一個項目:金山游戲官網(wǎng)的《用戶行為分析系統(tǒng)》中,由于數(shù)據(jù)挖掘計算需要消耗較高的內(nèi)存、CPU資源,一臺服務(wù)器的處理能力不夠,而商業(yè)的分布式數(shù)據(jù)倉庫價格又太貴,所以,只有從程序應(yīng)用中下手,進(jìn)行任務(wù)切分。我們先按需要挖掘的數(shù)據(jù)指標(biāo),將整個數(shù)據(jù)挖掘任務(wù)切分成多個數(shù)據(jù)挖掘插件,每個插件可以在不同的服務(wù)器上運行,多個插件可以同時在多臺服務(wù)器上。多個數(shù)據(jù)挖掘插件之間,如果用到相同的某項數(shù)據(jù),那么,就將該項數(shù)據(jù)以冗余方式,復(fù)制幾份提供給需要的插件,從而實現(xiàn)插件之間無交互、無關(guān)聯(lián),保證了超大數(shù)據(jù)量下插件的運算速度。

  在第二個項目:金山游戲新版運營管理系統(tǒng)中,則 將整個任務(wù)切分成了PHP Web管理界面、PHP Web API功能接口、C/C++中間件引擎三部分。這是一種分層結(jié)構(gòu)切分,最上層的“PHP Web管理界面”調(diào)用“PHP Web API功能接口”,“PHP Web API功能接口”調(diào)用運行在游戲服務(wù)器端的“C/C++中間件引擎”,“C/C++中間件引擎”與“游戲服務(wù)器端進(jìn)程”通過TCP、UDP二進(jìn)制協(xié)議、信號、命令行等多種方式通信。四者之間相對獨立,代碼無關(guān)聯(lián),通過一層層API接口實現(xiàn)交互。“PHP Web管理界面”負(fù)責(zé)通用界面實現(xiàn)。“PHP Web API功能接口”內(nèi)部,又按接入的游戲模塊、子功能模塊進(jìn)行了更細(xì)的切分,各功能模塊之間通過內(nèi)部API交互。“C/C++中間件引擎”大而全,不處理具體指令,但兼容TCP、UDP、HTTP、HTTPS/SSL、信號、命令行等大多數(shù)通信方式,負(fù)責(zé)和各種類型的游戲服務(wù)端交互。這是一套完全由API接口驅(qū)動的系統(tǒng)架構(gòu),一款新游戲接入運營管理系統(tǒng)時,只需在“PHP Web API功能接口”中增加一個模塊;一個游戲新管理功能的增加,只需要在“PHP Web API功能接口”中增加一個子模塊。通過任務(wù)切分,將復(fù)雜功能簡單化,也將原來接入一款新游戲所需要的幾個月時間,縮短為1~2周。



  許式偉:您通過哪些手段,來保障產(chǎn)品的質(zhì)量?您傾向于多久更新一次您的網(wǎng)站?


  張宴:Web產(chǎn)品質(zhì)量主要體現(xiàn)在架構(gòu)、功能、性能、安全、代碼唯一性、兼容性等方面。

  架構(gòu)方面,我會先設(shè)計一套架構(gòu)方案,然后讓和項目相關(guān)的人員、專家組成員參與進(jìn)來,一起探討和論證架構(gòu)的利弊,提出改進(jìn)意見,保證架構(gòu)的可行性。所有重要項目的技術(shù)方案需要經(jīng)過專家組的評估。

  功能、性能方面,則會由專門的測試人員進(jìn)行功能測試、壓力測試、安全掃描,測試環(huán)境分為線下測試環(huán)境、線上準(zhǔn)測試環(huán)境。

  在代碼唯一性方面,我們開發(fā)了一個Web配置信息管理平臺及相關(guān)PHP擴展,提供給系統(tǒng)工程師,用于配置信息的統(tǒng)一管理。在新項目中,PHP程序配置文件中將不再出現(xiàn)MySQL、Memcached等各類IP和端口信息,統(tǒng)一用Web配置信息管理平臺給出的變量代替。從“開發(fā)環(huán)境→線下測試環(huán)境→線上測試環(huán)境→線上正式環(huán)境”,連接的數(shù)據(jù)庫各不相同,導(dǎo)致PHP開發(fā)工程師經(jīng)常搞混淆或忘了修改,通過Web配置信息管理平臺,使得PHP代碼中的配置文件,在四個環(huán)境中無須作任何修改,保證了代碼的一致性,降低了出錯率,從而確保了產(chǎn)品質(zhì)量。

  在兼容性方面,我們從操作系統(tǒng)到PHP、 MySQL版本,都保持開發(fā)環(huán)境、測試環(huán)境、線上環(huán)境的統(tǒng)一,所有的Web服務(wù)運行在CentOS Linux系統(tǒng)上。由于大多數(shù)PHP程序員習(xí)慣于在Windows上編寫代碼,而我們的程序中調(diào)用的一些接口、PHP擴展,只能在Linux下運行。為此,我們開發(fā)了一個小工具,可以將多名程序員在各自本機Windows上搭建的nginx虛擬主機、編寫的程序文件,映射到一臺Linux服務(wù)器,用 Linux上的php-cgi執(zhí)行Windows上的PHP代碼。這樣,PHP程序員修改完本機代碼,保存一下,即可調(diào)試,多人之間互不影響。自己調(diào)試通過后,可以在Windows直接點擊鼠標(biāo)右鍵,將修改的代碼提交到SVN版本庫。

  Web 2.0時代,講究網(wǎng)站更新的實時性,動態(tài)網(wǎng)站不用說,靜態(tài)網(wǎng)站的內(nèi)容發(fā)布也要保證實時。我們開發(fā)了一款名為Sersync的開源軟件(http://code.google.com/p/sersync/), 使用Linux 2.6內(nèi)核的inotify監(jiān)控Linux文件系統(tǒng)事件,被監(jiān)聽目錄下如果有文件發(fā)生修改,Sersync將通過內(nèi)核自動捕獲到事件,并將該文件利用 rsync同步到CDN源站服務(wù)器。Sersync僅僅同步發(fā)生增、刪、改事件的單個文件或目錄,不像rsync鏡像同步那樣需要比對雙方服務(wù)器整個目錄下數(shù)千萬的文件,并且支持多線程同步,因此效率非常高。金山游戲官網(wǎng)的CMS內(nèi)容發(fā)布系統(tǒng),無論網(wǎng)站編輯通過Web還是FTP上傳圖片、視頻、附件,還是系統(tǒng)工程師直接去CMS發(fā)布服務(wù)器上增加、修改、刪除文件,干完這些事情后不用做任何處理,Sersync 會自動將發(fā)生增、刪、改事件的文件同步到CDN源站服務(wù)器,并可以在文件同步完成后,自動調(diào)用CDN緩存刷新接口,主動刷新發(fā)生修改、刪除的文件的訪問 URL。



  許式偉:您在面試時,通常關(guān)注應(yīng)聘者的哪些方面?哪些問題經(jīng)常會問呢?

  張宴:第一,需要具備崗位要求的基礎(chǔ)技能知識,這方面我不再詳述。

  第二,注重項目經(jīng)驗與積累,不看重學(xué)歷與工作年限。做一個項目,猶如打一場戰(zhàn)役,身經(jīng)百戰(zhàn),積累下來的成功經(jīng)驗可以讓工作更得心應(yīng)手,失敗經(jīng)驗可以避免走很多彎路。

  第三,能夠在1~2個以上技術(shù)領(lǐng)域精通。所謂術(shù)業(yè)有專攻,能夠在某幾項技術(shù)領(lǐng)域做到精通的人,相信對于新的技術(shù)領(lǐng)域或者從未有過相關(guān)經(jīng)驗的新項目,也能夠輕松勝任,做到盡善盡美。

  第四,關(guān)注應(yīng)聘者的知識廣度。如今的項目,已經(jīng)告別個人英雄時代,講究團(tuán)隊的協(xié)作。知識面越廣,盡管在非專攻領(lǐng)域的深度可能不夠,但是,知己知彼,可以站在一個更高的角度上看問題,這對于團(tuán)隊協(xié)作開發(fā)、項目融合的益處是顯而易見的。

  第五,具備良好的領(lǐng)悟能力、思考能力、設(shè)計能力、創(chuàng)新能力?;A(chǔ)技能知識不夠可以學(xué)習(xí),經(jīng)驗不足可以積累,技術(shù)不精通可以鉆研,知識面不廣可以開拓,但要培養(yǎng)這四項能力,是一件非常困難的事。要打造一支優(yōu)秀的團(tuán)隊,這四項能力不可缺少,它們的重要度甚至超過以上的四方面要求。

  我不會經(jīng)常去問固定的問題,但所問的問題,幾乎都跟以上的這些方面相關(guān)。



  許式偉:您曾嘗試開放自己的程序代碼嗎?您對中國國內(nèi)開源社區(qū)的現(xiàn)狀有何看法?

  張宴:是否開源自己的程序代碼,跟所在公司或部門的性質(zhì)有著密切的關(guān)系。如果是在研發(fā)驅(qū)動型企業(yè)或部門,程序代碼是公司生存的命脈,需要與競爭對手拼技術(shù)和保持技術(shù)領(lǐng)先的優(yōu)勢,因此,很難支持開源事業(yè)。反之,如果是在運營驅(qū)動型企業(yè)或部門,技術(shù)是用來提高運營質(zhì)量、運營水平的工具之一。將純粹的技術(shù)代碼或產(chǎn)品,從公司的業(yè)務(wù)產(chǎn)品中提取出來,進(jìn)行開
源,可以按照開源產(chǎn)品的要求,提高公司內(nèi)部技術(shù)產(chǎn)品的規(guī)范化、標(biāo)準(zhǔn)化,還可以引用更廣大用戶的使用、反饋和意見,解決未發(fā)現(xiàn)的潛在Bug,改進(jìn)代碼質(zhì)量,提升技術(shù)水平。對于提高運營質(zhì)量、運營水平來說,益處多多。我也嘗試開源自己的一些代碼,例如簡單消息隊列服務(wù)HTTPSQS(http://code.google.com/p/httpsqs/)、MySQL HTTP/REST客戶端MySQL-UDF-HTTP(http://code.google.com/p/mysql-udf-http/),同時,也鼓勵團(tuán)隊成員嘗試開源,例如剛才提到的自動同步軟件Sersync。

  國內(nèi)的開源社區(qū)在不斷壯大,很多知名互聯(lián)網(wǎng)公司都開源了自己的一些產(chǎn)品,但大多數(shù)還只停留在開源產(chǎn)品的使用、技術(shù)交流、漢化層面,真正參與到開源產(chǎn)品編碼中的人還是較少,很多開源產(chǎn)品最終還是由原作者或原公司團(tuán)隊維護(hù)。國內(nèi)開源社區(qū)的道路仍然漫長。

from: http://blog./architect_solitaire/#entrymore 張宴

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多