mac-cache 缓存组件
基本概念
mac-cache提供了对缓存中间件的封装与监控,目前主要针对Redis提供监控服务与API封装,以实现缓存的分布式集群。 注:虽然此组件与REDIS哨兵和Cluster集群在一定程序上可以共存(参见高级应用),但为降低系统部署复杂度,不推荐这么做。- 支持基于JVM和Redis的缓存
- 支持Redis的主从模式
- 支持基于分组和hash的水平分片
- 支持分片内节点的主备、主从、冷备三种模式
- 提供单独的缓存监控中心,可以完全替代哨兵
- 集群节点状态自动检测与恢复(解决类似redis哨兵集群出现的混乱)
- 可在读写本地缓存时自动与远程缓存同步
- 提供数据装载机制,确保缓存与持久化存储中的数据一致,节点启动时,可从业务数据库或文件重新加载数据
集群结构
如上图所示,我们将缓存视做若干个缓存数据库(DB),每个DB下有多个分片(Shard),每个Shard下有一个主节点(master),若干个备节点(backup)或从节点(slave)。主备策略
目前支持三种主备策略(standby):- STANDBY_COLD:备用缓存实例不启动
- STANDBY_WARM:备用缓存实例运行中,但未装载(同步)数据
- STANDBY_SLAVE:备用节点运行中,且已装载(同步)数据
缓存监控
当缓存监控发现某个分片中的主节点不可用时,将根据该分片的主备策略,采取对应的措施。它在启动时也会根据此策略决定如何协调主备关系,以避免集群出现混乱,并实现故障的自动处理。分片策略
一个缓存库下可以有多个分片,目前支持以下两种分片策略来划分分片:- GROUP:根据缓存数据项的分组(GROUP)来,以确定应到哪一个分片上读写
- HASH:根据缓存数据项的键(KEY)计算HASH并取模,以确定缓存KEY应到第几个分片上读写
主从同步
mac-cache并不实现数据的主从同步,它依赖缓存中间件自身的主从复制能力:- GROUP:根据缓存数据项的分组(GROUP)来,以确定应到哪一个分片上读写
- HASH:根据缓存数据项的键(KEY)计算HASH并取模,以确定缓存KEY应到第几个分片上读写
数据装载
某些缓存数据需要严格保证与持久化中的数据一致,或者此类数据希望自动加载到缓存,而不必人工干预,这就需要数据装载机制。当缓存监控发现某个主节点宕机,并执行主备切换后,备节点中可能没有数据,或者数据已经不是最新,它会调用客户端应用(业务应用)的接口,将数据从持久化存储中装载到内存中。