百萬用戶規模的系統如何擴展

摘要:系統擴展一直是個讓人頭疼的事情,MatinKleppmann通過本文分享了他自己的6條經驗,外加網友的一條建議,這些經驗對于擴展Twitter這樣規模的系統或許幫助不大,但是對于百萬用戶級別的系統擴展就另當別論了。

【編者按】面對系統擴展的難題,我們做過不少的經驗分享,學習別人的系統擴展經驗可以讓我們少走很多彎路,今天給大家介紹的這篇文章來自High Scalability網站,MatinKleppmann針對百萬用戶級別的系統擴展,總結了幾條有用的經驗,當然這些經驗對于像Twitter這樣規模的系統就不一定有用了。


CSDN推薦:歡迎免費訂閱《Hadoop與大數據周刊》獲取更多Hadoop技術文獻、大數據技術分析、企業實戰經驗,生態圈發展趨勢。?


以下為原文:

系統擴展一直是個讓人頭疼的事情,但系統擴展過程中你是不是也經常會產生一些新的想法?同樣,別人擴展系統的經驗也一定會給你帶來很多幫助,MatinKleppmann通過本文分享了他自己的一些經驗。

這些經驗對于擴展Twitter這樣規模的系統或許沒有什么幫助,但是針對百萬用戶級別系統的擴展(很多項目面臨這樣的難題),MatinKleppmann的經驗無疑會帶來很多幫助:

構建可擴展系統沒有什么樂趣可言,這是一個枯燥而又繁瑣的任務。雖然大量的工具已經預先準備好了,可現有的那些開源解決方案有著各種各樣缺點(當然你自己的方案也不一定有多好,但至少能夠幫你解決特定的問題)。

在這里,MatinKleppmann分享了他的6個重要的系統擴展經驗(外加網友的一條有用評論):

1. 實際工作中的負載測試非常困難

負載測試需要讓系統承擔不同的工作量,有些工作量甚至超出了你現有的數據量水平,通過負載測試,評估系統在不同工作量條件下的性能,以及持續常態運行的能力。具體還需要測試出系統的響應速率、事務處理速率等參數。然而測試一個大型分布式系統和做科學實驗不同,科學實驗可以在理想條件下進行,而負載測試則要難得多了,這對于搞計算機科學的人來說可能很難接受。你很難知道你實際訪問的是怎樣的模式,很難測試比你實際擁有數據更大的綜合數據集,很難將舊系統與新系統進行比較,所以為防新代碼出現錯誤,你要隨時準備好回滾。

2. 數據演變(data evolution)很困難

想象一下,你的機房被數據“淹沒”的情形,到處都是數據——數據庫中、日志中,以及一系列二進制數據塊中。這時候如果要更新數據格式,你就需要改變一個巨大的時槽,而大公司在這些處理的自動化和優化上有著豐富的經驗,可以適當借鑒大公司的數據演變經驗,節約數據演變的時間成本。

3. 數據庫連接是一個瓶頸

當系統在服務和節點數增加時,數據庫連接數以難以置信的速度增加。每個連接都會消耗資源,不僅僅是機器資源,還有人力資源,因為你的開發人員需要去弄明白怎樣解決這些問題。通過使用連接池或者編寫數據訪問層,你可以通過API進行數據庫訪問。

4. 讀取副本是一步痛苦的操作

但讀取副本從主服務器中解除數據庫訪問也是一種常用的擴展策略。同樣,這也需要花費大量的精力來建立和維護這些系統,畢竟故障處理是一個始終存在的問題。

5. 考慮內存效率

峰值延遲通常是由內存問題引起的,想要更有效地利用RAM可能很困難,因為你很難判斷出RAM的實際使用情況。通過購買更多的RAM可以解決很多性能問題,如果可能的話,可以在RAM中加入索引,注意是對字符串的哈希表建立索引,而不是針對字符串本身。

6. 更改捕獲(change capture)是一個有效的方法

比如更改系統中的數據,這樣的更改必須通過許多服務,比如數據庫、搜索索引、圖、索引、副本讀取、緩存無效化。你可能認為可以每次在應用更新時將其寫到多個位置,但實際上很少這樣做。你也許認為可以通過應用程序讀取數據庫日志,但這對于有些系統是不可行的。更改捕獲系統是一個不錯的解決方案,該系統捕獲所有寫操作并將它們存儲到數據庫中。應用程序可以實時接收這些更新,它們會形成更改的歷史記錄。該方法的好處是將數據生產者和消費者分開,這為你進行實驗提供了很大的方便,而不用去擔心對主要站點造成影響。

7. 針對高速緩存和緩存無效化(cache invalidation)

Mysteriousllama的一篇文章評論為我們提供了額外的經驗:如果沒有正確地緩存,又沒有有效的緩存失效策略,那數據庫就危險了。使用Redis和Memcache來緩存可能出現的一切,而且要切記:不到萬不得已,不要連接數據庫。確保你可以輕松使任何緩存無效化,保持事務原子性,避免系統在紊亂狀態下運行。通過鎖定,以確保當緩存無效時,數據庫不會堆滿同一查詢的多個副本。你或許會認為選擇數據庫中的查詢緩存可能同樣有效,但相信我,這不太可能。當然,除了緩存簡單的查詢,你還可以緩存更高級別的對象。

