设计和开发可以掌控客户端的分布式服务端程序是件幸事,可以把很多事情交给客户端来做,而且可以做的很优雅。角色决定命运,在互联网架构中,web server必须冲锋在前,注定要在多浏览器版本以及协议兼容性方面呕心沥血。但要是做了web server的backend,就会好很多,可以让服务端程序独善其身,分布式的功能特性都由客户端来支持和实现。memcache就是这样的设计模式。memcache是后台架构必备的利器,关于其原理及源码分析可以直接google之,在此不再多说。最近项目中要考虑冗余和容错的问题,就把memcache redundancy机制分析了一下,仅供大家参考。
why
consistent hash能保证在向现有机器组里加入或移除一台机器时,不会造成hash映射关系大范围的改变。但一台cache机器down了,内容就没有了,缓存需要重建,数据库的压力就会上升,要是cache机器down的太多,就会有cache雪崩,故障在所难免。要是一个key=value可以存储在多台机器上,一台down了还有其它的顶着,岂不甚好,这就是redundancy机制。可惜,memcached不支持这个特性。
It's not! Surprise! Memcached is a caching layer for your application. It is not designed to have any data redundancy.
显然memcached自身不想做这个特性,又一次把任务抛给了客户端。有需求就有实现,pecl/memcache在3.0之后已经开始支持这种机制。
If data integrity is of greater importance a real replicating memcached backend such as "repcached" is recommended.
可以通过配置memcache来开启这个特性:
memcache.redundancy = # default 1
how
下面就以pecl/memcache 3.0.6的代码分析一下redundancy具体的实现。
先来看一下set操作的相关代码:
/* schedule the first request */
mmc = mmc_pool_find(pool, key, key_len TSRMLS_CC);
result = mmc_pool_schedule(pool, mmc, request TSRMLS_CC);
/* clone and schedule redundancy-1 additional requests */
for (i=0; i < redundancy-1 && i < pool->num_servers-1; i++) {
mmc_queue_push(&skip_servers, mmc);
mmc = mmc_pool_find_next(pool, key, key_len, &skip_servers, &last_index TSRMLS_CC);
if (mmc_server_valid(mmc TSRMLS_CC)) {
mmc_pool_schedule(pool, mmc, mmc_pool_clone_request(pool, request TSRMLS_CC) TSRMLS_CC);
}
}
可以看出在set了一个key=value之后,还会set redundancy-1个clone。具体key的变换在mmc_pool_find_next函数:
/* find the next server not present in the skip-list */
do {
keytmp_len = sprintf(keytmp, "%s-%d", key, (*last_index)++);
mmc = pool->hash->find_server(pool->hash_state, keytmp, keytmp_len TSRMLS_CC);
} while (mmc_queue_contains(skip_servers, mmc) && *last_index < MEMCACHE_G(max_failover_attempts));
key变换的规则很简单,1变N(key-i) ,进行N次set。
get的时候当然是要以相同的方式来查找。但只要找到一个valid server就停止查找并返回。
mmc_t *mmc = pool->hash->find_server(pool->hash_state, key, key_len TSRMLS_CC);
/* check validity and try to failover otherwise */
if (!mmc_server_valid(mmc TSRMLS_CC) && MEMCACHE_G(allow_failover)) {
unsigned int last_index = 0;
do {
mmc = mmc_pool_find_next(pool, key, key_len, NULL, &last_index TSRMLS_CC);
} while (!mmc_server_valid(mmc TSRMLS_CC) && last_index < MEMCACHE_G(max_failover_attempts));
}
think
memcache是通过将一个key=value变换成N个key=value来实现redundancy,这样可以和3.0.0之前的接口很好的兼容,但redundancy的key需要变换并随机分散在机器上,每次都要hash查找,也很不好管理。自己想了一种redundancy的设计,就是引入group的概念,在加入机器的时候,配置所属的group id,一个key只hash到一个group id,所有的请求都发到group,group里面的每台机器存储hash(key)到该group的全部内容。这样set/get只需要一次hash操作,同时也可以在group内设计更灵活的实现方式。
这只是个人的一点儿想法,欢迎大家拍砖指正。
分享到:
相关推荐
本篇文章将深入探讨memcache1.2.8版本的源码,了解其实现原理及关键功能。 1. **内存管理** Memcache的核心是内存管理,它采用slab分配器来高效地管理内存。Slab分配器将内存划分为多个大小固定的chunk,每个chunk...
这个"memcache 缓存机制"插件可能是一个用于集成Memcached服务到应用程序中的工具,通过它,我们可以更方便地利用Memcached的优势。 1. **基本概念** - **键值对存储**:Memcached基于键值对(key-value)存储数据,...
Java开发中的Memcached原理及实现主要涉及分布式缓存系统、内存管理和网络通信等多个技术领域。Memcached是一款高性能、分布式内存对象缓存系统,用于减轻数据库负载,提高网站或应用程序的响应速度。在Java环境中,...
3. **会话存储**:替代默认的会话存储机制,将会话数据存入Memcache,提升会话管理效率。 4. **负载均衡**:在分布式环境中,多个应用服务器共享同一Memcache集群,确保数据一致性。 **注意事项** 1. **数据持久性...
**Memcache 深度解析** Memcache 是一个高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,...同时,对于有兴趣的开发者,源码分析和工具使用将进一步加深对Memcache的理解,使其在实际工作中发挥更大作用。
- 配置报警机制,如邮件、短信或电话通知,确保在出现问题时能够及时响应。 综上所述,Memcache监控工具是维护系统稳定、提升性能的关键。选择合适的监控工具,并结合有效的监控策略,能够确保Memcache高效、安全...
【Memcache原理及实现】 Memcache,全称Memcached,是一种高性能的分布式内存对象缓存系统,主要用于减轻数据库的负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcache最初由...
通过深入研究memcached的源代码,我们可以理解其内部机制,从而更好地利用和优化这个工具。《memcached代码分析.pdf》这样的文档将详细讲解这些概念和实现细节,对于理解和改进缓存系统具有很高的参考价值。
### Memcache安装与基本操作详解 #### 一、前言 Memcache是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用,减轻数据库负担。本文将详细介绍如何安装配置Memcache,并提供基本的操作示例。 #### 二、...
**Memcache Win版服务器与.NET驱动详解** Memcache是一款高性能的分布式内存缓存系统,它最初是为了解决Web应用程序的数据库负载问题而设计的。通过将数据存储在内存中,Memcache能够快速地提供数据,减少对数据库...
“源码”标签可能意味着本文将深入探讨MemCache的内部机制,包括其数据结构、缓存淘汰策略(如LRU,Least Recently Used)、网络通信协议等方面。理解这些有助于开发者优化使用或者为社区贡献代码。 **六、使用工具...
- **事务支持**:Spring的事务管理机制可以确保与Memcache交互的一致性和完整性。 #### 四、XMemcache与原生Memcache客户端的区别 - **XMemcache**:这是一个高度可扩展且功能丰富的Java客户端库,提供了更多的...
memcache是广泛应用于Web开发中的一个内存对象缓存系统,它能够提高网站性能,通过将数据存储在内存中,减少对数据库的访问,从而加快数据读取速度。 PHP的memcache扩展允许开发者在PHP应用程序中与memcached服务器...
PHP Memcache多版本拓展库特别针对PHP7及以上版本进行了优化,覆盖了VC14至VC16编译器的不同构建,同时支持64位(x64)和32位(x86)操作系统。这使得该扩展库能够在各种Windows环境下运行,满足不同开发者的配置...
在Windows环境下安装Memcache是一个相对较为特殊的操作,因为Memcache主要设计用于Unix/Linux系统,但通过一些工具和步骤,我们也可以在Windows上实现这一过程。本文将详细介绍在Windows上安装Memcache的步骤,并...
Memcache 是一种广泛使用的分布式内存缓存系统,用于在 Web 应用程序中提高数据读取速度,通过存储经常访问的数据到内存中,避免了频繁的数据库查询,从而提升了整体性能。 描述中的“实测可以使用”意味着这个 ...