日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > 數據庫 > access > 使用HAProxy、PHP、Redis和MySQL支撐每天上億請求的架構細節(jié)

使用HAProxy、PHP、Redis和MySQL支撐每天上億請求的架構細節(jié)

來源:程序員人生   發(fā)布時間:2014-09-02 05:39:58 閱讀次數:4335次

使用HAProxy、PHP、Redis和MySQL支撐10億請求每周架構細節(jié)

發(fā)表于1小時前|536次閱讀| 來源High Scalability|2 條評論| 作者Todd Hoff

大數據架構HAProxyPHPRedisMySQL
摘要:如果你還在為公司服務器架構的問題而糾結,不妨來看看Antoni Orfin是如何實現(xiàn)使用HAProxy、PHP、Redis和MySQL支撐每周10億請求的架構的,更聰明的使用簡單的工具提高服務器的性能。

【編者按】在公司的發(fā)展中,保證服務器的可擴展性對于擴大企業(yè)的市場需要具有重要作用,因此,這對架構師提出了一定的要求。本文將向你介紹一個非常簡單的架構,使用HAProxy、PHP、Redis和MySQL就能支撐每周10億請求。同時,你還能了解項目未來的橫向擴展途徑及常見的模式。


免費訂閱“CSDN云計算(左)CSDN大數據(右)”微信公眾號,實時掌握第一手云中消息,了解最新的大數據進展!

CSDN發(fā)布虛擬化、Docker、OpenStack、CloudStack、數據中心等相關云計算資訊,     分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、內存計算、流計算、機器學習和智能算法等相關大數據觀點,提供云計算和大數據技術、平臺、實踐和產業(yè)信息等服務。        


以下為譯文:


本文的作者是AntoniOrfin,Octivi聯(lián)合創(chuàng)始人兼軟件架構師。

在這篇文章中,我將展示一個非常簡單的架構,使用HAProxy、PHP、Redis和MySQL支撐每周10億請求。除此之外,我還將展示項目未來的橫向擴展途徑及常見的模式,下面我們一起看細節(jié)。

狀態(tài):

  • 服務器
  1. 3個應用程序節(jié)點
  2. 2個MySQL+1個備份
  3. 2個Redis
  • 應用程序
  1. 應用程序每周處理10億請求
  2. 峰值700請求每秒的單Symfony2實例(平均工作日約550請求每秒)
  3. 平均響應時間30毫秒
  4. Varnish,每秒請求超過1.2萬次(壓力測試過程中獲得)
  • 數據存儲
  1. Redis儲存了1.6億記錄,數據體積大約100GB,同時它是我們的主要數據存儲
  2. MySQL儲存了3億記錄,數據體積大約300GB,通常情況下它作為三級緩存層

平臺:


  • 監(jiān)視:
  1. Icinga
  2. Collectd
  • 應用程序
  1. HAProxy + Keepalived
  2. Varnish
  3. PHP(PHP-FPM)+ Symfony2 Framework
  • 數據存儲
  1. MySQL(主從配置),使用HAProxy做負載均衡
  2. Redis (主從配置)

背景

大約1年前,一個朋友找到我并提出了一個苛刻的要求:它們是一個飛速發(fā)展的電子商務初創(chuàng)公司,而當時已經準備向國際發(fā)展。介于那個時候他們仍然是一個創(chuàng)業(yè)公司,初始解決方案必須符合所謂的成本效益,因此也就無法在服務器上投入更多的資金。遺留系統(tǒng)使用了標準的LAMP堆棧,因此他們擁有一個強力的PHP開發(fā)團隊。如果必須引入新技術的話,那么這些技術必須足夠簡單,不會存在太多架構上的復雜性;那么,他們當下的技術團隊就可以對應用進行長期的維護。

為了滿足他們擴展到下一個市場的需求,架構師必須使用可擴展理念進行設計。首先,我們審視了他們的基礎設施:



老系統(tǒng)使用了單模塊化設計思路,底層是一些基于PHP的Web應用程序。這個初創(chuàng)公司有許多所謂的前端網站,它們大多都使用了獨立的數據庫,并共享了一些支撐業(yè)務邏輯的通用代碼。毫不客氣的說,長期維護這種應用程序絕對是一個噩夢:因為隨著業(yè)務的發(fā)展,有些代碼必須被重寫,這樣的話,修改某個網站將不可避免導致業(yè)務邏輯上的不一致,這樣一來,他們不得不在所有Web應用程序上做相同的修改。

