默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。可以对 Redis 进行设置(save N M),让它在“ N 秒内数据集至少有 M 个改动 ”这一条件被满足时, 自动保存一次数据集(当前时刻的整个内存)为 RDB 文件。也可以进入 Redis 客户端,手动执行命令 save 或 bgsave 立即生成 dump.rdb 快照文件(默认存放路径为 dump.rdb)。如果需要关闭 RDB 快照,只需要将 redis.conf 文件的 save 60 10000 等配置注释即可、
命令 | save | bgsave |
---|---|---|
IO类型 | 同步 | 异步 |
是否阻塞redis其它命令 | 是 | 否(在生成子进程执行调用fork函数时会有短暂阻塞) |
复杂度 | O(n) | O(n) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork子进程,消耗内存 |
AOF 持久化就是将修改的每一条指令记录追加进文件 appendonly.aof 中(先写入os cache,每隔一段时间 fsync 到 磁盘)。在 redis.conf 中配置(appendonly yes、appendfilename “appendonly.aof”),和 RDB 快照一样,默认存放路径为 /data/3306/appendonly.aof
该操作有三个配置项:
appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全
appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据
appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性
AOF 重写: AOF 中有些命令是没有用的,比如累加某一个数据项,不需要将每次累加的记录,AOF 可以自动重写为最后一条 SET 命令,AOF 也有两个默认配置
# aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就 很快,重写的意义不大
# auto‐aof‐rewrite‐min‐size 64mb
# aof文件自上一次重写后文件大小增长了100%则再次触发重写
# auto‐aof‐rewrite‐percentage 100
命令 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 (更安全) |
文件体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 容易丢失数据 | 由策略决定 |
AOF在重写时,不再是单纯将内存数据转换为 RESP 命令写入 AOF 文件,而是将重写这一刻之前的内存做 RDB 快照处理,并且将 RDB 快照内容和增量的 AOF 修改内存数据的命令存在一起,都写入新的 AOF 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的 AOF 文件才会进行改名,覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。开启配置命令如下(必须先开启 AOF):
# aof‐use‐rdb‐preamble yes
注意: 停掉 Redis 之前会自动做一次持久化文件,当 Redis 重启时,如果目录下存在 RDB 或 AOF 文件,就会自动将数据恢复到 Redis 中
主节点写数据,从节点备份数据,也可以进行一些读操作,缓解主节点压力。主从架构需要自己写代码将读、写操作分配到对应的主节点与从节点,如果是哨兵或者集群架构可以自动分发。
主从架构搭建步骤:
1、复制一份主节点的 redis.conf 文件
2.修改 redis.conf 相关配置
port 6380 #从节点使用端口
pidfile /var/run/redis_6380.pid #把pid进程号写入pidfile配置的文件
logfile "6380.log" #日志文件
dir /usr/local/redis‐5.0.1/data/6380 #指定数据存放目录
protected-mode no #关闭保护模式,开启仅本机可访问
# 注释掉 bind,它绑定当前及其ip,表示客户端运行哪些网卡ip去访问,内网一般不需要配置
# bind 127.0.0.1
3.配置主从复制
replicaof 192.168.56.10 6379 #从本机6379的redis复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读
4.启动从节点
redis‐server redis.conf
5.连接从节点
redis‐cli ‐p 6380
#如果需要配置更多的从节点,可以继续复制一份配置文件,添加即可
主从复制原理:
主从复制风暴: 主从复制过程中可能出现从节点较多,多个从节点同时从主节点进行复制,造成主节点压力过大,可以让将部分从节点搭建到从节点上,使其从从节点同步数据
客户端连接哨兵,第一次访问时从哨兵找出 Redis 的主节点,后续就直接访问 Redis 的主节点。哨兵动态监听所有的节点,主节点挂了,哨兵自动选举新的主节点,并把新的主节点推送给客户端(Redis 的 client 端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)。
哨兵架构缺点:
推荐三个哨兵,哨兵搭建好后,哨兵会主动写到配置文件,哨兵架构搭建步骤如下:
1、复制一份sentinel.conf文件
cp sentinel.conf sentinel‐6399.conf
2、修改setinel.conf文件相关配置
port 6399
daemonize yes #后台启动
pidfile "/var/run/redis‐sentinel‐6399.pid"
logfile "6399.log"
dir "/usr/local/redis‐5.0.3/data"
# sentinel monitor
# quorum是一个数字,指明当多少个sentinel认为一个master失效时,该master才算真正失效
# 该值一般为:sentinel总数/2 + 1
# masterName随便取
sentinel monitor [masterName] 192.168.56.10 6379 2
3、启动sentinel哨兵实例
src/redis‐sentinel sentinel‐26379.conf
sentinel 集群都启动完毕后,会将哨兵集群的元数据信息写入所有sentinel的配置文件里去,如果之前有配置过,最后一条最新的才是生效的配置
# 启动完成后,可以连接Redis后使用Info命令查看sentinel信息,配置多个,添加sentinel即可
src/redis‐cli ‐p 6399
info
#info命令执行后如下
#代表redis主节点的从节点信息
sentinel known‐replica masterTest 192.168.56.10 6380
#代表感知到的其它哨兵节点
sentinel known‐sentinel masterTest 192.168.56.10 6399 xxxxxxxx
SpringBoot 整合 Redis 并使用哨兵架构
1.引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring‐boot‐starter‐data‐redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons‐pool2artifactId>
2.配置文件
spring:
redis:
database: 0
timeout: 3000
sentinel: #哨兵模式
master: masterTest #主服务器所在集群名称
nodes: 192.168.56.10:6379,192.168.56.10:26380:26380,192.168.56.10:6381
lettuce:
pool: #连接池想信息
max-idle: 50
min-idle: 10
max-actice: 800
max-wait: 800