mixi案例研究
mixi在提供服务的初期阶段就使用了memcached。 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached。 此外,我们也从增加可扩展性的方面进行了验证,证明了memcached的速度和稳定性都能满足需要。 现在,memcached已成为mixi服务中非常重要的组成部分。
图1 现在的系统组件
服务器配置和数量
mixi使用了许许多多服务器,如数据库服务器、应用服务器、图片服务器、 反向代理服务器等。单单memcached就有将近200台服务器在运行。 memcached服务器的典型配置如下:
CPU:Intel Pentium 4 2.8GHz
内存:4GB
硬盘:146GB SCSI
操作系统:Linux(x86_64)
这些服务器以前曾用于数据库服务器等。随着CPU性能提升、内存价格下降, 我们积极地将数据库服务器、应用服务器等换成了性能更强大、内存更多的服务器。 这样,可以抑制mixi整体使用的服务器数量的急剧增加,降低管理成本。 由于memcached服务器几乎不占用CPU,就将换下来的服务器用作memcached服务器了。
memcached进程
每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB, 启动参数如下:
/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720
由于使用了x86_64的操作系统,因此能分配2GB以上的内存。32位操作系统中, 每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程, 但这样一台服务器上的TCP连接数就会成倍增加,管理上也变得复杂, 所以mixi就统一使用了64位操作系统。
另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值, 就有可能导致内存交换(swap)。连载的第2次中 前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时 指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、 以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比 指定的容量要大,这一点应当注意。
mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比 指定的容量大很多。因此,我们反复改变内存分配量进行验证, 确认了3GB的大小不会引发swap,这就是现在应用的数值。
memcached使用方法和客户端
现在,mixi的服务将200台左右的memcached服务器作为一个pool使用。 每台服务器的容量为3GB,那么全体就有了将近600GB的巨大的内存数据库。 客户端程序库使用了本连载中多次提到车的Cache::Memcached::Fast, 与服务器进行交互。当然,缓存的分布式算法使用的是 第4次介绍过的 Consistent Hashing算法。
Cache::Memcached::Fast - search.cpan.org
应用层上memcached的使用方法由开发应用程序的工程师自行决定并实现。 但是,为了防止车轮再造、防止Cache::Memcached::Fast上的教训再次发生, 我们提供了Cache::Memcached::Fast的wrap模块并使用。
通过Cache::Memcached::Fast维持连接
Cache::Memcached的情况下,与memcached的连接(文件句柄)保存在Cache::Memcached包内的类变量中。 在mod_perl和FastCGI等环境下,包内的变量不会像CGI那样随时重新启动, 而是在进程中一直保持。其结果就是不会断开与memcached的连接, 减少了TCP连接建立时的开销,同时也能防止短时间内反复进行TCP连接、断开 而导致的TCP端口资源枯竭。
但是,Cache::Memcached::Fast没有这个功能,所以需要在模块之外 将Cache::Memcached::Fast对象保持在类变量中,以保证持久连接。
package Gihyo::Memcached;
use strict;
use warnings;
use Cache::Memcached::Fast;
my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/;
my $fast; ## 用于保持对象
sub new {
my $self = bless {}, shift;
if ( !$fast ) {
$fast = Cache::Memcached::Fast->new({ servers => \@server_list });
}
$self->{_fast} = $fast;
return $self;
}
sub get {
my $self = shift;
$self->{_fast}->get(@_);
}
上面的例子中,Cache::Memcached::Fast对象保存到类变量$fast中。
公共数据的处理和rehash
诸如mixi的主页上的新闻这样的所有用户共享的缓存数据、设置信息等数据, 会占用许多页,访问次数也非常多。在这种条件下,访问很容易集中到某台memcached服务器上。 访问集中本身并不是问题,但是一旦访问集中的那台服务器发生故障导致memcached无法连接, 就会产生巨大的问题。
连载的第4次 中提到,Cache::Memcached拥有rehash功能,即在无法连接保存数据的服务器的情况下, 会再次计算hash值,连接其他的服务器。
但是,Cache::Memcached::Fast没有这个功能。不过,它能够在连接服务器失败时, 短时间内不再连接该服务器的功能。
my $fast = Cache::Memcached::Fast->new({
max_failures => 3,
failure_timeout => 1
});
在failure_timeout秒内发生max_failures以上次连接失败,就不再连接该memcached服务器。 我们的设置是1秒钟3次以上。
此外,mixi还为所有用户共享的缓存数据的键名设置命名规则, 符合命名规则的数据会自动保存到多台memcached服务器中, 取得时从中仅选取一台服务器。创建该函数库后,就可以使memcached服务器故障 不再产生其他影响。
memcached应用经验
到此为止介绍了memcached内部构造和函数库,接下来介绍一些其他的应用经验。
通过daemontools启动
通常情况下memcached运行得相当稳定,但mixi现在使用的最新版1.2.5 曾经发生过几次memcached进程死掉的情况。架构上保证了即使有几台memcached故障 也不会影响服务,不过对于memcached进程死掉的服务器,只要重新启动memcached, 就可以正常运行,所以采用了监视memcached进程并自动启动的方法。 于是使用了daemontools。
daemontools是qmail的作者DJB开发的UNIX服务管理工具集, 其中名为supervise的程序可用于服务启动、停止的服务重启等。

