memcached在大负载高并发网站上的应用

news/2024/5/8 18:13:03/文章来源:https://blog.csdn.net/xiang_fu/article/details/84155521
转自:http://wangzebin.blog.51cto.com/653300/128235 原文作者:王泽宾


大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过。
这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现在或以后的工作有所帮助,笔者将感到无比荣幸。
我要介绍的内容包括以下几个方面:
1、memcached的简介
2、memcached的应用场景
3、memcached的安装
4、memcached的使用
5、memcached的部署架构
6、memcached的局限性
7、memcached的改进
一、简介
1.1 背景
memcached是一个高性能、分布式的内存对象缓存系统。
memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可)。像 facebook,youtube,yahoo,sina,sohu,netease,豆瓣等网站均或多或少使用了该项产品。memcached在以用户 为中心的网站上,表现尤其突出,例如sns,blog等web2.0应用的站点。这些站点一般来讲,特别注重用户体验,用户对服务器的响应速度要求很高, 用户数据相对比较复杂、关连度比较高,需要经常对数据库进行更新和检索。
memcache是danga.com几个开源项目中的一个,最初是专门为livejournal.com站点而开发的,当时这个站点日pv达到了千万 级,在使用过程中出现了很多的与负载和响应速度相关的问题,于是开发了这个项目,旨在改善网站当时的困境。memcache可以应对任意多个连接,使用非 阻塞的网络IO。它的使用非常简单和方便,最常用的功能不超过5个方法。
memcache官方网站:http://www.danga.com/memcached
1.2 特点
1、高性能
无论哪一种数据库dbms(mysql,oracle,mssql,db2,Postgres等等),再怎么优化,最终也避不开与慢速的存储介质(硬盘、 磁带)进行数据交换,但往往一旦涉及到了存储介质的io操作,存取性能就会急剧下降。memcached,顾名思义,它的全部操作自始至终都是在内存中进 行的,所以存取数据的效率非常高。
当然,通常情况下,大型网站对于数据库的操作都会做优化。通常的手段有两种:
a、读写数据分离,采用主/辅库的方式,来分散数据库的压力,提高查询速度。
b、按照业务特点横向或者纵向分割数据库。简单来讲,就是大库变小库,大表变小表,来提高数据库访问的效率。一般来讲,一个数据库具有很多表或者一张表有 N多的记录,都会明显的降低数据库的服务能力,比如mysql数据库单表记录达到2000万条左右(笔者以前的工作经验),性能会下降到几乎无法忍受。关 于数据库的设计和优化,我们以后可以单独做一个专题,这里不做太多的研究。
数据库会在以下情况下会出现访问瓶颈:
a、事务操作
企业级的数据库(比如mysql的innodb模式)都支持事务操作。由于事务具有原子性,事务中涉及的数据表在运行过程中将会加锁。在这种情况下,访问这些表的数据会出现延迟。
b、数据更新
数据库中任何的表在数据更新过程中,同样会被加锁。在这种情况下,也会出现上面同样的结果。
memcached的操作基本上就不会存在以上情况(实际上也有加锁的情况,在后面再详细探讨),所以它的性能非常高。官方网站上对它的正式评价是very fast。事实上也是如此,相关的实验室测试对比结果,大家可以到网上搜索一下,比比皆是。
2、分布式
所谓分布式系统比较专业的解释是:
一种计算机硬件的配置方式和相应的功能配置方式。它是一种多处理器的计算机系统,各处理器通过互连网络构成统一的系统。系统采用分布式计算结构,即把原来 系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻 辑结构。
memcache的分布式特性主要表现在两个方面:
a.memcache客户端mc和服务器端ms可以单独安装在任何独立server上。
当然部署在同一台server上也没问题,甚至于一台机器上可以部署n个memcached。
b.memcache服务器端ms可以安装在任意数量的server上,提供并行存储和计算的能力。
这是分布式特性的本质体现。ms可以形成任意多台server组成的集群,为mc提供服务。