通常情況下,這該歸結于項目管理問題,管理員必須對橫跨多個代碼庫的那些代碼負責。基于這個觀點,整改第一步就是提取核心的業(yè)務關鍵功能,并將之拆分為獨立的服務(這也是本文的一個重點部分),也就是所謂的面向服務架構,在整個系統(tǒng)內遵循“separation of concern”原則。每個服務只負責一個業(yè)務邏輯,同時也要明確更高等級的業(yè)務功能。舉個形象的例子也就是,這個系統(tǒng)可能是個搜索引擎、一個銷售系統(tǒng)等。

前端網站通過REST API與服務交互,響應則基于JSON格式。為了簡單起見,我們選擇了SOAP,一個開發(fā)者比較無愛的協(xié)議,因為誰都不愿意解析一堆的XML。

提取一些不會經常處理的服務,比如身份驗證和會話管理。這是非常必要的一個環(huán)節(jié),因為它們的處理等級比較高。前端網站負責這個部分,只有它們可以識別用戶。這樣一來我們可以保持服務的足夠簡單,在處理擴展和代碼相關問題時都具有巨大的優(yōu)勢,可謂各司其職,完美無缺。

帶來的好處:

  • 獨立子系統(tǒng)(服務)可以便捷的在不同團隊中開發(fā),開發(fā)者互不干涉,效率理所當然提升。
  • 身份驗證和會話不會通過它們來管理,因此它們造成的擴展問題不翼而飛。
  • 業(yè)務邏輯被區(qū)分,不同的前端網站不會再存在功能冗余。
  • 顯著地提高了服務的可用性。

共生的缺點:

為系統(tǒng)管理員帶來更大的工作量。鑒于服務都使用了獨立的基礎設施,這將給管理員帶來更多需要關注的地方。

很難保持向后兼容。在一年的維護之后,API方法中發(fā)生了數不盡的變化。因此問題發(fā)生了,它們必將破壞向后兼容,因為每個網站的代碼都可能發(fā)生變化,還可能存在許多技術人員同時修改一個網站的情況……然而,一年后,所有方法匹配的仍然是項目開始時建立的文檔。

應用程序層


著眼請求工作流,第一層是應用程序。HAProxy負載均衡器、Varnish和Symfony2應用程序都在這一層。來自前端網站的請求首先會傳遞給HAProxy,隨后負載均衡器將把他分給不同的節(jié)點。

應用程序節(jié)點配置

  • Xeon E5-1620@3.60GHz,64GB RAM,SATA
  • Varnish
  • Apache2
  • PHP 5.4.X(PHP-FPM),使用APC字節(jié)碼緩存

我們購買了3個這樣的服務器,N+1冗余配置的active-active模式,備份服務器同樣處理請求。因為性能不是首要因素,我們?yōu)槊總€節(jié)點配置獨立的Varnish以降低緩存hit,同時也避免了單點故障(SPOF)。在這個項目中,我們更重視可用性。因為一個前端網站服務器中使用了Apache2,我們保留了這個堆棧。這樣一來,管理員不會困擾于太多新加入的技術。

Symfony2應用程序

應用程序本身基于Symfony2建立,這是一個PHP全堆棧框架,提供了大量加速開發(fā)的組件。作為基于復雜框架的典型REST服務可能受到很多人質疑,這里為你細說:

  • 對 PHP/Symfony 開發(fā)者友好。客戶端IT團隊由PHP開發(fā)者組成,添加新技術將意味必須招聘新的開發(fā)者,因為業(yè)務系統(tǒng)必須做長時間的維護。
  • 清晰的項目結構。PHP/Symfony雖然從來都不是必需品,但卻是許多項目的默認選擇。引入新的開發(fā)者將非常方便,因為對他們來說代碼非常友好。
  • 許多現(xiàn)成的組件。遵循DRY思想……沒有人愿意花力氣去做重復的工作,我們也不例外。我們使用了大量的Symfony2Console Component,這個框架非常有利于做CLI命令,以及應用程序性能分析(debug工具欄)、記錄器等。

