02.Redis持久化、主从复制与哨兵模式

一、Redis持久化

RDB快照(snapshot)

默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。可以对 Redis 进行设置(save N M),让它在“ N 秒内数据集至少有 M 个改动 ”这一条件被满足时, 自动保存一次数据集(当前时刻的整个内存)为 RDB 文件。也可以进入 Redis 客户端,手动执行命令 savebgsave 立即生成 dump.rdb 快照文件(默认存放路径为 dump.rdb)。如果需要关闭 RDB 快照,只需要将 redis.conf 文件的 save 60 10000 等配置注释即可、

  • save 生成 RDB 快照时,会阻塞正在进行 Redis 操作命令
  • bgsave 默认的持久化文件机制 写时复制(COW)机制,不会阻塞正在进行 Redis 操作命令。 Redis 借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据,子进程开始读取内存数据并写入 RDB 文件后,此时,如果有新的操作命令,会进行在内存中执行,然后会生成一块新的该数据的副本数据写入到 RDB 文件中。这个过程中主线程依旧可以修改原来的数据。
命令savebgsave
IO类型同步异步
是否阻塞redis其它命令否(在生成子进程执行调用fork函数时会有短暂阻塞)
复杂度O(n)O(n)
优点不会消耗额外内存不阻塞客户端命令
缺点阻塞客户端命令需要fork子进程,消耗内存
  • RDB 快照的优点:文件体积小,恢复数据速度快
  • RDB 快照的缺点:如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据

AOF 持久化(append-only file)

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
  • AOF 的优点:数据安全性比 RDB 高
  • AOF 的缺点:命令过多时体积过大,恢复数据速度慢,安全性根据策略决定**
命令RDBAOF
启动优先级高 (更安全)
文件体积
恢复速度
数据安全性容易丢失数据由策略决定

Redis 4.0 混合持久化

AOF在重写时,不再是单纯将内存数据转换为 RESP 命令写入 AOF 文件,而是将重写这一刻之前的内存做 RDB 快照处理,并且将 RDB 快照内容和增量的 AOF 修改内存数据的命令存在一起,都写入新的 AOF 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的 AOF 文件才会进行改名,覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。开启配置命令如下(必须先开启 AOF):

# aof‐use‐rdb‐preamble yes

Redis 数据备份策略

  1. 写 crontab 定时调度脚本,每小时都 copy 一份 rdb 或 aof 的备份到一个目录中去,仅仅保留最近 48 小时的备份
  2. 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份
  3. 每次 copy 备份的时候,删除太旧的备份
  4. 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

注意: 停掉 Redis 之前会自动做一次持久化文件,当 Redis 重启时,如果目录下存在 RDB 或 AOF 文件,就会自动将数据恢复到 Redis 中

二、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 的主节点。哨兵动态监听所有的节点,主节点挂了,哨兵自动选举新的主节点,并把新的主节点推送给客户端(Redis 的 client 端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)。

哨兵架构缺点:

  • 主节点挂掉后,重新选举会有几秒甚至十几秒的不可用
  • 只有一个节点作为写节点,并发量最大也就 10W左右
  • 最大内存推荐10个G,再大影响性能(持久化文件过大,影响数据恢复或主从同步的效率)
    在这里插入图片描述

推荐三个哨兵,哨兵搭建好后,哨兵会主动写到配置文件,哨兵架构搭建步骤如下:

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 <master‐redis‐name> <master‐redis‐ip> <master‐redis‐port> <quorum>
# 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.boot</groupId> 
    <artifactId>spring‐boot‐starter‐data‐redis</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons‐pool2</artifactId> 
</dependency

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 持久化是指将内存中的数据保存到磁盘上,以防止服务器重启或者意外宕机时数据的丢失。Redis提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。 RDB是将当前内存中的数据快照保存到磁盘上,它是一个二进制文件,可以通过配置定期或者手动触发生成。RDB持久化方式相对于AOF持久化方式更加紧凑,适合备份和恢复大数据集。但是,RDB持久化方式会导致数据在断电或宕机时的数据丢失。 AOF是将Redis服务器接收到的写操作追加到文件末尾,类似于日志文件,通过重放日志来恢复数据。AOF持久化方式相对于RDB持久化方式更加安全,可以降低数据丢失的风险。但是,AOF持久化方式相对于RDB持久化方式会占用更多的磁盘空间,并且恢复数据的速度相对较慢。 主从复制是指将一个Redis服务器的数据复制到多个从服务器上。主从复制可以实现数据的热备份、读写分离以及负载均衡。主服务器接收到写操作后,会将写操作同步到所有从服务器上,从服务器会将主服务器的数据复制到本地。主从复制可以提高系统的可用性和性能。 哨兵模式是为了解决Redis主从复制中主服务器宕机后自动切换问题而引入的。哨兵是一个独立运行的进程,它会监控主服务器和从服务器的状态。当哨兵检测到主服务器宕机后,会选举一个从服务器作为新的主服务器,并通知其他从服务器切换主服务器。 雪崩是指缓存中大量的数据同时失效,导致大量请求直接访问数据库,造成数据库压力过大。击穿是指某个特定的key失效,导致大量请求同时访问数据库。穿透是指请求的数据在缓存中不存在,也不存在于数据库中。 解决雪崩的办法可以采用多级缓存缓存预热、限流等方式来减轻数据库的压力。解决击穿的办法可以采用互斥锁、热点数据预加载等方式来保护数据库。解决穿透的办法可以采用布隆过滤器、空结果缓存等方式来避免无效请求直接访问数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值