1.3 用途
1、提高系统的并发能力
2、减轻数据库的负担
这两种用途其实非常容易理解。由于memcached高性能,所以可以同时服务于更多的连接,大大提高了系统的并发处理的能力。另外,memcached 通常部署在业务逻辑层(前台应用)和存储层(主指数据库)之间,作为数据库和前台应用的数据缓冲,因此可以快速的响应前端的请求,减少对数据库的访问。
以下是一个memcached部署的逻辑示意图,其中mc是指memcached client,ms是指memcached server:
1.4 工作机制
Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端首先与 Memcached 服务建立连接,然后存取对象。每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存的时候还可以设置有效期。保存在 Memcached 中的对象实际上是放置在内存中的,而不是在硬盘上。Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请一块,而不是每次需要的时候去向操作系统申请。Memcached将对象保存在 一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时候, Memcached的时间消耗基本上只是网络Socket连接了。
Memcached按照LRU方式调度数据。LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU算法在实际的工作环境中会与操作系统相关,比如32位的操作系统,最大 的寻址空间是4G,如果当前内存的使用超过了这个限度,将被调出内存,内存中总维持最新最常用的数据。64位操作系统大大扩展了内存的寻址能力,所以现在 很memcached服务都是运行在64位系统上。

写这篇文章之前,我也特意跟以前的同事做了一些交流,在此感谢sina xiangdong、kingsoft zhangyan和yahoo luke。另外,还有网上的朋友对我上一节的文章发表了许多有建设性评论,在这里一并感谢。
memcached最吸引人的地方主要在于它的分布式。分布式对于互联网应用来讲,按照用途基本上可划分为三种方式:分布式计算、分布式存储和两者兼而有 之。memcached是分布式存储的一种。我们常见的分布式存储大多数是将N台设备(server或者单独的存储)构建成盘阵,而memcached旨 在构建一个高速的内存池。更通俗一点来讲:分布式计算是将N颗cpu组装成一颗cpu,分布式慢速存储是将N个硬盘组装成一个大硬盘,memcached 是将N块内存组装成一块大内存。
有个朋友问:那是不是代价很昂贵啊。我的回答是肯定的。如果你的网站规模只有三两台服务器的话,我觉得你就不用考虑这样的方案了,等你的网站做大了以后, 再参考这方面的资料即可。一般都是比较大的互联网公司为了追求更好的用户体验,才进行这方面的投资,对他们来讲,用户体验至上,money是小case。
还有朋友问:有一些dbms提供内存表的功能,比如mysql的内存表,可以代替memcached。但我要建议你的是:mysql的内存表确实起到同样的作用,但它的局限也很多,往往不能让你随心所欲,所以建议你不要走弯路。

二、memcached的应用场景
2.1 应用范围
memcached产品或相关技术的应用,我们在前面已经提到了一些。其实它的应用还是非常普遍的,应用作为广泛的领域:例如sns类网站、blog类网站、bbs类网站以及im后台服务。

