Redis服务调研

Redis持久化

Redis支持两种数据持久化方式:RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。

RDB方式

RDB方式的持久化是通过快照的方式完成的。当符合某种规则时,会将内存中的数据全量生成一份副本存储到硬盘上,这个过程称作”快照”,Redis会在以下几种情况下对数据进行快照:

  • 根据配置规则进行自动快照
  • 用户执行SAVE, BGSAVE命令
  • 执行FLUSHALL命令
  • 执行复制(replication)时

Redis允许用户自定义快照条件,当满足条件时自动执行快照,快照规则的配置方式如下:

1
2
3
save 900 1
save 300 10
save 60 10000

每个快照条件独占一行,他们之间是或(||)关系,只要满足任何一个就进行快照。上面配置save后的第一个参数T是时间,单位是秒,第二个参数M是更改的键的个数,含义是:当时间T内被更改的键的个数大于M时,自动进行快照。比如save 900 1的含义是15分钟内(900s)被更改的键的个数大于1时,自动进行快照操作。

执行SAVE或BGSAVE命令

除了让Redis自动进行快照外,当我们需要重启,迁移,备份Redis时,我们也可以手动执行SAVE或BGSAVE命令主动进行快照操作。

  • SAVE命令
    当执行SAVE命令时,Redis同步进行快照操作,期间会阻塞所有来自客户端的请求,所以放数据库数据较多时,应该避免使用该命令。
  • BGSAVE命令
    从命令名字就能看出来,这个命令与SAVE命令的区别就在于该命令的快照操作是在后台异步进行的,进行快照操作的同时还能处理来自客户端的请求。执行BGSAVE命令后Redis会马上返回OK表示开始进行快照操作,如果想知道快照操作是否已经完成,可以使用LASTSAVE命令返回最近一次成功执行快照的时间,返回结果是一个Unix时间戳。

快照原理

Redis默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中,可以通过配置文件中的dir和dbfilename两个参数分别指定快照文件的存储路径和文件名,例如:

1
2
dbfilename dump.rdb
dir /opt/soft/redis-3.0.4/cache

快照执行的过程如下:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
  2. 父进程继续处理来自客户端的请求,子进程开始将内存中的数据写入硬盘中的临时文件;
  3. 当子进程写完所有的数据后,用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

AOF方式

在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis的性能,但是大部分情况下这个影响是可以接受的,另外,使用较快的硬盘能提高AOF的性能。

开启AOF

默认情况下,Redis没有开启AOF(append only file)持久化功能,可以通过在配置文件中作如下配置启用:

1
appendonly yes

开启之后,Redis每执行一条写命令就会将该命令写入硬盘中的AOF文件。AOF文件保存路径和RDB文件路径是一致的,都是通过dir参数配置,默认文件名是:appendonly.aof,可以通过配置appendonlyfilename参数修改,例如:

1
appendonlyfilename appendonly.aof

同步硬盘数据

虽然每次执行更改数据库的内容时,AOF都会记录执行的命令,但是由于操作系统本身的硬盘缓存的缘故,AOF文件的内容并没有真正地写入硬盘,在默认情况下,操作系统会每隔30s将硬盘缓存中的数据同步到硬盘,但是为了防止系统异常退出而导致丢数据的情况发生,我们还可以在Redis的配置文件中配置这个同步的频率:

1
2
3
# appendfsync always
appendfsync everysec
# appendfsync no

第一行表示每次AOF写入一个命令都会执行同步操作,这是最安全也是最慢的方式;
第二行表示每秒钟进行一次同步操作,一般来说使用这种方式已经足够;
第三行表示不主动进行同步操作,这是最不安全的方式。

Redis Info信息

INFO命令以一种易于理解和阅读的格式,返回关于Redis服务器的各种信息和统计数值。

通过给定可选的参数 section ,可以让命令只返回某一部分的信息:

  • server: Redis服务器的一般信息
  • clients: 客户端的连接部分
  • memory: 内存消耗相关信息
  • persistence: RDB和AOF相关信息
  • stats: 一般统计
  • replication: 主/从复制信息
  • cpu: 统计CPU的消耗
  • commandstats: Redis命令统计
  • cluster: Redis集群信息
  • keyspace: 数据库的相关统计

它也可以采取以下值:

  • all: 返回所有信息
  • default: 返回默认设置的信息
    如果没有使用任何参数时,默认为default。

Redis的configuration group

可以配置Redis支持的配置参数,参考文件:trove/trove/templates/redis/validation-rules.json

里面可配置的参数很多,我们可以选择部分支持的参数提供给用户配置。

阿里提供的配置参数有:

参数
maxmemory-policy volatile-lru
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
notify-keyspace-events

注释:上表中红色的部分是我们提供的redis 3.2.5版本中没有的,在新版本中的配置参数为:list-max-ziplist-size

青云支持的Redis配置参数更多:
redis-qingcloud

配置redis, 3.2.5版本的config parameters:

1
# trove-manage --config-file /opt/etc/trove/trove.conf db_load_datastore_config_parameters redis 3.2.5 /opt/openstack/trove/trove/templates/redis/validation-rules.json

创建Redis对应的configuration group:

1
# trove configuration-create redisCGroup '{"requirepass": "mypass", "hll-sparse-max-bytes": 200}'  --datastore redis --datastore_version 3.2.5

Attach configuration group到实例:

1
# trove configuration-attach <instance> <configuration>

Detach configuration group到实例:

1
# trove configuration-detach <instance>

Redis的备份和恢复

Redis的备份

查看Trove代码,Redis备份的是RDB的dbfile,执行备份的步骤如下:

  1. 保存当前数据到dbfile:执行 redis-cli BGSAVE命令
  2. 等待BGSAVE完成,通过redis-cli LASTSAVE获取dbfile的最新保存时间,变化的话即代表第1步BGSAVE完成
  3. 获取dbfile文件,通过cat | zip | encrypt,把文件上传到对象存储S3中

Redis的恢复

Reids是通过之前备份的dbfile恢复数据的,执行恢复的步骤如下:

  1. 若redis配置文件中aof为开启状态,则关闭aof:overrides = {‘appendonly’: ‘no’}
  2. 停止redis服务
  3. 删除当前的dbfile
  4. 根据当前的配置创建dbfile的目录(按实际需要)
  5. 从对象存储S3中拉取备份文件后,通过 decrypt | unzip到配置的dbfile
  6. 启动redis服务
  7. 若redis之前的配置中aof为关闭状态,则恢复完成,否则执行后续步骤;
  8. 通过redis-cli info persistence 获取redis的恢复状态:loading 0
  9. 重写aof文件:redis-cli BGREWRITEAOF
  10. 通过redis-cli info persistence 获取aof重写状态:aof_rewrite_in_progress 0
  11. 修改redis的配置文件,开启aof:overrides = {‘appendonly’: ‘yes’}
  12. 重启redis服务
支持原创