赞
踩
目录
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群,下面分别说明它
们的作用,以及解决了什么样的问题
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致
Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内
存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备
份,可以将持久化文件拷贝到一个远程位置
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导Redis
进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存
到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可
以将持久化文件拷贝到一个远程位置
Redis 提供两种方式进行持久化
由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持
久化方式,不过RDB持久化仍然有其用武之地
RDB持久化是指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据
触发条件
RDB持久化的触发分为手动触发和自动触发两种
- vim /etc/redis/6379.conf #编辑配置文件
-
- ----219行--以下三个save条件满足任意一一个时,都会引起bgsave的调用
- save 900 1 #当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
- save 300 10 #当时间到300秒时,如果redis数据发生了至少10次变化,则执行bgsave
- save 60 10000 #当时间到60秒时,如果redis数据发生了至少10000次变化, 则执行bgsave
-
- ----242行--是否开启RDB文件压缩
- rdbcompression yes
-
- ----254行--指定RDB文件名
- dbfilename dump.rdb
-
- ----264行--指定RDB文件和AOF文件所在目录
- dir /var/lib/redis/6379
除了savemn以外,还有一些其他情况会触发bgsave
在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点。
执行shutdown命令时,自动执行rdb持久化
Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程.如果在执行则bgsave命令直接返回。 bgsave/bgrewriteaof的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题.
总结
redis父进程会fork子进程来进行RDB持久化快照保存内存数据到硬盘里,文件名:dump.rdb
Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配置文件中配置
- vim /usr/local/redis/conf/redis.conf
- --1380行--修改,开启AOF
- appendonly yes
- --1407行--指定AOF文件名称
- appendfilename "appendonly.aof"
- --1505行--是否忽略最后一条可能存在问题的指令
- aof-load-truncated yes
-
- systemctl restart redis-server.service
命令追加
Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘IO成为Redis负载的瓶颈
命令追加的格式是Redis命令请求的协议格式,它是一种纯文本格式,具有兼容性好、可读性强、容易处理、操作简单避免二次开销等优点
在AOF文件中,除了用于指定数据库的select命令(如select 0为选中0号数据库)是由Redis添加的, 其他都是客户端发送来的写命令
文件写入和文件同步
Redis提供了多种AOF缓存区的同步文件策略,策略涉及到操作系统的write函数和fsync函数,说明
如下:
为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里
这样的操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失。因此系统同时提供了fsync、fdatasync等同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保数据的安全性
AOF缓存区的同步文件策略存在三种同步方式,它们分别是
文件重写
注意:
重写会消耗性能,影响业务,不能在业务高峰期进行重写。所以一般会关闭自动重写,由定时任务
在每天的某一时刻定时执行重写功能
文件重写压缩AOF文件的原因
过期的数据不再写入文件
无效的命令不再写入文件:如有些数据被重复设值(set mykey v1, set mykey v2)、 有些数据被删除了(set myset vl, del myset)等
多条命令可以合并为一个:如sadd myset v1, sadd myset v2, sadd myset v3可以合并为sadd myset v1 v2 v3。(sadd添加集合)
通过上述内容可以看出,由于重写后AOF执行的命令减少了,文件重写既可以减少文件占用的空间,也可以加快恢复速度
文件重写的触发,分为手动触发和自动触发
当AOF开启时,Redis启动时会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会载入RDB文件恢复数据当AOF开启,但AOF文件不存在时,即使RDB文件存在也不会加载。Redis载入AOF文件时,会对AOF文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。但如果是AOF文件结尾不完整(机器突然宕机等容易导致文件尾部不完整),且aof-load-truncated参数开启,则日志中会输出警告,Redis忽略掉AOF文件的尾部,启动成功。aof-load-truncated参数默认是开启的
RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比,RDB最重要的优点之一是对性能的影响相对较小
实时性不如AOF,兼容性较差,持久化期间在fork子进程时会阻塞redis父进程
与RDB持久化相对应,AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大、恢复速度
慢、对性能影响大
持久化保存的文件占用空间更大,恢复速度更慢,性能影响更大,AOF文件重写期间在fork子进程
时也会阻塞redis父进程,且IO压力更大
- (1) redis-cli
- 127.0.0.1:6379> info memory
-
- (2) redis-cli info memory
- mem_fragmentation_ratio:内存碎片率
- mem_fragmentation_ratio = used_memory_rss / used_memory
- used_memory_rss: 是Redis向操作系统申请的内存
- used_memory: 是Redis中的数据占用的内存
- used_memory_peak: 是redis内存使用的峰值
如果你的Redis版本是4.0以下的,需要在redis-cli工具上输入shutdown save命令,让Redis数据库
执行保存操作并关闭Redis服务,再重启服务器。Redis服务器重启后,Redis会将没用的内存归还
给操作系统,碎片率会降下来
Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片
config set activedefrag yes #自动碎片清理,内存就会自动清理了
memory purge #手动碎片清理
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
避免内存交换发生的方法
针对缓存数据大小,选择安装Redis实例
尽可能的使用Hash数据结构存储
设置key的过期时间
内存数据淘汰策略,保证合理分配redis有限的内存资源
当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除。
配置文件中修改maxmemory-policy属性值
- vim /usr/local/redis/conf/redis.conf
- --1149--
- maxmemory-policy noenviction
- volatile-lru
- volatile-ttl
- volatile-random
- allkeys-lru
- allkeys-random
- noenviction
#####################
设置 config set activedefrag yes 开启内存碎片自动清理,或者定时执行 memory purge 清理内存碎片
尽可能使用 hash 数据类型存储数据。因为 hash 类型的一个 key 可包含多个字段,该类型的数据占用空间较小
建议给 key 设置过期时间
精简 key 的键名和键值,控制 key 占用空间的大小,避免 bigkey 的产生(redis-cli --bigkeys 可用于查找bigKey)
修改配置 maxmemory 指定redis可占用的最大内存大小
maxmemory-policy 指定内存数据淘汰策略(key的回收策略),实现保证内存使用率不超过最大内存
maxmemory-samples 指定内存数据淘汰策略的样本数量,一般为3~7,值越大样本越精确
maxclients 指定最大客户端连接数
tcp-backlog 指定最大连接排队数
timeout 指定连接超时时间
lazyfree-lazy-expire yes 设置惰性删除,将删除过期key的操作放在后台中去执行,避免阻塞主线程
no-appendfsync-on-rewrite yes 设置AOF文件重写期间,AOF后台子进程不进行刷盘操作,避免AOF重写和fsync竞争磁盘IO资源,导致redis延迟增加设置AOF持久化和主从复制来备份数据,采用哨兵或集群模式实现redis集群的高可用
建议设置 config set requirepass 或 修改配置 requirepass 来设置 redis 密码
redis的三大缓存问题
正常情况下,大部分的访问请求应该是先被redis响应的,在redis那里得不到响应的小部分访问请
求才会去请求MySQL数据库获取数据,这样MySQL数据库的负载压力是非常小的,且可以正常工
作。缓存雪崩/穿透/击穿三大问题的根本原因在于redis缓存命中率下降,大量请求会直接发送给
MySQL数据库,导致MySQL数据库压力过大而崩溃
redis中大量缓存key集体过期
Redis 集群产生了大面积故障;
缓存失败,此时仍有大量请求去访问 Redis 缓存服务器;
在大量 Redis 请求失败后,这些请求将会去访问数据库;
由于应用的设计依赖于数据库和 Redis 服务,很快就会造成服务器集群的雪崩,最终导致整个系统的瘫痪
大量请求访问redis和MySQL都不存在的资源
redis中一个热点key过期,此时又有大量用户访问这个热点key(redis-cli --hotkeys 可用于查找热Key)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。