客户端实现多个Memcached服务集群
Memcached服务器之间是独立的,没有任何关联,不能进行集群,Memcached集群是从客户端实现的。
应用系统使用统一的访问Memcached配置,在调用client包来set(key,value), get(key)时,使用相同选取服务器节点的算法,这样就实现了取到先前存入的对象。
选取服务器节点的算法思路是key的哈希值与节点数取模,比如,有Memcached服务器n0,n1,n2,n3,n4,key为"user_name",那么就是 hash(username)%5,如果结果为0就选取n0,依次类推。
选取服务器接点的算法一般封装在memcached client包中。
MemcachedSession session = (MemcachedSession) this.findSessionByKey(msg .getKey());
//默认使用这个会话定位器
private MemcachedSessionLocator sessionLocator = new ArrayMemcachedSessionLocator();
// 使用一致性哈希算法(Consistent Hash Strategy) 建议使用。
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
ArrayMemcachedSessionLocator:
public final long getHash(int size, String key) {
long hash = this.hashAlgorighm.hash(key);
return hash % size;
}
public final Session getSessionByKey(final String key) {
if (this.sessions == null || this.sessions.size() == 0) {
return null;
}
// Copy on read
List<List<Session>> sessionList = this.sessions;
int size = sessionList.size();
if (size == 0) {
return null;
}
long start = this.getHash(size, key);
List<Session> sessions = sessionList.get((int) start);
Session session = getRandomSession(sessions);
// If it is not failure mode,get next available session
if (!this.failureMode && (session == null || session.isClosed())) {
long next = this.getNext(size, start);
while ((session == null || session.isClosed()) && next != start) {
sessions = sessionList.get((int) next);
next = this.getNext(size, next);
session = getRandomSession(sessions);
}
}
return session;
}
KetamaMemcachedSessionLocator:
public final Session getSessionByKey(final String key) {
if (this.ketamaSessions == null || this.ketamaSessions.size() == 0) {
return null;
}
long hash = this.hashAlg.hash(key);
Session rv = this.getSessionByHash(hash);
int tries = 0;
while (!this.failureMode && (rv == null || rv.isClosed())
&& tries++ < this.maxTries) {
hash = this.nextHash(hash, key, tries);
rv = this.getSessionByHash(hash);
}
return rv;
}
public final Session getSessionByHash(final long hash) {
TreeMap<Long, List<Session>> sessionMap = this.ketamaSessions;
if (sessionMap.size() == 0) {
return null;
}
Long resultHash = hash;
if (!sessionMap.containsKey(hash)) {
// Java 1.6 adds a ceilingKey method, but xmemcached is compatible
// with jdk5,So use tailMap method to do this.
SortedMap<Long, List<Session>> tailMap = sessionMap.tailMap(hash);
if (tailMap.isEmpty()) {
resultHash = sessionMap.firstKey();
} else {
resultHash = tailMap.firstKey();
}
}
//
// if (!sessionMap.containsKey(resultHash)) {
// resultHash = sessionMap.ceilingKey(resultHash);
// if (resultHash == null && sessionMap.size() > 0) {
// resultHash = sessionMap.firstKey();
// }
// }
List<Session> sessionList = sessionMap.get(resultHash);
if (sessionList == null || sessionList.size() == 0) {
return null;
}
int size = sessionList.size();
return sessionList.get(this.random.nextInt(size));
}
分享到:
相关推荐
- **Cache层**:包含多个Memcached实例,提供实际的缓存服务。 - **Control层**:监控集群状态,执行动态扩缩容操作。 在实际部署中,需要安装和配置MoonBox代理服务器,以及监控和控制工具。这通常涉及到编写配置...
本文将详细介绍如何在多个服务器上搭建一个Memcached集群,以实现数据的高可用性和负载均衡。 ### 一、安装Memcached 在开始搭建集群之前,首先需要在所有参与节点上安装Memcached。对于Linux系统,通常使用包管理...
- **`mcmaster`**:在分布式环境中,mcmaster可以用于集群管理和故障转移,监控多个Memcached节点的状态,并在节点失效时自动重新分配数据。 - **`telnet`**:最基础的管理方式是直接通过telnet连接到Memcached...
在集群环境中,多个Memcached节点可以共享数据,确保即使单个节点出现故障,其他节点也能继续提供服务。这种缓存策略对于处理高并发请求的Web应用特别有效。 集群配置的步骤通常包括以下部分: 1. **安装和配置...
6. 分布式哈希:在多台Memcached服务器集群中自动分配键值对,实现负载均衡。 使用C#客户端连接Memcached的步骤大致如下: 1. 创建Memcached客户端实例,指定服务器地址和端口。 2. 使用Set方法存储数据,如`client...
2. 集群:Memcached支持集群模式,多台服务器组成一个集群,提供高可用性和高性能。 Memcached客户端 1. Memcached客户端:Memcached提供了多种语言的客户端,包括C/C++、PHP、Java、Python、Ruby、Perl等。 2. ...
标题中的“memcached实现多个tomcat共享一个session”是指在分布式系统中,通过使用memcached作为session存储介质,实现多台Tomcat服务器之间的session共享。这样可以确保用户在集群中的任意一台服务器上登录后,其...
- **Page**:一个page是一个连续的内存块,被划分为多个chunks。 ##### Item Item是指缓存中的具体数据项。每个item都关联着一个键值对,以及相关的元数据,如过期时间等。 #### 4. Memcached分布式:一致性Hash ...
总体来说,Nginx+Tomcat+Memcached 的集群配置是一项复杂的系统工程,涉及到网络通信、负载均衡、缓存策略等多个方面。理解和掌握这一架构有助于构建高效、稳定且可扩展的 web 应用服务。通过深入学习和实践,我们...
总结来说,整合Tomcat6与Memcached集群实现了跨服务器的Session共享,解决了分布式环境下的会话一致性问题,提升了系统的可扩展性和可用性。同时,这种方案也有助于减少对单个服务器的依赖,提高整体系统的容错能力...
标题中的“tomcat与memcached集群jar”指的是在Apache Tomcat...总的来说,"tomcat与memcached集群jar"提供了一个便捷的方式,让开发者能够在Tomcat环境中快速实现Memcached缓存功能,提升Web应用的效率和可扩展性。
驱动包支持Memcached的集群方案,这意味着开发者可以连接到多个Memcached服务器,从而实现数据的高可用性和负载均衡。通过设置服务器列表,驱动包会自动处理数据在集群中的分布和路由,使得应用程序无需关心底层细节...
8. **分布式一致性哈希**:在分布式Memcached集群中,客户端可能使用一致性哈希算法来平衡数据分布,保证在节点增减时尽可能少地重新分布数据。 9. **TTL(Time To Live)管理**:客户端需要支持设置缓存项的生存...
2. **Apache Commons** 库:描述中提到了"commons-所有包下载",这可能是指Apache Commons项目提供的多个库,如Commons Lang、Commons Pool等。这些库提供了许多实用工具类和功能,可以辅助Memcached客户端的实现。...
在分布式系统中,Session共享是一个常见的挑战,尤其是在多个应用服务器如Tomcat之间。为了实现这一目标,我们可以结合Nginx反向代理服务器和memcached内存缓存系统来达到高效、可靠的Session共享。以下是对这个主题...
创建Memcached集群通常涉及配置多个实例,以及使用客户端库支持分布式存储。 总结来说,Memcached是跨平台的缓存解决方案,适用于Windows和Linux环境。通过正确配置和使用,它可以显著提升Web应用的性能,减少对...
- **Page**:在某些实现中,slab由多个page组成,每个page包含多个chunk。 - **Item**:存储在slab中的数据单元,包含键、值和附加信息。 #### 4. Memcached分布式:一致性Hash 在分布式环境中,Memcached通常使用...
- **多服务器支持**:客户端可以配置多个服务器,当一个服务器不可用时,请求会自动转发到其他服务器,实现负载均衡。 ### 应用场景 Memcached 主要用于以下场景: 1. **减少数据库访问**:将经常访问的数据存储在...
它的使用通常包括初始化一个MemcachedClient实例,配置服务器节点,然后通过这个客户端对象进行get和set操作来存取数据。 其次,Xmemcached是另一个强大且高效的Java客户端,它支持多线程、NIO和Future模式,提供了...
标题 "Nginx+Tomcat+Memcached集群Session共享" 描述了在分布式环境中如何通过Nginx反向代理服务器、Tomcat应用服务器集群以及Memcached缓存系统来实现Session的共享。这是一个常见的高可用性和负载均衡解决方案。...