根據你對可靠性的要求,你還可能會考慮將緩存用作回寫和數據庫后臺的批處理寫入。由于多種因素的影響,這一般都要比單個寫入效率更高,許多大型網站都將這作為它們進行系統擴展的常用策略。

原文鏈接: Six Lessons Learned The Hard Way About Scaling A Million User System?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447973.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot 項目輸出 sql 到控制臺、 SpringBoot 中 Mybatis 打印 sql

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件,加入如下配置: logging.level.com.ex…

JS流程圖解決方案GoJS

GoJs簡介 一個實現交互類圖表(比如流程圖,樹圖,關系圖,力導圖等等)的JS庫 GoJS依賴于HTML5,所以請保證您的瀏覽器版本支持HTML5,當然還要加載這個庫。 首先個人建議先下載官方實例的 離線版本【…

VUE.JS 組件化開發實踐

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 前言 公司目前制作一個H5活動,特別是有一定統一結構的活動,都要碼一個重復的輪子。后來接到一個基于模板的活動…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou轉載于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升開發效率的十個工具

Git 之前也有過不少版本控制的工具。有好的,也有糟糕的。不過它們都或多或少地誤入歧途了。 這時候Git出現了。一旦你用上了這個神奇的工具,很難相像你還會碰到比它更好的了。 還沒用過Git?試一下吧。 Stack Overflow 真的,我沒…

Virtual Villagers 攻略

和大家分享一下這個游戲的攻略心得,希望對大家有幫助~~Puzzle 1 清潔水井(難度:簡單)將一個擁有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建設(難度:簡單)一開始會由一個掌握Building技能的村民…

input 框 去掉下面的提示文字、提示選項

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 我的一個輸入框總是有提示文字: 2. 去掉方法,給 input 加一個屬性: autocomplete"off"…

科學合理的減肥

1、科學安排一日三餐    在正常生理情況下,一般人習慣于一日三餐。人體最大消耗是在一天中的上午。由于胃經過一夜消化早已排空,如果不吃早飯,那么整個上午的活動所消耗的能量完全要靠前一天晚餐提供,這就遠遠不能滿足營養需要。…

解決: VUE 項目中表單提交中文亂碼、接口請求參數中文亂碼

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 表單提交出現亂碼: 接口請求亂碼同于上圖。 2. 解決: 在出現亂碼的內容外面加函數:decodeURI()…

大數據 — Hadoop

HDFS Hadoop 1.0: 3個組件: NamenodeSecondNamenodeDatanodenamenode(主節點,master,只有一個,單點故障的風險)中間存儲信息(元數據) 2種映射關系: path -> blockid l…

VUE:兄弟組件間傳參

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1、定義一個中間 eventBus.js ,只有 2 行代碼,用于傳參: // 此頁面是vue 巴士,用于兄…

C++的歷史

本文由 伯樂在線 - honpey 翻譯自 Albatross。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。C的歷史可以追溯到1979年,當時Bjarne Stroustrup(譯者注:C之父)正在準備他的博士畢業論文,他有機會使用一種叫做Si…

asp.net ajax的學習第一篇

自己理解的asp.net ajax的核心思想&#xff1a; javascript 調用web service <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />由于工作的原因&#xff0c;要在自己的網頁上使用無刷新技術&#xff0c;增加客戶體驗。開始學習asp…

insertSelective 和 insert 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、selective的意思是&#xff1a;選擇性。 2、insertSelective--選擇性保存數據&#xff1b; 比如User里面有三個字段:id&#xff0c;n…

病從口入 這樣吃小心癌癥找上門

腫瘤專家估計&#xff0c;大約有35%的致癌物質是經過飲食&#xff0c;30%是經過吸煙侵入體內的。僅此兩項已經占了致癌因素入侵人體的一半以上了。所以說&#xff0c;預防腫瘤&#xff0c;飲食首當其沖&#xff0c;第一步就要從入口的食物談起。 食管癌&#xff1a;腌制的咸…

VUE插件總結

UI組件 element - 餓了么出品的Vue2的web UI工具套件Vux - 基于Vue和WeUI的組件庫mint-ui - Vue 2的移動UI元素iview - 基于 Vuejs 的開源 UI 組件庫Keen-UI - 輕量級的基本UI組件合集vue-material - 通過Vue Material和Vue 2建立精美的app應用muse-ui - 三端樣式一致的響應式 …

解決:No goals have been specified for this build. You must specify a valid lifecycle phase or a goal i

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行打包命令報錯&#xff1a; No goals have been specified for this build. You must specify a valid lifecycle phase or a goa…

十個好習慣幫你理財省大錢

理財和收入高低其實是沒有關系的&#xff0c;僅和生活習慣相關。有了好的理財方法&#xff0c;也可以攢下自己的錢&#xff0c;達到財務自由的境界。下面是一些理財的技巧? 1、定時積極的存款 怎樣開源節流是理財的第一步。增加收入來源&#xff0c;算好該存的錢&#xff0…

生成隨機碼,保存隨機文件.

PrivateFunction GetRandomizeNo()Function GetRandomizeNo() As Integer 功能說明:生成隨機驗證碼 Dim RandomizeNo As Integer Randomize() RandomizeNo 9999 * Rnd() 1000 If (RandomizeNo).ToString.Length > 5 Then R…

解決:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)問題&#xff0c;即在mybatis中dao接口與mapper配置…