百万用户规模的系统如何扩展

摘要:系统扩展一直是个让人头疼的事情,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.mzph.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配置…