打造高性能高可靠的Redis架构
- redis是内存数据库,利用持久化可以解决当redis服务器关机或者重启数据丢失的问题。
- 利用主从,可以实现Redis读写分离与数据备份同步问题。
- 利用哨兵模式,可以实现Redis中当某台机发生故障,会把主数据库自动切到某一台从服务器上去
- 利用Redis-cluster,可实现不同key保存到不同redis服务器上去,保证某一台机不会内存过大。
Redis持久化
在使用Redis的过程中,可能会需要重启Redis,但是Redis是内存服务器,如果重启的话内存会清空,造成数据丢失;我们可以定时把内存中的数据存放到硬盘中,保证数据安全。
Redis的持久化有两种方式,一种是把整个内存结构持久化到硬盘中(RDB),另一种是把过程中的命令持久化到硬盘中(AOF)。
RDB
是什么
RDB是Redis数据持久化的一种方式,它是指redis每隔一段时间,将内存快照保存为另一个文件,替换上次保存的dump.rdb文件;如果想要从RDB中恢复数据,只需要重启Redis服务器即可。
怎么做
- RDB文件配置
dir ./
dbfilename dump.rdb
默认情况下,dump.rbd文件放在redis主目录下;我们可以通过配置redis.conf的dir 和 dbfilename来配置rdb文件的位置和名字。
- RDB持久化方式配置
我们可以手动执行RDB持久化,也可以通过配置执行RDB持久化。手动执行RDB持久化有两种方式,一种是save,另一种是bgsave。
save:执行save命令的时候会造成阻塞,因为主线程跑去备份RDB了,一般这个过程有几毫秒到几秒不等。
bgsave:bgsave命令,redis会fork一个线程去备份RDB,因此不会造成阻塞。
- RDB时间配置
redis还可以通过配置实现自动备份RDB,配置参数如下:
save 900 1
save 300 10
save 60 10000
这个配置是说如果900s内有一个redis键值发生变化,或者300s内有10个redis键值发生变化,再或者60s内有10000个redis键值发生变化,都会触发bgsave进行redis的持久化。
- 关闭RDB配置
1. 在set最前面配置 save ""
2. 注释掉所有的 save [second] [update]
AOF
是什么
AOF(Append-Only-File),也是redis持久化的一种方式,它把redis的写操作指令都存储下来,复原的时候把指令一条条的执行,已得到一个完整的内存结构。
怎么做
- 是否开启AOF持久化
# yes 开启,如果AOF开启的话,而且RDB也存在,每次重启redis数据库会先加载AOF文件
# no 关闭
appendonly yes/no
- 设置AOF策略
# 每一个redis的写操作指令都会保存到AOF缓存区
# always : 当缓存区有新的写操作指令就会同步到AOF文件中
# every : 缓存区即使有新的操作指令,不会立刻同步到AOF中,而是等堆积了若干条,再一次性每秒钟同步一次过去
# no : 把同步的权利交给操作系统
appenfsync always/everysec/no
- 重写
当AOF文件太大以后,AOF会对文件进行重写,即把当前的内存状态化成一条条的写指令,然后保存成新的AOF文件,替换掉旧的。
# 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入.官方文档建议如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。
no-appendfsync-on-rewrite no
# 自动重写只增文件。
# redis可以自动盲从的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。
# 当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
# 当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
auto-aof-rewrite-min-size 64mb
RDB和AOF的比较
- RDB的文件一般比AOF的较小
- RDB每次持久化是把整个内存快照保存下来,而AOF只需要把上一次持久化和这一次持久化之间的写操作指令保存即可,内容会小很多
- 我们可以设置AOF及时持久化,不用再担心像RDB那样在两个持久化期间的新数据没有保存下来