在選用Symfony2之前,我們做了大量的性能測試以保證應用程序可以支撐計劃流量。我們制定了概念驗證,并使用JMeter執(zhí)行,我們得到了讓人滿意的結果――每秒700請求時響應時間可以控制在50毫秒。這些測試給了我們足夠的信心,讓我們堅信,即使Symfony2這樣復雜的框架也可以得到理想的性能。

應用程序分析與監(jiān)控

我們使用Symfony2工具來監(jiān)視應用程序,在收集指定方法執(zhí)行時間上表現(xiàn)的非常不錯,特別是那些與第三方網絡服務交互的操作。這樣一來,我們可以發(fā)現(xiàn)架構中潛在的弱點,找出應用程序中最耗時的部分。

冗長的日志同樣是不可缺少的一部分,我們使用PHP Monolog庫把這些日志處理成優(yōu)雅的log-lines,便于開發(fā)者和管理員理解。這里需要注意的是盡可能多地添加細節(jié),越詳細越好,我們使用了不同的日志等級:

  • Debug,可能會發(fā)生的事情。比如,請求信息在調用前會傳送給一個外部Web服務;事情發(fā)生后從API調用響應。
  • Error,當錯誤發(fā)生時請求流并未被終止,比如第三方API的錯誤響應。
  • Critical,應用程序崩潰的瞬間。

因此,你可以清晰地了解Error和Critical信息。而在開發(fā)/測試環(huán)境中,Debug信息同樣被記錄。同時,日志被存儲在不同的文件中,也就是Monolog庫下的“channels”。系統(tǒng)中有一個主日志文件,記錄了所有應用程序級錯誤,以及各個channel的短日志,從單獨的文件中記錄了來自各個channel的詳細日志。

擴展性

擴展平臺的應用程序層并不困難,HAProxy性能并不會在短時間耗盡,唯一需要考慮的就是如何冗余以避免單點故障。因此,當下需要做的只是添加下一個應用程序節(jié)點。

數據層

我們使用Redis和MySQL存儲所有的數據,MySQL更多作為三級緩存層,而Redis則是系統(tǒng)的主要數據存儲。

Redis

在系統(tǒng)設計時,我們基于以下幾點來選擇滿足計劃需求的數據庫:

  • 在存儲大量數據時不會影響性能,大約2.5億記錄
  • 通常情況下多是基于特定資源的簡單GET請求,沒有查找及復雜的SELECT操作
  • 在單請求時盡可能多的獲得資源以降低延時

在經過一些調查后,我們決定使用Redis

  • 大部分我們執(zhí)行的操作都具有O(1)或O(N)復雜性, N是需要檢索鍵的數量,這意味著keyspace大小并不會影響性能。
  • 通常情況下會使用MGET命令行同時檢索100個以上的鍵,這樣可以盡可能的避免網絡延時,而不是在循環(huán)中做多重GET操作。

我們當下?lián)碛袃蓚€Redis服務器,使用主從復制模式。這兩個節(jié)點的配置相同,都是Xeon E5-2650v2@2.60GHz,128GB,SSD。內存限制被設置為100GB,通常情況下使用率都是100%。


在應用程序并沒有耗盡單個Redis服務器的所有資源時,從節(jié)點主要作作備份使用,用以保證高有效性。如果主節(jié)點宕機,我們可以快速的將應用程序切換到從節(jié)點。在維護和服務器遷移時,復制同樣被執(zhí)行――轉換一個服務器非常簡單。

你可能會猜想當Redis資源被一直耗盡時的情景,所有的鍵都是持久化類型,大約占90%keyspace,剩余資源被全部被用于TTL過期緩存。當下,keyspace已經被分為兩個部分:一個是TTL集(緩存),另一個則是用于持久化數據。感謝“volatile-lru”最大化內存設置的可行性,最不經常使用緩存鍵會被移除。如此一來,系統(tǒng)就可以一直保持單Redis實例同時執(zhí)行兩個操作――主存儲和通用緩存。

使用這個模式必須一直監(jiān)視“期滿”鍵的數量:

db.redis1:6379> info keyspace

# Keyspace

db0:keys=16XXXXXXX,expires=11XXXXXX,avg_ttl=0

“期滿”鍵數量越接近0情況越危險,這個時候管理員就需要考慮適當的分片或者是增加內存。

