您的位置:首页 > 数据库 > Redis

Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之持久化与主从

2015-11-07 23:10 1076 查看
前言

前面我们详细地讲解了Redis的安装配置和详细使用,这一章来详细讲讲Redis的持久化与主从。Redis支持两种持久化方式,① 快照持久化 、② AOF持久化。两种持久化都是为了保证数据的安全,我们知道Redis与Memcache这类K/V数据库的数据都是保存在内存中的,而内存中的数据有一个特点是读写非常快,但一旦断电则数据不复存在,这样就给数据的安全带来了极大的风险,Redis本身采用了持久化的方式来将内存中的数据同步到磁盘中来降低数据安全的风险,下面我们就来看看Redis的两种持久化方式各有什么优劣。

一、快照持久化

所谓快照持久化有点儿类似于给Redis的内存拍了一张照,然后保存到磁盘中,快照持久化每次保存的是整个Redis数据。下面我们先来看看快照持久化的配置

在redis.conf配置文件中快照持久化是默认打开,你也可以使用 save <seconds> <changes> 的方式来设定自己的持久化方式。save快照保存的思路是,数据修改的频率越高备份的频率越高,数据修改的频率越低备份的频率越低。

# Redis快照保存机制
# 格式为:save <seconds> <changes>
# 保存的两个条件必须都要满足才能保存,超过seconds秒(seconds / 60 分)发生至少changes次改变就保存一次
# 注:你可以通过注释掉所有的save来禁用保存
# 注:你通过设置 save "" 来删除之前保存的所有内容

# 超过900秒(15分)发生至少1次改变保存一次
save 900 1
# 超过300秒(5分)发生至少10次改变保存一次
save 300 10
# 超过60秒(1分)发生至少10000次改变保存一次
save 60 10000

# 快照发生错误时停止写操作
stop-writes-on-bgsave-error yes

# 是否使用LZF压缩文件
rdbcompression yes

# 存储和加载rdb文件时校验
rdbchecksum yes

# 设置快照存放的文件名
dbfilename dump.rdb

# 设置持久化存放目录(必须指定一个目录,不能是文件名,dump和aof两种持久化都会存放到此处)
dir ./


注①:这里特别要强调一下dir 这个配置,在redis.conf中的dir配置实际上针对于快照持久化和AOF持久化都有有效的, dir的默认 ./ 是相对于redis的根目录而言,假设,redis存放在/usr/local/redis/中,那么dump.rdb这个文件就应该保存在这里。你也可以设置绝对路径来更改保存位置。

注②:快照持久化不宜设置得过于频繁,由于快照持久化的机制决定了其每执行一次对CPU资源消耗特别大,所以过快的持久化频率会降低系统性能,减少系统IO。如果想同时保证数据的安全(有人想提高快照持久化频率无非是想保证数据的安全)可以结合AOF持久化来做一些相对精细的持久化。

注③:也可以通过bgsave来手动发起快照保存

redis-cli -h 127.0.0.1 -p 6379 bgsave   #对127.0.0.1机器上6379端口的redis发起一次快照保存
redis-cli bgsave                        #对本机6379端口的redis发起一次快照保存


二、AOF持久化

AOF持久(append only file)是以追加的方式来实现持久化的,它的本质实际上是把用户执行的每个写指令(select 选库、增、删、改)同步到磁盘中,在需要还原数据时将所有指令都执行一遍。

# Redis默认的持久化方式为异步快照持久化

# 开启AOF持久化(默认关闭)
appendonly no

# 制定AOF持久化保存文件名(默认为:appendonly.aof)
appendfilename "appendonly.aof"

# 设置持久化频率(默认为everysec)

# key更改一次就持久化一次(数据安全性最高性能最低)
# appendfsync always
# 每秒钟持久化一次(性能和数据安全性折中)
appendfsync everysec
# 根据当服务器的性能来持久化(完全依赖os,性能最好,持久化没保障)
# appendfsync no

# 快照持久化时是否停止AOF持久化写入(防止磁盘的I/O过高),默认为no(不关闭写操作)
# 注意:AOF停止写入后实际上是进入了内存的队列缓冲区,并不会丢失
no-appendfsync-on-rewrite no

# AOF文件自动重写
# AOF文件与上次AOF文件比例超过100%,自动重写
auto-aof-rewrite-percentage 100
# AOF文件最小重写大小为64MB
auto-aof-rewrite-min-size 64mb


注①:AOF持久化开启后会清空所有的数据,如果希望使用AOF持久化,请在一开始的时候就将AOF持久化开启。

注②:重写的意义在于优化AOF文件,在实际场景中,对于一个key无论修改多少次都只会存在一个key值,假设有如下场景

127.0.0.1:6379> incrby age 1
(integer) 1
127.0.0.1:6379> incrby age 1
(integer) 2
127.0.0.1:6379> incrby age 1
(integer) 3


对于一个key(age)我们进行了3次加1操作,AOF文件中也会记录3条incrby age 1命令,但实际就用一条命令(set age 3)就可以表示出age的值来。此时AOF重写的意义就体现出来了

注③:我们也可以使用bgrewriteaof命令来手动发起重写操作

redis-cli -h 127.0.0.1 -p 6379 bgrewriteaof #对127.0.0.1机器上6379端口的redis发起一次重写操作
redis-cli bgrewriteaof                      #对本机6379端口的redis发起一次重写操作


注④:快照持久化与AOF持久化同时存在,AOF优先用于恢复数据

三、主从与集群

# 设置本机Redis服务器从属于Master服务器,当本机Redis启动时会自动从Master服务器同步数据。
# slaveof <masterip> <masterport>

# 指定Master服务器的密码(如果Mater服务器有密码)
# masterauth <master-password>

# 当主从断开或正在复制中,从服务器是否正常应答客户端请求:
# yes (默认值),本机服务器将继续正常应答客户端请求。
# no  对于客户端的所有请求(除INFO 和 SLAVEOF命令外)本机服务器都将回复"SYNC with master in progress"。
slave-serve-stale-data yes

# 设置从服务器是否只读(默认yes),在Redis 2.6版本后,从服务器默认为只读
slave-read-only yes

# 从服务器Ping主服务器的时间间隔(秒)默认为10秒。
# repl-ping-slave-period 10

# 主从超时时间(超时认为断线了),要比repl-ping-slave-period大
# repl-timeout 60
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: