1. 问题背景

(作者海贼抓鱼)在商城实践中,我们为了改善用户浏览图片的速度,但同时减少图片存储服务器的访问压力,采用了memcached来作cache集群,达到分担来自前端的请求,实际运营效果不错。但是后来在运营的过程中发现,随着memcached实例的不断增加以下问题逐渐开始困扰起我们:

1. n台分布的memcached做实际数据的存储,每台memcached存放数据总量的一个子集(分布算法:Key映射整数值,再根据已有server数取模),随着memcached实例数量的增加,管理、维护的难度也相应增加;

2. 新增x台memcached进行扩容,已有数据需要作大规模迁移,且同时一定时间内cache命中较低;

3. 如有memcached服务异常退出,如不能迅速拉起,会影响前端访问的体验,或者可能导致数据分布的重计算,使得memcached的SLA级别较低;

4. 因为缺乏统一分配、管理机制,可能会存在数据在多个memcached存在实例的情况,导致数据不一致或不同版本数据冲突的情况。

为了解决这种些问题,我们设计出使用统一集中式索引的分布式缓存管理系统,开发语言java1.6,关键技术 nio、jgroups、memcached java。

2. 关键设计和特性

在memcached群集前端建立索引服务器,统一数据访问入口的分配和管理:

1. 索引服务器以8bytes整数为Key,分配、记录应用数据到具体memcached位置的索引信息,并作为应用,memcached间的Proxy角色进行数据的传输;

2. 可将多个索引服务器配置在一起构成一个索引集群。在同一个索引集群中,索引信息互为拷贝,保证索引表的一致性,这一特性使用索引集群具有高可用性;

3. 索引服务器后端的memcached构成实际的存储信集群,每个memcached保存一部分数据,索引服务器对已有的存储资源进行分配,并实时的将索引信息同步到索引集群中其他索引服务器上去;

4. 数据的实际存储位置的分配,不再按照Key取模的方式。而是根据后端memcached个数及容量、内存空闲程度进行负载均衡分配;

5. 对memcached进行扩容时,不会对已存储信息造成影响,不存在扩容时的数据迁移问题;同时memcached的失效不会影响群集的可用性;

6. 索引信息以HASHMap方式进行保存,并以FIFO方式进行淘汰,保证最老数据优先淘汰;索引信息具备类型、版本号、失效时间等属性;

7. 同一索引Key的数据根据版本号进行区分,不存在低版本数据覆盖高版本数据的问题;

 1/3   上一页 1 2 3 下一页 尾页

文章TAG:
下一篇