如何擴充套件大規模Web網站的效能?
Reduce Data廣告服務網站如何擴充套件到每天300K QPS請求?分享經驗如下:
1. 為大規模設計,廣告服務平臺從一開始增長就很驚人,因此,系統開始就為大規模設計,系統為水平和垂直伸縮擴充套件。
2.選擇CAP定理中的AP(可用性和分割槽容錯性)二不是CA(一致性和可用性),因為廣告拍賣與服務平臺是追求低延遲和高效能,資料的高一致性不是非常關鍵。
3.沒有鎖定專門廠商軟體或專利技術的限制使用,積極使用開源軟體,開源軟體已經達到非常成熟的程度。
4.基於Mechanical Sympathy(順硬體之勢而為)構建系統,一個軟體的建立應該是基於理解硬體如何工作以及如何更好利用硬體。
5.雲技術的限制使用,他們很早就決定對雲技術的有限使用,因為a)EC2和計數部分往往非常昂貴;b)在對EC2早期的測試中發現網路抖動jitter、磁碟虛擬化等會增加延遲。
6. 延遲總是存在,對付它而不是設法消除它。所有查詢都應該發生在1ms以下。 利用RocksDB和各種其他解決方案作為主要的快取/嵌入式資料庫。
7.使用SSD固態硬碟降低延遲
8.沒有虛擬化硬體,充分利用高配置硬體(256G記憶體和24核機器)並行化許多計算。
9.磁碟寫操作,每N秒定時flush寫入大塊資料
10.Nginx用於支援keep-alive連線,而Netty最佳化支援大型併發負載。
11.為了保證廣告伺服器中關鍵資料始終是立即可用(訪問延遲以微秒計),所有這些資料都是儲存記憶體中庫/資料結構中。
12.架構應該使用share nothing,當我們增減伺服器時,系統應該是絲毫不受影響,眼睛都不會眨一下。
13.所有關鍵資料 結果都需要複製。
14.保持每天的原始記錄日誌複製
15.如果資料有點髒,系統發生資料不一致性,這一切也是正常
16.訊息系統應該是容錯的,它們可以崩潰但是不會丟失資料。
下面是具體設施情況:
跨3個資料中心的40–50節點(primarily US and two nodes in Germany)
其中30臺執行高計算 (128–256G RAM, 24 cores, top of the line CPUS and where possible SSDs)
其餘機器配置低一些, 32G RAM, Quadcore 機器.
10G 私有網 + 10G 公網
小型 Cassandra, Hbase 和 Spark 叢集.
使用關鍵技術是:
1.HBase 和 Cassandra 用於計數聚合,以及管理使用者和賬號資料集, Hbase 因為其高效能寫操作,能夠很好處理計數器,並提供近實時的分析。
2.後端主要語言是 Java. 儘管有C++ 和 Erlang經驗,但是Java有更可用的成熟技巧以及過去幾年JVM相當成熟。
3.使用Google Protobuf進行資料傳輸
4. Netty作為主要後端伺服器,感謝其簡單和高效能特點。
5.RocksDB作為使用者配置讀寫, 它是一個嵌入在每個廣告出價人中的嵌入式資料庫,使用者配置透過Apache Kafka跨RocksDB同步資料。
6. Kafka作為主要的訊息佇列,流化資料處理。
7.CQEngine作為主要的基於記憶體 快速查詢系統,使用原子物件儲存資料。
8. Nginx作為主要的反向代理.
9. Apache Spark用於為ML機器學習處理而需要的快速資料處理。
10.Jenkins 使用者CI持續整合
11. Nagios 和 Newrelic用於監視伺服器。
12. Zookeeper用於分散式同步。
13. Dozens of third parties for audience segments, etc.
14. Bittorrent Sync用於跨節點和資料中心同步關鍵資料。
15. 基於雅虎白皮書的預算控制定製的配額管理。
最後,他們在提高改進部分提到了引入LMax的Disruptor框架進行預先聚合,提高跨RocksDB資料的內部複製方式。
1. 為大規模設計,廣告服務平臺從一開始增長就很驚人,因此,系統開始就為大規模設計,系統為水平和垂直伸縮擴充套件。
2.選擇CAP定理中的AP(可用性和分割槽容錯性)二不是CA(一致性和可用性),因為廣告拍賣與服務平臺是追求低延遲和高效能,資料的高一致性不是非常關鍵。
3.沒有鎖定專門廠商軟體或專利技術的限制使用,積極使用開源軟體,開源軟體已經達到非常成熟的程度。
4.基於Mechanical Sympathy(順硬體之勢而為)構建系統,一個軟體的建立應該是基於理解硬體如何工作以及如何更好利用硬體。
5.雲技術的限制使用,他們很早就決定對雲技術的有限使用,因為a)EC2和計數部分往往非常昂貴;b)在對EC2早期的測試中發現網路抖動jitter、磁碟虛擬化等會增加延遲。
6. 延遲總是存在,對付它而不是設法消除它。所有查詢都應該發生在1ms以下。 利用RocksDB和各種其他解決方案作為主要的快取/嵌入式資料庫。
7.使用SSD固態硬碟降低延遲
8.沒有虛擬化硬體,充分利用高配置硬體(256G記憶體和24核機器)並行化許多計算。
9.磁碟寫操作,每N秒定時flush寫入大塊資料
10.Nginx用於支援keep-alive連線,而Netty最佳化支援大型併發負載。
11.為了保證廣告伺服器中關鍵資料始終是立即可用(訪問延遲以微秒計),所有這些資料都是儲存記憶體中庫/資料結構中。
12.架構應該使用share nothing,當我們增減伺服器時,系統應該是絲毫不受影響,眼睛都不會眨一下。
13.所有關鍵資料 結果都需要複製。
14.保持每天的原始記錄日誌複製
15.如果資料有點髒,系統發生資料不一致性,這一切也是正常
16.訊息系統應該是容錯的,它們可以崩潰但是不會丟失資料。
下面是具體設施情況:
跨3個資料中心的40–50節點(primarily US and two nodes in Germany)
其中30臺執行高計算 (128–256G RAM, 24 cores, top of the line CPUS and where possible SSDs)
其餘機器配置低一些, 32G RAM, Quadcore 機器.
10G 私有網 + 10G 公網
小型 Cassandra, Hbase 和 Spark 叢集.
使用關鍵技術是:
1.HBase 和 Cassandra 用於計數聚合,以及管理使用者和賬號資料集, Hbase 因為其高效能寫操作,能夠很好處理計數器,並提供近實時的分析。
2.後端主要語言是 Java. 儘管有C++ 和 Erlang經驗,但是Java有更可用的成熟技巧以及過去幾年JVM相當成熟。
3.使用Google Protobuf進行資料傳輸
4. Netty作為主要後端伺服器,感謝其簡單和高效能特點。
5.RocksDB作為使用者配置讀寫, 它是一個嵌入在每個廣告出價人中的嵌入式資料庫,使用者配置透過Apache Kafka跨RocksDB同步資料。
6. Kafka作為主要的訊息佇列,流化資料處理。
7.CQEngine作為主要的基於記憶體 快速查詢系統,使用原子物件儲存資料。
8. Nginx作為主要的反向代理.
9. Apache Spark用於為ML機器學習處理而需要的快速資料處理。
10.Jenkins 使用者CI持續整合
11. Nagios 和 Newrelic用於監視伺服器。
12. Zookeeper用於分散式同步。
13. Dozens of third parties for audience segments, etc.
14. Bittorrent Sync用於跨節點和資料中心同步關鍵資料。
15. 基於雅虎白皮書的預算控制定製的配額管理。
最後,他們在提高改進部分提到了引入LMax的Disruptor框架進行預先聚合,提高跨RocksDB資料的內部複製方式。
相關文章
- 如何構建高擴充套件性網站?套件網站
- 表空間自動擴充套件 AUTOALLOCATE 的擴充套件規律套件
- [外掛擴充套件]通用網站統計套件網站
- OpenAI披露最新研究成果:AI訓練如何擴充套件到更大規模?OpenAI套件
- 如何在AWS上自動擴充套件Web應用套件Web
- Web儲存(Web Storage)擴充套件EStorageWeb套件
- 如何擴充套件一個網站以支援數百萬使用者?套件網站
- 大型網站技術架構(七)--網站的可擴充套件性架構網站架構套件
- 大資料——Scala擴充套件大資料套件
- 如何開始一個模組化可擴充套件的Web App套件WebAPP
- 高效能的Python擴充套件(2)Python套件
- 高效能的Python擴充套件(1)Python套件
- 高效能的Python擴充套件(3)Python套件
- 分享一些好用的資源(擴充套件、介面、網站)套件網站
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 如何兩年內擴充套件至1800多人?英雄遊戲的規模效應分享套件遊戲
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- 乾貨丨如何水平擴充套件和垂直擴充套件DolphinDB叢集?套件
- 深入NGINX:我們如何設計它的效能和擴充套件性Nginx套件
- [丁原]使用Mysql來搭建可擴充套件的SNS網站(淺談)MySql套件網站
- WCF擴充套件:行為擴充套件Behavior Extension套件
- VirtualHostX網站虛擬伺服器架設工具如何安裝PHP擴充套件?網站伺服器PHP套件
- Chrome擴充套件 郵件選單在指定網站顯示Chrome套件網站
- linux下線上擴大擴充套件分割槽的方法Linux套件
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- JMeter 擴充套件開發:BeanShell 資料模擬實現及效能探討JMeter套件Bean
- 為擴充套件《英雄聯盟》IP規模 拳頭成立遊戲發行部門套件遊戲
- 《高擴充套件性網站的50條原則》編輯小記套件網站
- 擴充套件Linux網路棧套件Linux
- 如何擴充套件Kubernetes API?套件API
- 如何開發Chrome擴充套件程式Chrome套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 智聯招聘的Web模組擴充套件落地方案Web套件
- SQL Server 2008的效能和擴充套件SQLServer套件
- dubbo是如何實現可擴充套件的?套件
- 如何擴充套件 Create React App 的 Webpack 配置套件ReactAPPWeb
- Sanic 擴充套件套件
- ORACLE 擴充套件Oracle套件