一、Redis持久化
1. 持久化概述
Redis是基于内存的数据库,数据都是存储在内存当中。持久化就是将数据保存到硬盘当中,防止进程退出导致数据丢失,主要作用就是用于数据的备份。
Redis持久化分为RDB持久化和AOF持久化。RDB持久化是指人工或者定时将内存的数据存入磁盘,属于冷备份,是Redis默认的持久化方式;AOF持久化类似于MySQL基于二进制恢复数据,REDIS相关操作会记录在二进制文件当中,恢复的时候根据文件内容进行恢复,属于热备份。
AOF持久化操作的实时性更好,进程如果意外退出,丢失的数据少,可恢复的数据是最多,属于主流持久化方式。
2. RDB持久化
RDB持久化是在一定的时间内将数据通过快照的方式保存到硬盘当中,所以也被称为是快照持久化。生成的快照文件(RDB文件)后缀名是.rdb或.redis,每次重启的时候会读取快照文件进行数据的恢复。
RDB持久化有两种方式,save和bgsave。通过save方式持久化,会阻塞Redis进程,直到文件创建完毕。阻塞期间,Redis不能够处理任何操作请求。而bgsave方式持久化,是通过子进程实现快照文件,只有在fork子进程的时候会阻塞Redis进程。子进程创建快照文件的同时,主进程可以支持处理操作请求。
因此,在真实的操作环境当中,使用bgsave方式,而不是save方式。
3. AOF持久化
一旦开启AOF持久化,Redis就会将AOF为默认的持久化方式,并立刻读取二进制文件。因此要开启AOF就要在初始化时开启。当AOF文件被截断时,如
必须给Redis的内存设置阈值,不设置阈值,只要Redis有需求,就会占用整个内存,并占用交换空间,导致系统崩溃。设置阈值后,Redis使用的空间到达阈值,系统会自动回收生命周期不足的key。
- volatile-lru
- volatile-ttl
- allkeys-lru
- allkeys-random
Redis雪崩
- 集群大面积故障
- 缓存键值对全部被删除
- 大量Redis请求失败
Redis击穿
- 热点数据缓存失效,大量热点请求全部转发到数据库
Redis穿透
- 缓存键值对和数据库中都没有数据,但是有客户端不断请求
4. 持久化的配置与实现
4.1 RDB持久化
-
编辑Redis的配置文件/etc/redis/redis.conf ,设置RDB持久化的自动触发。
# 触发条件 svae 900 1 save 300 10 save 60 10000 # 开启RDB压缩 rdbcompression yes # 设置RDB文件名 dbfilename dump.rdb # 设置持久化文件的存放路径 dir /var/lib/redis
- svae 900 1:Redis数据在每900秒内至少发生1次变化,就会执行bgsave。
-
保存文件后,要重启Redis服务。
systemctl restart redis
4.2 AOF持久化
-
编辑Redis的配置文件/etc/redis/redis.conf ,设置AOF持久化。
# 开启AOF持久化 appendonly yes # 设置AOF文件名 appendfilename "appendonly.aof" # 恢复数据时,如果AOF文件被截断,会尽可能多的恢复数据 aof-load-truncated yes # 设置AOF文件重写的触发条件,值为百分比 # 100表示AOF文件增长到上一次重写后的两倍大小才会触发重写操作 auto-aof-rewrite-percentage 100 # 设置触发重写的AOF文件基准大小 auto-aof-rewrite-min-size 64mb
-
重启Redis服务。
systemctl restart redis
二、Redis主从复制
1. 主从复制概述
主从复制是Redis实现哨兵模式和集群的基础,工作原理和MySQL主从复制相同,主节点负责写入,再将数据同步到从节点当中。主节点可写,而从节点只有读数据的权限。
2. 主从复制流程
- 从节点启动,会向主节点发送一个sync command命令,请求建立同步连接。
- 主节点会开启一个后台进程,将数据保存到数据文件中。
- 主节点收到请求后,会将数据文件发送给从节点。
3. 主从复制配置
集群架构
Master:192.168.1.128
Slave1:192.168.1.129
Slave2:192.168.1.130
3.1 Master节点
-
修改Master节点Redis配置文件/etc/redis/redis.conf。
# 注释掉监听地址 # bind 0.0.0.0 # 开启守护进程,允许后台启动 daemonize yes # 开启AOF持久化 appendonly yes
-
重启Redis服务。
systemctl restart redis
3.2 Slave节点
-
修改两个节点的Redis配置文件/etc/redis/redis.conf。
# 注释掉监听地址 # bind 127.0.0.1 ::1 # 开启守护进程,允许后台启动 daemonize yes # 设置同步的Master节点IP和端口 replicaof 192.168.1.128 6379 # 开启AOF持久化 appendonly yes
-
重启Redis服务。
systemctl restart redis
3.3 测试主从
-
在Master节点上查看Redis服务的运行日志,是否出现从节点同步主节点的日志信息。
tail -f /var/log/redis/redis-server.log
三、Redis哨兵模式
1. 哨兵模式概述
哨兵模式在主从模式基础之上,引入了故障切换功能。对主从复制架构中的每个节点进行监控,当主节点出现故障,会通过投票机制选择新的主节点。从节点会同步新主节点的数据。
2. 哨兵模式流程
- 主从节点之间,都有一个心跳检测。
- 主节点宕机,从节点会收到主节点宕机消息。
- 从节点之间会进行投票,选举出新的主节点。
- 从节点会自动加入新的主节点的主从复制架构。
3. 哨兵模式的配置与实现
集群架构
Master:192.168.1.128
Slave1:192.168.1.129
Slave2:192.168.1.130
-
部署完主从复制,再在三个节点上安装Redis Sentinel服务。
apt -y install redis-sentinel
-
编辑Redis Sentinel的配置文件/etc/redis/sentinel.conf。
# 注释掉监听地址 # bind 127.0.0.1 ::1 # 取消注释,关闭保护模式 protected-mode no # 修改为yes,设置后台运行 daemonize yes # 设置主节点的节点名称、IP地址和端口号,以及要进行故障转移的从节点最小同意数 sentinel monitor mymaster 192.168.206.40 6379 2 # 设置检查主节点是否宕机的时间周期,单位是毫秒 sentinel down-after-milliseconds mymaster 30000 # 设置节点的最大超时时间,单位是毫秒 sentinel failover-timeout mymaster 18000
-
重启Redis Sentinel服务。
systemctl restart redis-sentinel.service
4. 测试哨兵模式
-
在主节点上实时查看Redis Sentinel服务的日志文件。
tail -f /var/log/redis/redis-sentinel.log
-
在另外一个终端上关闭主节点的Redis服务,查看日志文件是否显示主节点切换的日志信息。
systemctl stop redis
四、Redis集群
1. 集群概述
Redis的集群模式引入了哈希槽,集群有16384个哈希槽(0-16383)。每个节点会被平均分配哈希槽,因此在集群模式下,节点数量通常是3的倍数。
2. 集群配置和实现
集群节点:192.168.1.128、192.168.129、192.168.1.130
-
修改各个节点的Redis配置文件/etc/redis/redis.conf。
# 注释掉监听地址 # bind 127.0.0.1 ::1 # 取消注释,关闭保护模式 protected-mode no # 修改为yes,设置后台运行 daemonize yes # 开启AOF持久化 appendonly yes # 开启集群模式 cluster-enabled yes # 设置集群的配置文件 cluster-config-file nodes-6379.conf # 设置集群的超时时间,单位是毫秒 cluster-node-timeout 15000
-
保存配置文件,重启Redis服务。
systemctl restart redis
-
在任意一个节点上启动集群。
redis-cli --cluster create 192.168.1.128:6379 192.168.1.129:6379 192.168.1.130:6379
- 还可以使用–cluster-replicas设置主节点的从节点数量,同时设置的集群节点也得增加。比如一主一从的模式下,需要有6个节点,–cluster-replicas设置为1。