共计 2361 个字符,预计需要花费 6 分钟才能阅读完成。
转自 @twt 社区,【作者】姜文浩。
Redis 数据库是一个基于内存的 key-value 存储系统,当初 redis 最罕用的应用场景就是存储缓存用的数据,在须要高速读 / 写的场合应用它疾速读 / 写,从而缓解利用数据库的压力,进而晋升利用解决能力。
因为 Redis 的单线程架构,所以须要每个命令能被疾速执行完,否则会存在阻塞 Redis 的可能,了解 Redis 单线程命令解决机制是开发和运维 Redis 的外围之一。
许多数据库会提供慢查问日志帮忙开发和运维人员定位系统存在的慢操作。所谓慢查问日志就是零碎在命令执行前后计算每条命令的执行工夫,当然在数据库中最常见的就是 select 这些 sql 语句了,当超过预设阀值,就将这条命令的相干信息(例如:产生工夫,耗时,命令的详细信息)记录下来,Redis 也提供了相似的性能。
那么如何应用 Redis 所提供的慢查问性能呢?Redis 次要提供了 slowlog-log-slower-than 和 slowlog-max-len 两个配置参数来提供这项性能。两项参数别离用来设置慢查问的阈值以及存加快查问的记录。首先对 redis 的这两个配置进行一个阐明:
从字面意思就能够看出,能够通过 slowlog-log-slower-than 参数设置什么状况下是慢语句,只有 redis 命令执行工夫大于 slowlog-log-slower-than 的才会定义成慢查问,才会被 slowlog 进行记录。它的单位是微秒(1 秒 =1000 毫秒 =1000000 微秒),在初始状况下默认值是 10000,也就是 10ms,如果执行了一条比较慢的命令,如果它的执行工夫超过了 10ms,那么它将被记录在慢查问日志中。(如果 slowlog-log-slower-than= 0 会记录所有的命令,slowlog-log-slower than<0 对于任何命令都不会进行记录)
从字面意思看,slowlog-max-len 阐明了慢查问日志最多能够存储多少条记录,实际上 Redis 应用了一个列表来存储慢查问日志,slowlog-max-len 就是列表的最大长度,它本身是一个先进先出队列,当 slowlog 超过设定的最大值后,会将最早的 slowlog 删除。简而言之当一个新的命令满足慢查问条件时会被插入到这个列表中,当慢查问日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如 slowlog-max-len 设置为 50,当有第 51 条慢查问插入的话,那么队头的第一条数据就入列,第 51 条慢查问就会入列。
接下来具体介绍一下如何配置这两个参数,有两种形式进行配置,以下截图全副应用了 redis -5.0.5 版本:
形式一:通过配置 redis.conf 文件进行配置。
通过批改 redis .conf 文件之后重启 redis 服务,配置即可失效。
形式二:通过 CONFIG 命令进行动静配置
配置查问工夫超过 1 毫秒的命令进行记录
保留 500 条慢查记录
通过 config get 命令确认配置已失效
要留神通过 config 命令配置的为动静失效,一旦服务重启则会从新复原为默认设置,所以倡议在排查问题时通过 config 这种形式进行配置,然而服务稳固后通过批改配置文件形式进行最终确认(能够通过 config rewrite 命令长久化到本地文件,但要次要启动 redis 时要指定 redis . conf 文件 该命令才能够失效)。
相干的参数曾经设置实现了,那么如何查看记录的信息呢?要想查看所记录的日志,次要应用 SLOWLOG GET 或者 SLOWLOG GET number 命令,前者将会输入所有的 slow log,最大长度取决于 slowlog-max-len 选项的值,而 SLOWLOG GET number 则只打印指定数量的日志。
查看以后日志数量: 应用 SHOW LEN 命令查看日志数量。
因为我是新装置的 redis,所以当初还没有耗时长日志,所以条数是 0,如果日志条数过多,还能够应用 slowlog reset 命令进行日志清空。
为了不便演示,我将所有的执行命令都记录了下来,以第一条为例,
1、(integer) 1 # 唯一性 (unique) 的日志标识符
2、(integer) 1562075522 # 被记录命令的执行工夫点,以 UNIX 工夫戳格局示意
3、(integer) 93 # 查问执行工夫,以微秒为单位
4、1.”CONFIG” # 执行的命令,以数组的模式排列
5、”GET”
6、” ” # 这里残缺的命令是 CONFIG GET
慢查问性能能够无效地帮忙咱们找到 Redis 可能存在的瓶颈,但在理论应用过程中要留神以下几点:
- slowlog-max-len 配置倡议:线上倡议调大慢查问列表,记录慢查问时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查问列表能够减迟缓查问被剔除的可能,例如线上可设置为 2000 以上(5.0.5 版本默认为 128)。
- slowlog-log-slower-than 配置倡议:默认值超过 10 毫秒断定为慢查问,须要依据 Redis 并发量调整该值。因为 Redis 采纳单线程响应命令,对于高流量的场景,如果命令执行工夫在 1 毫秒以上,那么 Redis 最多可撑持 OPS 不到 1000。因而对于高 OPS 场景的 Redis 倡议设置为 1 毫秒(OPS 指每秒操作次数)。
- 慢查问只记录命令执行工夫,并不包含命令排队和网络传输工夫。因而客户端执行命令的工夫会大于命令理论执行工夫。因为命令执行排队机制,慢查问会导致其余命令级联阻塞,因而当客户端呈现申请超时,须要查看该工夫点是否有对应的慢查问,从而剖析出是否为慢查问导致的命令级联阻塞。
- 因为慢查问日志是一个先进先出的队列,也就是说如果慢查问比拟多的状况下,可能会失落局部慢查问命令,为了避免这种状况产生,能够定期执行 slow get 命令将慢查问日志长久化到其余存储中,而后能够进行相干的监控、告警、剖析工作。