来源:http://chaoqun.17348.com/2008/08/memcached_work_with_mysql
这次是Fotolog的经验,传说中比Flickr更大的网站,Fotolog在21台服务器上部署了51个memcached实例,总计有254G缓存空间可用,缓存了多达175G的内容,这个数量比很多网站的数据库都要大的多,原文是A Bunch of Great Strategies for Using Memcached and MySQL Better Together,我这里还是选择性的翻译以及按照我的理解补充,感谢Todd Hoff,总能给我们一些学习的案例,从这里也能看出国外技术的开放态度,不似我们,其实就那么点小九九还藏着掖着,好了,进入正题。
一、关于memcached
还不知道这个?那你去面试的时候要吃亏了,赶紧去官方网站看一下http://www.danga.com/memcached/,另外google一下用法,硬盘总是太慢,把数据存在内存里面吧,如果你只有一台服务器,推荐用一下APC(Facebook在用)或者eaccelerator或者Xcache(国人开发的),这些产品单机效果更好,如果你需要分布式的缓存方案,那么用memcached吧。
二、memcached如何与mysql并肩作战?
- 通过数据库分片来解决数据库写扩展的问题把数据库分片,部署到不同的服务器上,免得只有一个主服务器,写操作成为瓶颈以及可能有的“单点故障”,一般的数据库分片主要是按照业务来分,尽可能的拆分业务,不相干的都独立起来做成服务也好
- 前 端mysql和一堆memcached服务器来应付读的问题应用程序首先从memcached中获取数据,获取不到再从数据库中获得并保存在 memcached中,以前看过一篇文章说好的应用95%的数据从memcache的中获得,3%的数据从mysql的query cache中获得,剩下2%才去查表,对比一下你的应用,差距有多远?
- 通过mysql复制(master-slave)来解决读的问题
首先mysql数据库通过master-slave读写分离,多个slave来应对应用程序读的操作。
三、为什么不用mysql的query cache?
我们都知道mysql有个query cache,可以缓存上次查询的结果,可实际上帮不上太多的忙,下面是mysql quety cache的不足:
- 只能有一个实例
意味着你能存储内容的上限就是你服务器的可用内存,一台服务器能有多少内存?你又能存多少呢?
- 只要有写操作,mysql的query cache就失效
只要数据库内容稍有改变,那怕改变的是其他行,mysql的query cache也会失效
- mysql的query cache只能缓存数据库数据行
意味着其他内容都不行,比如数组,比如对象,而memcached理论上可以缓存任何内容,甚至文件^_^
四、Fotolog的缓存技术
- 非确定性缓存你不确定你要的数据缓存中有没有,你也不知道是不是过期了,于是你就试探性的问memcached,我要的什么 什么数据你那有吗?我可不要过期的数据啊,memcached告诉你说有并且给你,你就开心了,如果没有呢,你就要从数据库或者别的地方去获取了,这是 memcached典型的应用。主要应用在:
1.复杂的数据需要多次读取,你的数据库做了分片处理,从多个数据库中获取数据并组合起来是一个非常大的开销,你大可以把这些数据取出来之后存到memcached中
2.mysql query cache的一个好的替代方案,这样数据库其他部门改变了,只要自己没改变就没问题(注意数据库更新的问题,后面会提到)
3.把关系或者列表缓存起来,比如某个栏目下的多篇文章列表
4.被多个页面调用并且获取起来很慢的数据,或者是更新很慢的数据,比如文章浏览排行榜
5.如果cache的开销超过重新获取的开销,那么不要缓存它吧
6.标签云和自动建议(类似google sugest)
例如:当一个用户上传一个图片,这个用户的好友页面上都要列出这张图片来,那么把它缓存起来吧。
潜在问题:
memcached消耗的主要是服务器内存,对CPU消耗很小,所以Fotolog把memcached部署在他们的应用服务器上(貌似我们也是这样),他们遇到了CPU搞到90%的使用率(怎么会那么高?哪出问题了吧)、内存回收(这是个大问题)等等问题。
- 状态缓存把应用服务的当前状态存在memcached中主要应用在:
1.“昂贵”的操作,开销大的操作
2.sessions会话,Flickr把session存在数据库中,个人感觉还是存memcached比较“便宜”些,如果memecached服务器down掉了,那么重新登录吧。
3.记录用户在线信息(我们也是这样做的)
- 确 定性缓存对于某些特定数据库的全部内容,都缓存到memcached,有一个专门的应用服务来保障你要的数据都在memcached中,其他应用服务直接 从memcached中获取数据而不去取数据库,因为数据库已经全部保存到memcached中并保持同步。主要应用在:
1.读取伸展,所有的读取都从memcached中获得,数据库没有负载
2.”永不过期“(相对的)的数据,比如行政规划数据,变动很小吧
3.经常调用的内容
4.用户的认证信息
5.用户的概要信息
6.用户的参数设置
7.用户当前常用的媒体文件列表,比如用户的图片
8.用户登录,不走数据库,只走memcached(个人觉得这个不太好,登录信息还是需要持久化的,用类似BDB这样效果也不错)
使用方式:
1.多个专门的缓存池而不是一个大的缓存服务器,多个缓存池保障了高可用性,一个缓存实例挂掉了走其他的缓存实例,所有的缓存实例挂掉了,走数据库(估计数据库抗不住^_^)
2.所有的缓存池都用程序来维护,比如数据库有更新时,程序自动把更新后的内容同步到多个缓存实例中
3.服务器重启之后,缓存要比网站先启动,这就意味着当网站已经启动了,所有的缓存都可用
4.读取的请求可以负载均衡到多个缓存实例中去,高性能,高可靠性
潜在的问题:
1.你需要足够多的内存来存储那么多的数据
2.数据以行记录数据,而memcached以对象来存储数据,你的逻辑要把行列的数据转换成缓存对象
3.要维护多个缓存实例非常麻烦,Fotolog用Java/Hibernate,他们自己写了个客户端来轮询
4.管理多个缓存实例会增加应用程序的许多开销,但这些开销相对于多个缓存得到的好处来说算不了什么
- 主 动缓存数据魔法般的出现在缓存中,当数据库中有更新的时候,缓存立马填充,更新的数据被调用的可能性更高(比如一篇新文章,看的的人当然多),是非确定性 缓存的一种变形(原文是It’s non-deterministic caching with a twist.我觉得这样翻译怪怪的)。主要应用在:
1.预填充缓存:让memcached尽可能的少调用mysql如果内容不展现的话。
2.“预热”缓存:当你需要跨数据中心复制的时候
使用步骤:
1.解析数据库更新的二进制日志,发现数据库更新时对memcached也进行同样的更新
2.执行用户自定义函数,设置触发器调用UDF更新,具体参考http://tangent.org/586/Memcached_Functions_for_MySQL.html
3.使用BLACKHOLE策 略,传说中Facebook也用mysql的Blackhole存储引擎来填充缓存,写到Blackhole的数据复制到缓存中,Facebook用这来 设置数据作废以及跨国界的复制,好处是数据库的复制不走mysql,这就意味着没有二进制日志以及对CPU使用不那么多(啊?难道通过memcached 存储二进制日志,然后复制到不同的数据库?有经验的同志在这个话题上可以补充。)
- 文件系统缓存把文件直接缓存在memcached中,哇,够BT的,减轻NFS的负担,估计只缓存那些过于热门的图片吧。
- 部分页面内容缓存如果页面的某些部分获取起来非常费劲,以其缓存页面的原始数据还不如把页面的部分内容直接缓存起来直接调用
- 应用程序级别的复制通过API来更新缓存,API的执行细节如下:1.一个应用把数据写到某个缓存实例,这个缓存实例把内容复制到其他缓存实例(memcached同步)
2.自动获得缓存池地址以及实例个数
3.同时对多个缓存实例更新
4.如果某个缓存实例down掉了,跳到下一个实例,直到更新成功
整个过程非常高效以及低开销
- 其他技巧1.多节点以应对”单点故障”2.使用热备技术,当某个节点down掉了,另外一台服务自动替换成它的IP,这样客户端不用更新memcached的IP地址
3.memcached可以通过TCP/UDP访问,持续连接可以减轻负载,系统设计成可同时承受1000个连接
4.不同的应用服务,不同的缓存服务器群
5.检查一下你的数据大小是否匹配你分配的缓存,更多请参考http://download.tangent.org/talks/Memcached%20Study.pdf
6.不要考虑数据行缓存,缓存复杂的对象
7.不要在你的数据库服务器上跑memcached,两个都是吃内存的怪兽
8.不要被TCP延迟困扰,本地的TCP/IP对内存复制是做了优化的
9.尽可能的并行处理数据
10.并不是所有的memcached的客户端都是一样的,仔细研究你用的语言所对应的(好像php和memcached配合的不错)
11.尽可能的是数据过期而不是使数据无效,memcached可以设定过期时间
12.选择一个好的缓存标识key,比如更新的时候加上版本号
13.把版本号存储在memcached中
作者最后的感言我就不翻译了,貌似mysql proxy正在做一个项目,自动同步mysql以及memcached,更多参考
MemAdmin
基于 PHP5 & JQuery 的 Memcached 管理监控工具
MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单。
主要功能:
- 服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新
- 服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控
- 支持数据遍历,方便对存储内容进行监视
- 支持条件查询,筛选出满足条件的KEY或VALUE
- 数组、JSON等序列化字符反序列显示
- 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外)
- 支持服务器连接池,多服务器管理切换方便简洁
http://www.junopen.com/memadmin/memadmin-1.0.10.tar.gz
相关推荐
还会涵盖事务处理、备份恢复和安全性等方面,帮助开发者更好地管理数据存储。 memcached是一款高性能的分布式内存对象缓存系统,常用于缓解数据库负载,提高Web应用的响应速度。在书中,读者将学习到如何安装和配置...
标题 "Wrox.Developing.Web.Applications.with.Perl.memcached.MySQL.and.Apache.Jul.2009" 暗示这是一本关于使用Perl、...通过深入学习这些技术,开发者不仅可以提升工作效率,还能为用户带来更好的在线体验。
通过两篇文章《Memcache 和 mysql 交互流程操作原理》和《让 memcached 和 mysql 更好的工作》,我们可以深入了解如何使用 Memcached 与 MySQL 配合工作。 为了监控和分析 Memcached 的运行状态,我们可以利用其...
这些数据库在不同的应用场景下各有优势,理解和掌握它们能帮助我们更好地设计、实现和优化数据存储方案。 1. MySQL:MySQL是一款开源、免费的关系型数据库管理系统,广泛应用于Web应用。它支持SQL标准,具有高效率...
【搭建集群Web环境详解】 在当前的Web开发领域,LAMP(Linux + Apache + MySQL + PHP)架构是最常见的选择,但对于处理大量用户访问的场景,...不断学习和优化,才能让我们的Web服务更好地应对不断增长的用户需求。
Memcached是一款广泛使用的开源分布式内存缓存系统,它旨在缓解数据库负载,提高Web应用程序的性能。Memcached-1.49版本是这个...学习源代码也是提升软件工程师技能的重要途径,能帮助他们更好地理解和解决实际问题。
在互联网的大规模应用中,为了提升性能和数据读写的高可用性,经常会采用将部分数据缓存在内存中(例如使用memcached)以及数据库的读写分离和主...这样的开发模式可以更好地应对高并发的场景,并提高系统的整体表现。
2. 在高写入频率的场景下,memcached能够更好地保持数据的缓存状态,而MySQL的querycache则会频繁失效。 3. 在多核CPU环境下,MySQL的querycache会遇到扩展性问题,因为它引入了全局锁来管理缓存,而memcached则不...
3. 更好的扩展性:在多核CPU环境下,memcached不会像MySQL的query cache那样遇到全局锁的问题。 缺点: 1. 需要额外工作量集成:与MySQL的query cache相比,将memcached引入应用需要更多开发工作。 2. 缓存失效:...
在本篇文章中,我们将详细探讨在CentOS环境下安装和配置Nginx 0.8.52、PHP 5.3.3、MySQL 5.5.6以及Memcached 1.4.5这一系列软件的过程,同时还会对配置进行优化以达到提升性能的目的。这些技术组件共同构成了一个...
- 对于大型或高流量网站,Memcached的灵活性和水平扩展能力使其成为更好的选择。 总之,Memcached是一种强大的缓存技术,尤其适用于需要高度可扩展性的场景。通过对其实现原理的理解,我们可以更好地评估其适用性和...
2.4.9 版本引入了若干性能优化和安全改进,包括更好的模块多路复用、更高效的事件处理模型以及对 HTTP/2 的初步支持。这对于开发者来说意味着更快的响应速度和更安全的网站运行环境。 **MySQL 5.6.17** MySQL ...
搭建一个高效的服务器集群是IT行业中常见的任务,特别是对于高流量的Web应用来说,这能确保稳定性和可扩展性。...通过合理的硬件部署和软件配置,能有效提升网站的性能,降低服务器压力,提供更好的用户体验。
MySQL的新版本通常包含更好的性能和更好的优化技术。因此,使用最新版本的MySQL是提高性能的一个简单方法。 ## 2. 为MySQL服务器配置合适的硬件 MySQL的性能很大程度上取决于服务器的硬件配置。确保服务器具有充足...
为了帮助用户更好地安装和使用MySQL,本知识点将从多个方面对MySQL进行详细介绍,以便新手用户快速上手,同时为经验丰富的用户提供更深层次的参考。 1. MySQL简介及发展历程 MySQL是一个关系型数据库管理系统...
在IT行业中,Go语言因其高效、简洁的语法和强大的并发能力,被广泛应用于后端开发。本主题将探讨如何在Go环境中操作...通过不断学习和实践,你可以更好地理解和运用这些技术,为你的项目提供强大而稳定的后端支持。
MySQL 5.7是MySQL数据库管理系统的一个重要版本,它在5.6的基础上进行了多项改进和增强,以提供更高效、安全且功能丰富的数据库服务。...同时,了解和利用上述的新特性和改进,可以帮助你更好地管理和利用MySQL数据库。