一、 常见故障分析
1. 内存过高分析
- info 命令查看key总数是否大量增加,占用内存是否大量增加
- redis-cli -h host -p port client list | grep -v "omem=0",查询输出缓冲区不为0的客户端连接,omem字段为占用的内存量(B),cmd字段为命令,从client_longest_output_list看是否输出缓冲区占用内存较大,也就是有大量的数据从Redis服务器向某些客户端输出。参考 https://carlosfu.iteye.com/blog/2254571
2. CPU高分析
client list中后面有命令,具体的话就要看monitor(monitor消耗cpu也高,不能执行太久)。client list就是看执行那一时间点的,monitor就全些。
redis-cli -a xxx monitor > redis.txt
看都执行了什么命令(看cmd=部分),有没有消耗CPU的一些异常命令。一般引起CPU高都是一下子取很多值的,从之前的异常排查来看,还是getall,keys *这类的命令最消耗CPU
新建连接和每秒的操作数量增加也会CPU增加。
3. 压测时主要关注项
- 慢日志:slowlog get
- ops数:info stats,查看 instantaneous_ops_per_sec 指标。一般可以支撑每秒6到8K,如果只有几百几十,说明操作很少,那一般就不是redis的问题
二、 常用命令
1. 启停命令
Linux启动
$redis-server $REDIS_DATA/conf/redis.conf
Windows启动
$redis-server –-console
Windows && Linux停止
$redis-cli –p port –a passwd shutdown save
生产环境关闭方法
redis-cli
#执行
bgrewriteaof
shutdown save
检查redis进程脚本,未启动则自动启动
#! /bin/bash
#redis port 6380
ProcName=*:6380
ProcNumber=`ps -ef |grep -w $ProcName|grep -v grep|wc -l`
if [ $ProcNumber -le 0 ];then
echo "Redis 6380 is not running" >> auto_start_redis.log
redis-server /u01/redis/rd6380/conf/redis.conf
else
echo "Redis 6380 is running" >> auto_start_redis.log
fi
2. 实例管理
检查连接情况
client list
库中KEY的数量
info keyspace
检查主从同步状态,看master_link_status,slave_repl_offset与master_repl_offset
info replication
DB中键的数量
dbsize
切换数据库(redis用数字作为多个数据库的实现,默认16个,编号为0-15)
select db号
清除所有数据库(高危)
flushall
清除当前数据库(高危)
flushdb
3. 慢查询
两个参数
- slowlog-log-slower-than 10000 慢查询捕获阈值(默认10000微秒)
- slowlog-max-len 128 慢日志最多存储条数(默认128,超过后先进先出)
获取慢日志
- slowlog get [n] n指定条数
慢日志格式
- 慢查询日志标识id
- 发生时间戳
- 命令耗时(微秒)
- 执行命令
- 命令参数
获取慢日志列表长度
- slowlog len
慢日志重置
- slowlog reset
4. 配置管理
支持两种修改配置方法:
- 改配置文件
- config set 动态修改,并将配置持久化到本地文件
-- 参数设置
config set slowlog-max-len 1000
-- 将配置持久化到本地文件
config rewrite
获取配置信息
- CONFIG GET CONFIG_SETTING_NAME
获取所有配置
- CONFIG GET *
5. 备份
- RDB备份命令:bgsave
- AOF备份命令:bgrewriteaof
6. 客户端相关
列出连接到redis服务端的客户端信息
- client list(执行较慢,连接数较多时频繁执行可能阻塞redis)
- info clients(执行较快,不能精确定位到所有客户端,只能显示输入缓冲区最大值)
设置客户端名
- client setName xx
- client getName
杀掉指定IP地址和端口的客户端
- client kill 127.0.0.1:52343
- client kill ip:port
元素过大问题
list元素数量不大的情况下,lrang就算全量读也不会有问题。如果list中元素本身太大,会导致:
- 严重的内存消耗,就算删除list中的元素也会造成内存碎片;
- 网卡带宽可能被大量占用,造成读写性能问题,如果机器上还有其它应用的话,也会受影响;
- redis本身不适合存储大key,平常最佳实践中单个key大小最大不超过2M,要不性能就会有问题。