- 大小: 30.7 KB
分享到:
相关推荐
memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 如今,越来越多的Web...第5 章 案例memcached的应用和兼容程序
标题中的“Windows下memcached+memcached.dll 5.3.8”指的是在Windows操作系统上安装和使用Memcached...通过安装和配置Memcached,可以显著提升基于PHP的Web应用程序的性能,减少对数据库的直接访问,提高响应速度。
#### memcached的应用和兼容程序 **mixi案例研究** - **服务器配置和数量**:介绍了mixi使用的服务器硬件和软件配置。 - **memcached进程**:mixi使用多个memcached实例来支持其高流量的应用。 - **memcached使用...
这个版本的hibernate-memcached已经过测试和优化,确保与1.2.2版本的兼容性,为开发者提供稳定且高效的缓存服务。 **jbossl-LICENSE.txt** 文件则包含了该软件包的许可协议,通常这些协议会详细说明软件的使用、...
此外,memcached的兼容性也让它能够适用于多种不同的应用程序,比如Tokyo Tyrant。 总结而言,memcached凭借其高性能、简单协议、易于扩展和部署的特性,成为Web应用中不可或缺的缓存解决方案。理解和掌握memcached...
- 确保安装的memcached与PHP版本兼容,并正确配置PHP以使用memcached扩展。 ##### 2. 下载和配置memadmin - **下载memadmin**: - 访问`http://www.junopen.com/memadmin/`下载memadmin的最新版本。 - 将下载的...
`php_memcached`是PHP的一个扩展,允许PHP应用程序与memcached服务器进行通信。它提供了丰富的API接口,使得开发者可以轻松地在PHP中存取和管理缓存数据。这个扩展比`php_memcache`更现代,支持更多特性,如SASL认证...
为了在Windows上成功部署和运行Memcached服务,你需要将这些DLL文件放在系统路径或者应用程序路径下,确保系统可以在需要时找到并加载它们。同时,确保系统配置正确,如防火墙设置允许Memcached的通信端口(默认是...
3. **配置Memcached连接**:在应用程序中设置Memcached的连接参数,如服务器地址、端口和超时时间。 4. **编写代码**:使用提供的API与Memcached进行交互,例如设置和获取缓存数据。 5. **测试和优化**:确保...
这些库提供了与.NET兼容的API,使得.NET开发者可以轻松地将Memcached集成到他们的应用程序中。 1. **安装Memcached服务** - 首先,你需要在服务器上安装Memcached服务。压缩包中的`memcached.exe`是Windows版的...
Memcached应用的一个关键方面是使用恰当的工具和实践来监控和维护系统性能。同时,兼容性程序的设计,如TokyoTyrant,允许将memcached用在更广泛的应用场景中。 总之,memcached是一个高效、易用的内存对象缓存系统...
这些函数使得开发者能够轻松地将Memcached集成到PHP应用程序中,提升网站的响应速度和整体性能。 **安装和配置** 安装Memcached服务和PHP7的Memcache扩展通常包括以下步骤: 1. 首先,根据服务器架构选择合适的...
### memcached的应用和兼容程序 - **mixi案例研究**:研究了mixi如何大规模使用memcached,并自行开发了相关软件。 - **应用经验**:包括使用daemontools来启动和监控memcached进程,以及分析memcached的性能。 - *...
- **windows**:说明讨论的是在Microsoft Windows操作系统上的部署和使用,这与通常在Linux环境下的使用有所不同,可能需要考虑兼容性和特定的安装步骤。 - **缓存**:缓存是提高应用程序性能的关键技术,通过将...
"tomcat6-7+memcached支持jar包" 指的是一个兼容Tomcat 6和7版本的Java软件包,它包含了使Tomcat服务器能够与Memcached缓存系统集成所需的JAR文件。这个标题暗示了我们将在Tomcat服务器环境中使用Memcached作为...
#### 五、Memcached的应用和兼容程序 **5.1 mixi案例研究** - **服务器配置和数量**:mixi使用大量的memcached服务器集群来支撑其高流量的社交网络服务。 - **memcached进程**:每个memcached进程负责一部分缓存...
1. **跨平台兼容性**:Memcached for ASP 支持x64和x86架构,这意味着无论你的服务器运行在何种平台上,都可以顺利地使用这个客户端库。 2. **无长度限制**:与传统ASP中的缓存解决方案相比,Memcached for ASP不受...
Memcached 是一个广泛使用的分布式内存对象缓存系统,它能提高 Web 应用程序的性能。它通过将数据存储在内存中,提供快速的访问速度。Memcached 的主要特点包括简单的键值对存储、内存优化的数据结构以及基于内存的...