- 《Redis开发与运维》总结,需实测数据来源于Redis5.0.7
- 慢日志分析:
- 客户端执行过程:发送 - 排队 - 执行 - 反馈,慢日志只记录执行时间
- Redis提供两个配置:
- 预设阈值
slowlog-log-slower-than
:默认10000微秒,线上建议缩小至1000微秒 - 保存条数
slowlog-max-len
:默认128条,线上建议1000条或更大 - 其他:用
config get slowlog*
查询配置、slowlog get
查询具体数据、还可以查询条数,设置有指令和配置文件两种方式。
- 预设阈值
- 数据项:一共6项分别代表 ID、发生时间、耗时、具体指令、客户端ip port、客户端别名。
- 客户端:
- Redis通信协议:
- RESP,RESP规定了Redis数据的发送和响应格式,可以用socket模拟编
写客户端。 - 开发过一个Redis远程控制台功能,和redis-cli一样直接执行指令,没找到Jedis直接执行指令的方法,所以就想着模拟RESP编写客户端,发现指令不按RESP标准格式传输,socket直接传输命令加换行如“get a\r\n”也可以执行,返回结果和RESP一致,省去了很多时间。
- RESP,RESP规定了Redis数据的发送和响应格式,可以用socket模拟编
- 客户端问题排查
client list
属性说明:- id、addr(远程ip端口)、fd(文件描述符)、name(客户端名字可设置)
- qbyf、qbuf-free:输入缓冲区总容量、剩余容量,每个缓冲区不超过1G否则关闭,不受maxmemory限制,超出会产生数据丢失、淘汰、OOM等异常,可能场景
处理速度跟不上堆积、大key、Redis阻塞
,还可以调用info clients
监控最大缓冲,超出范围报警。 - obl、oll、omem:输出缓冲区,可配置容量,同样不受maxmemory限制超出产生异常,obl代表固定缓冲区长度16KB,oll代表动态缓冲区长度,omem代表总使用字节数,obl返回较小结果,oll返回较大结果,需监控内存抖动或配置上控制。
- age、idle:代表已连接时间和空闲时间、idle过大时说明客户端一直空闲。
- maxclients、timeout:最大连接数默认10000、默认没超时,超过后客户端强制关闭。
- flag:当前客户端状态,如正在执行monitor或正在等待阻塞时间等等
- RDB:
-
RDB
:压缩的二进制文件,是Redis在某个时间点的快照,适用于备份、全量复制,回复速度远远快于AOF
,但因为是全量快照,所以不能做到实时备份。 -
bgsave
:创建子线程,生成RDB保存到硬盘的指令。指令分手动触发和自动触发两种方式,自动触发分四种情况:- 配置中默认有三个
save m n
配置即m秒内执行n次修改,则触发bgsave
- 从节点复制时需要把主节点RDB文件发给从节点,触发一次
- debug reload命令会生成RDB文件并置空Redis
- 执行shutdown时,如果没开AOF会触发
- 配置中默认有三个
- AOF:
-
AOF
:追加修改命令(RESP格式)到缓冲区,缓冲区根据配置定期同步到磁盘,弥补了RDB
的缺点。 -
appendonly
:与RDB不同,AOF是配置中appendonly
控制的,默认不开启。 -
appendfsync
:上面提到的缓冲区同步策略,分为三种:-
always
:每次修改都要同步到AOF,不会丢数据,性能差 -
everysec(默认)
:每秒同步一次,性能和安全的折中 -
no
:同步依靠系统调度,如缓冲区页空间满或特定时间周期。
-
- 阻塞:
- 问题发现:客户端报异常,服务端监控,监控内容包括慢日志、大Key、每秒指令个数、内存容量、CPU、硬盘、网络IO等。
- 常见监控信息及获取途径:
- 命中率:info指令,keyspace_hits:14414110、keyspace_misses:3228654
- 客户端连接数:info clients connected_clients
- 客户端上限:CONFIG GET maxclients
- 内存使用率:info memory的maxmemory、used_memory、used_memory_rss、mem_fragmentation_ratio(碎片率)
- 慢日志:SLOWLOG GET
- 每秒操作数:info stats | grep instantaneous_ops_per_sec
- Redis IO:info stats | grep instantaneous_input_kbps
- 系统CPU、用户cpu
未完
网友评论