2011年初Marc Kwiatkowski通过Memecache@Facebook介绍了Facebook的Memcache架构,现在重新审视这个架构,仍有很多方面在业界保持先进性。作为weibo内部数据处理量最大,对数据延迟最敏感的部门,基于本厂2年多来对mc的使用心得,我在本文总结对MC架构的一些新思考。
1. Memcache使用中的雷区
通常你可能考虑不到,但又隐藏在某处等着你踩的称之为“雷”。
带宽和连接数
Memcache具有很高吞吐能力,Memecache@Facebook中介绍Memcache支持8万/s读和2万/s写,在weibo内部我们通常认为单个Memcache实例支持7w/s读,2w/s写是安全的。和Facebook一样,为了充分榨取服务器性能,我们会在一台物理机上部署多个Memcache。为了确保Memcache的正常工作,我们通常会通过定期执行MC stats命令来对内存使用量,踢出率,命中率等进行监控。比如微博早期监控中就包括如图所示的这些内容,
这些监控中我们最重视的往往是内存使用量和命中率。但随着前端服务不断增加和cache层不断扩容,单台缓存物理机上的连接数,带宽都成为新的瓶颈。因此必须重视对带宽和连接数的监控。Memecache@Facebook中介绍单台MC服务器可支撑10w连接。
Hot Key
Hot Key通常不常见,但Weibo和Facebook都遇到这类问题,简单的讲就是在大并发下,有大量的请求到同一个在MC中不存在的资源,然后全部read through到后端数据库,把数据库读跨。具体方法请见TimYang的博客:http://timyang.net/programming/memcache-mutex/,同时后面的讨论也很精彩。不过我查阅大量微博代码却没有发现有使用MC mutex,也就是说Hot Key是个不常见的问题,一个不容易踩到的雷。
Memcache Client
不记得是不是在Memecache@Facebook提到过,也和淘宝的同行交流过,共同的的经验是:Memcache优化的重点和难点在客户端。这个展开起来很大,概况讲有2个重点:(1)TCP连接池(2)基于NIO的multiget;可以参考我的另一篇文章:通过NIO实现Memcached multi get (http://maoyidao.iteye.com/blog/1739282)
2. Memcache集群是否支持线性扩容?
扩容问题之一:如果不降低命中率?
扩容Memcache不降低命中率,好像在高速路上给汽车换轮胎。
我们通常从课本上学到的是,前端采用一致性Hash,逻辑节点达2^32个,物理节点扩容也不会导致大量cache命中移动。一致性Hash足以应对大多数场景,但在微博业务中,每秒超过十几万次读,及时下降1%的命中率也会直接读跨数据库,因此我们的要求是扩容不能降低命中率。为达到该目的,我们把水平扩展,变为垂直扩展,即通过多层Cache解决扩容而同时不降低命中率的问题。
另外一个好处是,新加入的cache层无需预热,当线上服务出现意外高峰时,可以立刻投入使用。
扩容问题之二:Memcache集群具备水平扩展性吗?
随着缓存层的增长,数据被分散到更多缓存服务器上,获取相同信息需要发送的网络包的数量也在不断增长。比如,只有一台缓存服务器时,由于操作系统网络层发送缓冲区的设计,get 100个key的数据可以在一个IP packet中传输,结果可以也可以在一个IP packet中获取。但当有100台缓存服务器时,获取100个key的数据就有需要向100台服务器发送100个IP packet(假设100个数据均匀的分布在100台物理机上),相应的内核中断也显著增加。
因此,我不认为Memcache集群在这个概念下具备水平扩展能力。但通常我们通过划分不同数据大小的缓存池控制Memcache集群的大小,而且随着96G或以上大内存服务器的广泛使用。即便在微博这个场景下,12台服务器一组的缓存就已经非常大规模的了。
3. Memcache其实还能更快?
如果你追求极致的Memcache访问速度,可以登录上你的Memcache服务器,检查一下CPU使用情况。我找了一台线上服务,情况如下:
显然CPU7的系统使用率比其他CPU要高。检查一下软中断:
再看看线上服务的版本:
[jichao1@yf179 ~]$ uname -a
Linux yf179 2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
在kernel-2.6.18-194.3.1.el 版本以下的Redhat以及CentOS 操作系统,使用Broadcom 5709网卡芯片的服务器存在cpu软中断不均衡,只有1个cpu处理软中断。
解决方法可以是升级内核,不过也有朋友说没用,需要通过VIP绑定2块网卡的方式解决,具体方案见:http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3
通过对比内核支持4个队列的服务器(最多只能利用到4核,无法在硬件驱动层直接配置成更多队列),只分配一个CPU的Memcache服务器在大压力下可能会慢1~2ms。
相关推荐
通过分析提供的"memcache架构图"文件,我们可以更直观地理解Memcached如何在实际环境中部署和运行。不过,由于具体的图片内容未提供,这里仅能对Memcached的基本概念和特点进行阐述。在实际应用中,结合具体的架构图...
3. **分布式架构**:多个Memcache服务器可以组成集群,通过一致性哈希算法分散数据存储,实现负载均衡。 ### 三、主要特性 1. **高性能**:基于非阻塞I/O模型,采用多线程处理,可以高效地处理大量并发请求。 2. ...
标题"memcache1.2.1 for windows"指的是Memcache的1.2.1版本,这是专为Windows操作系统设计的一个内存缓存系统。Memcache是一个广泛使用的开源高性能分布式内存对象缓存系统,它能够通过在内存中存储数据来减少对...
3. **选择合适的版本**: 根据你的PHP版本(7.0、7.1、7.2等)和操作系统架构(x86或x64),选择对应的`php_memcache.dll`文件。 4. **放置到PHP扩展目录**: 将选中的`php_memcache.dll`复制到你的PHP安装目录下的`...
最新windows的memcache模块下载 这个模块是平和php5.3的,在我的windowsxp php5.3.5上安装成功 里面有两个php库,一个php_memcache.dll.vc6 和一个php_memcache.dll.vc9 另外一个windows的memcache.exe文件,都是网上...
- `add`方法用于添加新键值对,如果键已存在则不会被覆盖: ```php $memcache->add('key', 'hello memcache!', 0, 60); ``` - `set`方法用于设置键值对,即使键已存在也会被覆盖: ```php $memcache->set('...
4.1 设定预研的具体目标,例如熟悉MemCache的架构、安装过程、客户端开发以及优化策略等。 **第 5 章 技术预研取得的工作成果** 5.1 **MEMCACHED 安装** - **Windows环境下的安装**:详细说明在Windows操作系统上...
`创建一个新的Memcache对象,然后通过`$memcache->connect('server', port)`连接到memcached服务器。 3. **操作缓存**:可以使用`add()`, `set()`, `get()`, `delete()`等方法进行数据的存取和删除。例如,`$...
**Memcache Win版服务器与.NET驱动详解** Memcache是一款高性能的分布式内存缓存系统,它最初是为了解决Web应用程序的数据库负载问题而设计的。通过将数据存储在内存中,Memcache能够快速地提供数据,减少对数据库...
Memcache是一种广泛使用的分布式内存对象缓存系统,它可以在服务器集群间通过网络共享小块内存,从而提升应用程序的性能,减少数据库负载。在PHP中,我们通常使用php_memcache.dll扩展来与Memcache服务器进行交互。...
在Windows环境下安装Memcache是一个相对较为特殊的操作,因为Memcache主要设计用于Unix/Linux系统,但通过一些工具和步骤,我们也可以在Windows上实现这一过程。本文将详细介绍在Windows上安装Memcache的步骤,并...
标题 "php7 memcache扩展" 描述 "php7.0 7.1 (vc14/vc15) memcache扩展 windows(x86/x64)" 提及了几个关键概念,包括PHP7、memcache扩展以及适用于Windows平台的不同架构版本。这里,我们将深入探讨这些主题,并...
memcache图形监控工具phpmemcache,尽是一个PHP文件就可以实现对memcache的监控。 使用方法:本地测试监控机安装Apache或者下载XAMPP(Apache+MySQL+PHP+PERL),安装后把memcachephp.zip中的memcache.php文件放到...
Memcache是一种高性能的分布式内存对象缓存系统,它能够减轻数据库负载,加快动态网页的响应速度。以下将详细介绍如何在Windows 7环境下安装和使用Memcache。 首先,你需要确保你的计算机上已经安装了PHP环境。这里...
【Memcache原理及实现】 Memcache,全称Memcached,是一种高性能的分布式内存对象缓存系统,主要用于减轻数据库的负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcache最初由...
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问。
Memcache 是一种广泛使用的分布式内存缓存系统,用于在 Web 应用程序中提高数据读取速度,通过存储经常访问的数据到内存中,避免了频繁的数据库查询,从而提升了整体性能。 描述中的“实测可以使用”意味着这个 ...
**MEMCACHE_COMPRESSED** 是一个整型常量,用于在使用`Memcache::set()`, `Memcache::add()`和相关方法时开启压缩功能,这有助于在网络传输过程中减小数据包的大小,从而提高数据读写效率,特别适用于处理大量文本或...
不同版本的PHP Memcache DLL可能对应于不同版本的PHP或兼容不同的操作系统和架构(如32位或64位)。 安装PHP Memcache扩展通常包括以下步骤: 1. 下载与你的PHP版本和系统架构相匹配的memcache.dll文件。 2. 将下载...
Memcache 是一个高性能的分布式内存对象缓存系统,它能够通过在内存中存储数据来减少对数据库的访问,从而提高Web应用的性能。在PHP环境中,Memcache扩展使得PHP脚本可以直接与Memcache服务器进行交互,实现数据的...