分布式数据之缓存技术,今天就一起来揭开其神秘面纱( 二 )


分布式数据之缓存技术,今天就一起来揭开其神秘面纱

文章插图
 
第二,Redis 支持持久化 。
持久化是指,将数据从内存这种易失性存储设备中写入磁盘,从而让数据永久保存 。Redis 中存储的数据虽然是基于内存的,但它也提供了持久化的机制,主要有两种方式:RDB 和 AOF 。
RDB(Redis DataBase),也称快照方式,简单来说就是 Redis 会定时将内存中的数据备份到磁盘中,形成一个快照,比如每天保存一下过去一周的数据 。这样当节点出现故障时,可以根据快照恢复到不同版本的数据 。这种方式有一个明显的缺点,是会造成数据丢失,即当节点出现故障时,新数据可能还未备份到磁盘中 。
AOF(Append Only File)的出现主要弥补了 RDB 数据不一致的问题,其思想与上一讲提到的数据库复制技术中 binary log 类似,即记录下 Redis 中所有的更新操作 。
  • 在 Redis 中,提供了三种实现 AOF 的策略:AOF_FSYNC_NO (不同步),即不会自动触发写操作的同步;
  • AOF_FSYNC_EVERYSEC (每秒同步),即每隔一秒都会将写操作同步到磁盘;
  • AOF_FSYNC_ALWAYS (每次写都同步),即每次发生写操作会立即同步到磁盘 。
Redis 中默认采用 AOF_FSYNC_EVERYSEC(每秒同步)的策略,因为这种策略的性能很不错,而且一旦出现故障,最多只会丢失一秒的数据 。
第三,Redis 支持主备同步 。
说到主备同步,我相信你应该想到了上一讲提到的数据复制技术 。在 Redis 中,采用的是异步复制技术,但 Redis 可以通过配置 min-replicas-to-write 和 min-replicas-max-lag 这两个参数来有效地保证数据一致性 。
比如,设置 min-replicas-to-write=3、min-replicas-max-lag=10,表示当至少有 3 个备数据库连接主数据库的延迟时间小于 10s 时,主数据库才可以执行写操作 。延迟时间是从最后一次收到备数据库的心跳开始计算,通常每秒发送一次心跳 。
除了上面对写操作的同步,在 Redis 中,还有两种情况是需要进行数据同步的:
  • 一种情况是初次同步,即备数据库刚启动时的数据同步;
  • 另一种情况是,因网络故障导致主备数据库断开连接,待网络恢复后的备数据库的数据同步 。
针对这两种情况,Redis 提供了两种同步模式,即完整重同步和部分重同步 。
完整重同步的流程如下所示:
  1. 当备服务器启动时,会向主服务器发送 SYNC 命令;
  2. 主服务器收到命令后会生成 RDB(快照)文件,并记录从现在起新执行的写操作;
  3. RDB 生成后会发送给备服务器,备服务器通过 RDB 文件进行数据更新;
  4. 更新完成后,主服务器再将新记录的写操作发送给备服务器,备服务器执行完这些新记录的写操作,便与主服务器的数据保持一致了 。
 
分布式数据之缓存技术,今天就一起来揭开其神秘面纱

文章插图
 
简单地说,部分重同步就是,当网络恢复后,主数据库将主备数据库断开连接之后的一系列写操作发送给备服务器,备数据库执行这些写操作,从而保证数据保持一致 。
在这种方式的实现中,主备数据库会共同维护一个复制偏移量,这样主数据库就知道应该将哪些写操作发给备数据库,备数据库同步时也知道应该从哪里继续执行操作 。
如图所示,主数据库的复制偏移量为 5000 时,向备数据库发送了 100 个字节的数据,发送结束后复制偏移量为 5100 。
此时主备数据库连接断开,备数据库没有接收到这 100 个字节的数据,等到备数据库重新与主数据库连接上之后,会给主数据库发送 PSYNC 命令,并带上自己的复制偏移量 5000,主数据库接收到信息后,根据接收到的复制偏移量,将 5000 之后的数据发给备数据库,从而完成数据的部分重同步 。
分布式数据之缓存技术,今天就一起来揭开其神秘面纱

文章插图
 
以上,就是分布式缓存系统 Redis 中涉及的关键技术,包括支持的数据结构、数据持久化方法和数据同步方法,相信通过上面的介绍,你对分布式缓存技术已经有了一定的了解 。
接下来,我再带你学习另一个缓存数据库 Memcached 。
 
Memcached 分布式缓存原理与 Redis 类似,Memcached 也是一个基于内存的高性能 key-value 缓存数据库 。Memcached 比 Redis 问世更早,也有很多公司在使用,比如 Facebook、Vox、LiveJournal 等 。
其实,Memecached 的缓存原理和 Redis 类似 。所以接下来的内容,我会着重于你讲述这两个数据库在支持的数据结构、持久化和主备同步上的不同 。这样,你可以对比着学习这两个数据库,也会理解得更全面、深入些 。


推荐阅读