2.2 sns类网站的应用
livejournal.com是99年始于校园中的项目,有点像中国的校内网。几个学生纯属出于爱好做了这样一个网站,主要实现以下功能: sns、blog、bbs和rss等。livejournal从建立开始就采用了大量的开源软件,到现在它本身也衍生了不少开源软件。 sns网站,现在比比皆是,规模比较大的象开心、校内、51,它们的页面上往往需要引用大量的用户信息、好友信息以及文章信息等,所以跨表或跨库操作会相 当多。如果这些功能全部直接操作数据库,显然会带来极大的效率损耗和系统负载。memcached在这样的场景下就会发挥巨大的作用,它采用大内存把这些 不变的数据全都缓存起来,当数据修改时就通知cache过期,这样应用层基本上就可以解决大部分问题了,只有很小一部分请求穿透应用层,用到数据库。
2.3 blog、bbs类网站的应用
象blog.sina.com.cn这些流量巨大的blog系统,它需要频繁读写的一些小数据。其中最典型的应用,我们通常成为“数字类服务”,比如 blog中需要实时显示的用户点击数和阅读数,bbs中需要记录的在线人数、在线用户等。这些小数据的处理非常繁琐,你无论怎么去设计数据库,都很难避开 跨表或者跨库。有的朋友会说,可以在数据库中增加冗余字段解决这类问题,但事实上,这既不符合数据库设计的范式规则,也很难做到数据的一致性,由此会引发 更为复杂的问题。而且由于产品线的分散发展,数据已经很难做到完全的统一规划。memcached在这样的场景下就会将这些小数据进行缓存,定期持久化就 可以了,查询操作一直都在内存中运行。说到这里,有的朋友又会想到一些其它的问题:“memcached server宕机了怎么办,怎么保证与数据库的数据一致”。我会对你说:“你的问题非常好,我们将会在后面章节给出相应的解决方案”。另外,其实这种小数 据并不是关键性数据,即使偶尔发生点错误,也没太大的问题。blog、bbs系统并不是严格的企业级系统,假如你是为银行业务提供解决方案的 话,memcached并不适合。
2.4 im server的应用
前些时间, 有一些文章介绍memcached 在Jabber上应用。写累了,喝口水,读者自己去找找资料吧,有时间的话,帮我补上吧,呵呵。

我们举了几个例子来说明memcached的应用场景,似乎都局限于小数据服务,那是不是就不能用于较大数据的缓冲了?那绝不是,memcached能够 用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等等,而且生产环境中就这么跑过,只不过让大数据量使用缓冲的话,有点太浪费了,同样 数量的内存存不了几条数据,所以会明显的降低命中率。

待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_815049.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发 高负载 网站系统架构

注:我看到这篇文章写的太好了,可以没法转到CSDN上我就COPY了,看到下面激烈的评论,我也一并COPY了。不过还是要谢谢哪位作者了。这样的文章很少。 转自:http://www.toplee.com/blog/71.html 我在CERNET做过拨号接入平…

利用IIS日志追查网站入侵者

以前黑站黑了很多,但是就没有想过会不会被追踪到,都没有想过怎么去擦自己的屁股,万万没想到在自己不再黑站的时候,却发现了自己的BBS被黑了。根据当初的判断,BBS程序是我们BCT小组成员编写的Lvbbs不会存在着上传漏洞和…

大型互联网站解决海量数据的常见策略

信息时代,海量数据处理已成为一个老话题,今天看到一篇不错的文章,分享给大家 大型互联网站的数据存储与传统存储环境相比不仅是一个服务器、一个数据库那么简单,而是由网络设备、存储设备、应用服务器、公用访问接口、应用程序 等…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

2022-2028全球求职网站行业调研及趋势分析报告

据恒州诚思调研统计,2021年全球求职网站市场规模约 亿元,2017-2021年年复合增长率CAGR约为 %,预计未来将持续保持平稳增长的态势,到2028年市场规模将接近 亿元,未来六年CAGR为 %。 本文调研和分析全球求职网站发展现状…

Silverlight实例秀——可切换视图的DataTemplate(做网站必备技术)

Silverlight实例秀——可切换视图的DataTemplate(做网站必备技术) 小序: 敏捷开发也是要有个度的。搞敏捷,最起码的限度是程序员要对手里使用的工具比较精通。 相信大家都见过这个场景: 问:“你在做什么…

python 爬取数据还要下载scrapy吗_在Python3.5下安装和测试Scrapy爬网站

本帖最后由 xandy 于 2017-3-2 16:13 编辑1. 引言Scrapy框架结构清晰,基于twisted的异步架构可以充分利用计算机资源,是爬虫做大的必备基础。本文将讲解如何快速安装此框架并使用起来。2. 安装Twisted2.1 同安装Lxml库(参考《为编写网络爬虫程序安装Pyth…

在PEA上海做演讲主题:大型、高负载网站架构和应用初探

主题:大型、高负载网站架构和应用初探时间:30-45分钟 开题:163,sina,sohu等网站他们有很多应用程序都是PHP写的,为什么他们究竟是如何能做出同时跑几千人甚至上万同时在线应用程序呢? 挑选性能更好web服务器 单台 Apache web se…

通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转载)

