分布式缓存
在计算机领域,缓存是一个非常重要的、用来提升性能的技术。
什么是分布式缓存?
缓存技术是指用一个更快的存储设备存储一些经常用到的数据,供用户快速访问。
分布式缓存是指在分布式环境或者系统下,把一些热门数据存储到离用户近、离应用近的位置,并尽量存储到更快的设备,以减少远程数据传输的延迟,让用户和应用可以很快访问到需要的数据。
分布式数据缓存属于计算机应用中的缓存的一种,计算机应用中的缓存,一般代指内存,即内存存储了用户经常访问的数据,用户或者应用不再需要到磁盘中去获取相应的数据,大幅提高访问速度。
分布式缓存原理
下面以常见的Redis和Memcached为例,描述分布式缓存的原理。
Redis分布式缓存
Redis的全称是Remote Dictionary Server,它以字典结构将数据存储到内存中,应用直接到内存中读写Redis存储的数据。
Redis集群是一个典型的去中心化结构,每个节点负责存储一部分数据,同时,每个节点会进行主备设计来提高Redis的可靠性。
Redis和缓存关系最紧密的三个特性:
- 支持多数据结构
- 支持持久化
- 主备同步
Redis支持多数据结构
Redis是一个基于内存的key-value数据库,它支持的数据结构不仅有简单的k/v类型,还可以支持List、Set、Hash等复杂类型的存储。
Redis支持持久化
Redis存储的数据是基于内存的,但它也提供了持久化机制,即将数据从内存写入到磁盘中。
Redis提供的持久化有两种方式:
- RBD(Redis Database),快照方式,Redis会定时将内存中的数据备份到磁盘中,形成一个快照,当节点出现故障时,可以根据快照恢复到不同版本的数据。它带来的问题是可能会造成数据丢失,当节点出现故障时,新数据可能还没有备份到磁盘。
- AOF(Append Only File),它的核心思想是通过使用类似于binary log的方式,来解决RBD快照存在的数据丢失问题。有三种不同的AOF策略可以选择:
- AOF_FSYNC_NO(不同步)
- AOF_FSYNC_EVERYSEC(每秒同步)
- AOF_FSYNC_ALWAYS(每次写都同步)
Redis默认采用AOF_FSYNC_EVERYSEC策略,这样一旦出现故障,最多只会丢失一秒的数据。
Redis支持主备同步
Redis采用异步复制技术来实现主备同步,它可以通过min-replicas-to-write和min-replicas-max-lag参数来设置同步策略。
除了写数据时同步,以下两种情况也需要同步:
- 备数据库刚启动时需要进行数据同步。
- 因为网络故障导致主备数据库断开连接,等待网络恢复后,需要进行数据同步。
Redis提供了2种类型的同步机制:
- 完整重同步
- 部分重同步
完整重同步的流程如下:
- 当备服务器启动时,会向主服务器发送SYNC命令。
- 主服务器收到命令后会生成RDB文件,并记录从现在开始新执行的写操作。
- RBD生成后会发送给备服务器,备服务器通过RDB文件进行数据更新。
- 更新完成后,主服务器再将新记录的写操作发送给备服务器,备服务器执行完这些新记录的写操作,便和主服务器的数据保持一致了。
部分重同步是指当网络恢复后,主数据库将主备数据库断开连接后的一系列写操作发送给备服务器,备数据库执行这些写操作,从而保证主备数据保持一致。
主备数据库会共同维护一个复制偏移量,这样主数据库就知道应该将哪些写操作发给备数据库,备数据库同步时也知道应该从哪里继续执行操作。
Memcached分布式缓存原理
Memcached是一个基于内存的高性能key-value缓存数据库。
Memcached集群采用一致性哈希思路,使用Ketama算法,它的主要思想就是带虚拟节点的一致性哈希算法。在实际应用中,每个物理节点对应100-200个虚拟节点。
Memcached仅支持简单的k/v数据类型,如果想要存储复杂的数据类型,例如List、Set或者Hash,需要客户端自己处理,将其转化为字符串后进行存储,这样导致它操作不灵活。
Memcached不支持持久化,当服务器重启后,Memcached存储的数据会全部丢失。
Memcached中服务器和服务器之间没有任何通信,它自身不支持主备,但可以通过第三方来实现。
Redis和Memcached详细的比较如下。