我們如何進行監(jiān)控?這里使用Icingacheck,儀表盤會顯示數字是否會達到臨界點,我們還使用了Redis來可視化“丟失鍵”的比率。


在一年后,我們已經愛上了Redis,它從未讓我們失望,這一年系統(tǒng)從未發(fā)生任何宕機情況。

MySQL

在Redis之外,我們還使用了傳統(tǒng)RDBMS――MySQL。但是區(qū)別于他人,我們通常使用它作為三級緩存層。我們使用MySQL存儲一些不會經常使用對象以降低Redis的資源使用率,因此它們被放到了硬盤上。這里沒有什么可說道的地方,我們只是盡可能地讓其保持簡單。我們使用了兩個MySQL服務器,配置是XeonE5-1620@3.60GHz,64GB RAM,SSD。兩個服務器使用本地、異步的主-主復制。此外,我們使用一個單獨的從節(jié)點作為備份。

MySQL的高可用性

在應用程序中,數據庫永遠是最難的瓶頸。當前,這里還不需要考慮橫向擴展操作,我們多是縱向擴展Redis和MySQL服務器。當下這個策略還存在一定的發(fā)展空間,Redis運行在一個126GB內存的服務器上,擴展到256GB也并不困難。當然,這樣的服務器也存在劣勢,比如快照,又或是是簡單的啟動――Redis服務器啟動需要很長的時間。

在縱向擴展失效后進行的必然是橫向擴展,值得高興的是,項目開始時我們就為數據準備了一個易于分片的結構:

在Redis中,我們?yōu)橛涗浭褂昧?個“heavy”類型。基于數據類型,它們可以分片到4個服務器上。我們避免使用哈希分片,而是選擇基于記錄類型分片。這種情況下,我們仍然可以運行MGET,它始終在一種類型鍵上執(zhí)行。

在MySQL上,結構化的表格非常易于向另一臺服務器上遷移――同樣基于記錄類型(表格)。當然,一旦基于記錄類型的分片不再奏效,我們將轉移至哈希。

學到的知識

  • 不要共享你的數據庫。一旦一個前端網站期望切換會話處理到Redis,Redis緩存空間將被耗盡,同時它會拒絕應用程序保存下一個緩存鍵。這樣一來所有的緩存將轉至MySQL服務器,這將導致大量開銷。
  • 日志越詳細越好。如果log-lines中沒有足夠的信息,快速Debug問題定位將成為難點。如此一來,你不得不等待一個又一個問題發(fā)生,直到找到根結所在。
  • 架構中使用復雜的框架并不意味著低性能。許多人驚訝我們使用全堆棧框架來支撐如此流量應用程序,其秘訣在于更聰明的使用工具,否則即使是Node.js也可能變得很慢。選擇一個提供良好開發(fā)環(huán)境的技術,沒有人期望使用一堆不友好的工具,這將降低開發(fā)團隊士氣。
原文鏈接:The Easy Way Of Building A Growing Startup Architecture Using HAProxy, PHP, Redis And MySQL To Handle 1 Billion Requests A Week
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 一二区成人影院电影网 | 国产欧美精品区一区二区三区 | 国产精品久久久久久久免费看 | 成人影视电影 | 国产精品一区二区不卡 | 日韩亚洲一区二区 | 91美女网站 | 999精品视频| 国产v亚洲v天堂无码 | 精品视频免费观看 | 红桃视频成人免费网站 | 免费精品视频一区二区三区 | 免费在线成人 | 成人国产精品久久久 | 最近中文字幕免费在线观看 | 九九热久久这里只有精品 | 日韩av免费在线观看 | 久久av一区二区三区亚洲 | 97在线观看视频 | 欧美日韩高清在线观看 | 国产精品亚洲成在人线 | 欧美三级韩国三级日本三斤 | 国产探花一区二区 | 91精品区 | 在线观看1区 | 久久久女女女女999久久 | 999免费视频 | 午夜精品在线观看 | 亚洲电影一区 | 一区二| 91麻豆国产 | 久久人人97超碰精品888 | 国产精品国产三级国产aⅴ中文 | 成人免费视频观看视频 | 国产精品一区二区在线观看 | 一本一本久久a久久精品综合小说 | 成人免费淫片视频软件 | 在线观看亚洲专区 | 不卡国产在线 | 成年人免费观看 | 欧美日韩免费一区 |