ASP.NET 成功的其中一个原因在于它降低了 Web 开发人员的门槛。即便您不是计算机科学博士也可以编写 ASP.NET 代码。我在工作中遇到的许多 ASP.NET 开发人员都是自学成材的,他们在编写 C# 或 Visual Basic 之前都在编写 Microsoft Excel 电子表格。现在,…

网站最大并发数以及服务器配置预估

一.评测网站常用的一些术语: 以www.qq.com为例子,我们可以在站长之家输入www.qq.com获得结果: 日均ip:每天有多少个ip访问qq,我们可以看到qq是接近六千万,然后用的人远不止这些,因为如果在一个…

大型网站架构演变和知识体系

在这篇文章中将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的[urljavascript:;]知识[/url]体系,希望能给想从事互联网行业的同学一点初步的概念,:),文中的不对之处也请各位多给点建议,让本文真…

优化网站设计(十一):避免重定向

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过,我在不同的场合也分享过这样的话题。 作为通用的原则,雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices f…

普通电脑可以搭建时序数据库吗_如何搭建网站?网站建设需要做哪些准备?

搭建一个网站需要哪些准备?如何搭建属于自己的网站?今天蝈蝈录制了一个视频,从域名注册、域名备案、域名解析、服务器购买、服务器配置搭建、上传代码等方面全过程讲解如何搭建一个网站。如果你是专业人士,请忽略,如果…

大型网站的灵魂——性能

前言 在前一篇随笔《大型网站系统架构的演化》中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个大型网站的轮廓,但想要掌握设计开发维护大型网站的技术,需要我们一步一步去研究实践。所以我…

购物网站讨论1:关于模型那些事

写在最前面:购物网站案例下载 -------------------------------------- 1.这些类对应的业务实体是什么? 2.如何实现数据库连接? 3.类之间的关系是如何的? 4.如何启动数据库迁移? 百度自学知识点:启用自动数…

访问页面要看什么数据包_SEO怎么对页面标题优化,页面优化要注意什么?

页面的标题主要是规定了一些网页的内容,然后去告诉搜索引擎蜘蛛这个页面的大概内容,页面标题也就是搜索引擎来判断页面内容的主要参考信息,这就是网页优化最重要的因素。SEO去优化页面标题可以从下面几方面入手(1)相关且准确每个页面标题都要…

linux服务器打包文件,linux系统怎么进行文件打包_网站服务器运行维护,linux,文件...

linux系统怎么打开终端_网站服务器运行维护linux系统打开终端的方法是:1、使用快捷键【ctrlaltt】打开终端,linux支持多终端,可以一次性打开多个终端;2、通过【search your computer】功能搜索terminal。打包(.tar):tar -cvf Pro.…

建立安全审计用户_高校数据安全解决方案-网站版

一、 背景介绍高校网络中的数据一般包括网站数据、教学资源、图书资源、教务管理数据、办公资源、财务管理数据等,如教职工信息、学生信息、教学信息、科研信息、资产信息、图书借阅信息、师生消费信息和上网信息等各种数据内容。学校的招生就业、财务、资产数据等等…

idm 爬取网站 跳转路径_使用IDM批量抓取音效素材下载

IDM下载器的站点抓取功能,能够抓取网站上的图片、音频、视频、PDF、压缩包等等文件。更重要的是,能够实现批量抓取操作,省时省力。今天就来看一下,如何用IDM巧妙的批量抓取音效素材。1、进入音效合辑界面,复制链接地址…

html 树形结构_做SEO如何优化网站结构提高网站排名

做SEO如何优化网站结构提高网站排名?最近刚进一家新公司,职位是SEO优化主管。接手工作后,看了看自己负责的网站,说句实话,真心不想看。整个网站的界面用户体验太差了,打开网站给我的第一感觉就是这个网站是…