让memcached和mysql更好的工作

来源: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,更多参考

http://www.cnblogs.com/cy163/archive/2009/08/12/1544127.html

时间: 2024-11-06 01:01:50

让memcached和mysql更好的工作的相关文章

2018年想要更高的工作效率吗?可以认识这些管理软件

2018年想要更高的工作效率吗?可以认识这些管理软件 为了聊天,你认识了微信:为了打车,你认识了滴滴:为了吃饭,你认识了美团:为了追剧,你认识了优酷:为了工作更加高效,我觉得你应该认识一下点晴技术公司的管理软件. 点晴技术公司的管理软件覆盖各行各业: 点晴OA办公系统:国内真正永久免费的OA办公自动化软件,而且是不限用户数,不限功能模块,提供免费的通用服务和系统升级,功能模块覆盖企业管理90%以上的中小企业主要管理单元,适合所有行业企事业单位的OA办公系统. 点晴IM即时通讯:这个是点晴免费OA

提升研发效率和体验,更爽的工作

相信有很多人和我一样,在日常工作中会碰到各种各样让人抓狂的事,但是生活还得继续,虽然有很多事我们改变不了,比如公司规定,团队成员,工作环境等等,但幸好还有些事我们能改变,比如我们自己.一直都想写一篇关于如何改进个人和团队的工作细节,以便提高工作效率的文章,刚好最近在极客时间上听了葛俊老师的课程<研发效率破局之道>,找到了很多共鸣,也受到了很多启发,结合自己的实践一并分享出来. 我不会在这篇文章中聊团队管理,敏捷实践之类高深的话题,只是会聊一些简单又实用的方法和工具,但是相信我,这些方法和工具能

memcached和MySQL的query cache相比

把memcached引入应用中,还是需要不少工作量的.MySQL有个使用方便的query cache,可以自动地缓存SQL查询的结果,被缓存的SQL查询可以被反复地快速执行.Memcached与之相比,怎么样呢?MySQL的query cache是集中式的,连接到该query cache的MySQL服务器都会受益. * 当您修改表时,MySQL的query cache会立刻被刷新(flush).存储一个memcached item只需要很少的时间,但是当写操作很频繁时,MySQL的query c

Memcached+PHP+Mysql+Linux 实践

首先确保你的服务器环境已经具备了memcached和lamp,关于在Linux上搭建memcahced+php环境可以参考我的另外一篇帖子( http://www.cnblogs.com/codeAB/p/5591118.html )在往下看之前你应该带着这几个疑问.{ memcached 能解决什么问题 }{ 现在比较热议的一个话题 radis替代memcached  }{ 什么情况下适合使用memcached }{ memcached基本用法 }{ 利用memcached构建分布式缓存系统

Mysql主从复制作用和工作原理

一.什么是主从复制 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库.在最常用的mysql数据库中,支持单项.异步赋值.在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器:此时主服务器会将更新信息写入到一个特定的二进制文件中.并会维护文件的一个索引用来跟踪日志循环.这个日志可以记录并发送到从服务器的更新中去.当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置.然后从服务器会接收

猎头,希望您能更理解找工作的人

这些日子找工作,接触到了很多很多猎头,曾经看过一篇文章说,猎头喜欢和什么样的人打交道,不喜欢和什么样的人打交道,而我恰好是猎头喜欢的那种类型,因此,平均每天都会有一个新的猎头找到我. 猎头这个职业,其实表面上看是一种服务行业,但实际上我认为它是一种具有"马太效应"的人脉关系网.所谓供需关系,有需求就会有供给,前些天看过一篇报道,说现在IT市场上每年的人才需求量在30万,而每年从各大互联网行业流动出来的也就只有10余万,那毫无疑问,这流动出来的IT人才将会有不少的选择机会,因此猎头这个行

[开源].NET CORE与MySql更配, MySqlSugar ORM框架 3.x

MySqlSugar 3.X API 作为支持.NET CORE 为数不多的ORM之一,除了具有优越的性能外,还拥有强大的功能,不只是满足你的增,删,查和改.实质上拥有更多你想像不到的功能,当你需要实现某个功能时会发现有这个功能太棒了. 所有版本 ASP.NET 4.0+ MSSQL https://github.com/sunkaixuan/SqlSugar ASP.NET CORE MSSQL https://github.com/sunkaixuan/ASP_NET_CORE_ORM_Sq

mac开机启动apache、memcached与mysql

一.开机自动启动apache方法 #sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist //开机启动 #sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist //关闭启动 二.开机自启动memcached方法 centos下设置开机自启动某个服务,只需要把启动服务对于的命令添加到/etc/rc.l

zookeeper,kafka,jstorm,memcached,mysql流式数据处理平台部署

一.平台环境介绍: 1.系统信息: 项目 信息 系统版本: Ubuntu14.04.2 LTS \n \l 用户: ***** 密码: ****** Java环境: openjdk-7-jre 语言: en_US.UTF-8,en_US:en 磁盘: 每台vda为系统盘(50G),vdb为数据盘(200G)挂载于/storage目录 hcloud15最为DB,第二块磁盘为2000G 主机范围: 192.168.21.7~192.168.21.15,192.168.21.17,192.168.21