Azure 高级版 Redis 如何持久化

Redis 持久化

为了保证redis cache数据安全,同时在服务器故障时,能够在重启后进行数据恢复。redis 提供了两种持久化方案 RDB和AOF。

RDB

RDB持久化,快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照

RDB持久化过程:

  1. Redis启用子线程fork主线程进行持久化,不影响父线程的I/O
  2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
  3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(fork一个进程入内在也被复制了,即内存会是原来的两倍)。

AOF

Append-only file,aof 比快照方式有更好的持久化,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机

AOF持久化过程:

  1. Redis启用子线程fork主线程进行持久化,不影响父线程的I/O
  2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
  3. 父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
  4. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
  5. 现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

Azure Redis 持久化

目前Azure Redis 高级版只支持RDB方式持久化,具体持久化的步骤,请参考以下说明:

Azure Redis 启用持久化

Set-AzureRmRedisCache -ResourceGroupName kevingroup -Name kevinredis01 -RedisConfiguration @{"rdb-backup-enabled"="true"; "rdb-backup-frequency"="60"; "rdb-backup-max-snapshot-count"="1"; "rdb-storage-connection-string"="DefaultEndpointsProtocol=https;AccountName=kevinstorage1;AccountKey=;EndpointSuffix=core.chinacloudapi.cn"}

Azure Redis 停用持久化

Set-AzureRmRedisCache -Name $cacheName  -ResourceGroupName $resourceGroupName -RedisConfiguration @{"rdb-backup-enabled"="false"}

相关文档

  • redis persistence
  • cache-how-to-premium-persistence

你可能感兴趣的:(Azure 高级版 Redis 如何持久化)