Redis管理
1. 从指定config加载一个服务
redis-server conf/redis.conf
redis-server 可以为绝对路径、配置路径也可以为绝对路径
eg. /usr/local/bin/redis-server ~/build/redis4.0.1/conf/redis-6379.conf
2. 使用命令行参数覆盖配置文件参数
eg. redis-server conf/redis.conf --loglevel debug --port 6666
3. 使用config get 获取server配置
eg. 127.0.0.1:6379> config get loglevel
4. 使用config rewrite 把当前的配置持久化到配置文件
eg. 127.0.0.1:6379> config set loglevel debug
127.0.0.1:6379> config rewrite
此时、搜索配置 cat redis.conf | grep loglevel
会发现已经修改为 debug
注意:若启动时、未指配置文件、会写入失败它不知道写哪个文件
5. config resetstat会重置 info stats 的几个计数器
键的命中总数:keyspace hits
键的未命中总数:keyspace misses
处理命令的数量:total_commands_processed
收到连接总数:total_connections_received
过期键的数量:expired_keys
拒绝连接的数量:rejected_connections
上次调用fork的时间:latest_fork_usec
6. 使用
1) 在redis-cli后直接使用命令
redis4-cli hmset hashkeyA field1 val1 field2 val2
2) --raw选项原始化显示
redis-4.0.11 redis4-cli hgetall hashkeyA
field1
val1
field2
val2
若不添加 --raw 会得到更有可读性的展示
redis-4.0.11 redis4-cli hgetall hashkeyA
1) "field1"
2) "val1"
3) "field2"
4) "val2"
使用--csv选项获取csv格式的输出
redis4-cli --csv hgetall hashkeyA
"field1","val1","field2","val2"
3) redis-cli的最后一个参数也可以从stdin中获取
echo -n "bar" | redis4-cli -x set foo
4) 使用文件中的一组命令
cat commands
set key1 val1
set key2 val2
get key1
get key2
cat commands | redis4-cli
OK
OK
"val1"
"val2"
5) --pipe 选项在redis-cli中启用管道功能
unix2dos commands(启用管道时、redis只接受redis协议格式的命令、所以必须转化为dos格式)
...
cat commands | redis4-cli --pipe
...
6) 可以使用 -r(count) 和 -i(delay)选项以指定时间间隔重复执行命令
redis4-cli -r 5 -i 1 info memory| grep used_memory
备份和恢复
1. 在将要备份的服务器上执行bgsave
redis4-cli:6379> bgsave
Backgroung saving started
2. 将生成的rdb文件复制到安全的位置
cp /var/data/redis.rdb /var/data/backup/dump.$(date +%Y%d%H%M).rdb
3. 检测是否启用了 aof
redis4-cli config get appendonly
4. 若启用了aof、则禁用、否则跳过
redis4-cli config set appendonly no
redis4-cli config rewrite
为什么禁用aof ?
若启用了aof、又未找到aof文件时(下边会将aof文件删除)、reids会用一个空数据集恢复
此时若一旦键的变更触发了rdb快照、原始的RDB文件也将被重写
5. 关闭将要复制到的redis服务器、并删除rdb和aof文件、备份到其它地方
redis4-2-cli shutdown
6. 将要复制的文件复制到它的数据文件目录、并重命名为 dbfilename
cp /var/data/backup/dump.$(date +%Y%d%H%M).rdb /var/data/redis4-2.rdb
7. 给rdb文件正确的权限
chown redis:redis redis4-2.rdb
8. 若有必要、重新启动持久化
redis4-cli config set appendonly yes
redis4-cli config rewrite
监控内存
1. info memory 查看总的内存使用情况
2. memory usage {{key}} 查看单个key的内存使用情况
3. memory stats 查看redis各实例内存使用情况
4. info memory各字段含义可参考:
http://redisdoc.com/server/info.html
5. memory stats 几个参数说明
keys.count 总的键数量
overhead.hashtable.expires 在redis中存储键过期的内存开销
overhead.hashtable.main 维护redis中数据的内存开销
aof.buffer aof 缓冲区的内存消耗
clients.normal 普通客户端缓冲区的内存消耗
clients.slaves 从实例客户端输出缓冲区的内存消耗
replication.backlog 主从复制的内存消耗
6. slowlog get 获取慢查询
config get slowlog-log-slower-than 查看查询时间大于多久被定义为慢查询 单位us
config get slowlog-max-len 如果日志队列已超出会将最早的记录清除、是FIFO队列
7. redis-cli -h 50.30.18.24 --latency 获取往返网络延迟
redis-cli -h 50.30.18.24 --intrinsic-latency 60 进行一次固有延迟测试
redis-cli -h 50.30.18.24 --latency-history -i 10 监控redis服务器的ping实现
8. 延迟可能出现的原因:
1) 慢查询
info commandstats 查看
2) CPU使用率过高
a. 检查redis-server进程cpu使用情况
ps aux | head -1; ps aux | grep redis-server
b. 检查 total_connections_received 指标
info stats | grep total_connections_received
3) redis服务器的持久化
a. 检查最后一次fork耗费的时间
info | grep fork
RDB后台转储和aof重写操作将创建新的进程并在主进程中导致延迟
eg. 保存了大量数据集(>16G)的redis服务器可能会遇到较高的fork延迟
b. 检查 aof_delayed_fsync 是否在增加、并检查 aof_pending_bio_fsync 来判断是否aof重写导致有fsync任务挂起
info | grep aof_delayed_fsync
info | grep aof_pending_bio_fsync
c. 搜索redis日志来判断是否存在缓慢aof fsync
确认是不是redis服务被缓慢的aof给拖慢了
d. 检查redis是否使用了交互空间
[root@lianjia ~]# redis-cli info | grep process_id
process_id:1738
[root@lianjia ~]# awk '/VmSwap/{print $2 " " $3}' /proc/1738/status
0 kB
一个需要交互空间的进程以为着它在等待交换空间中的内存页从交换空间移动到内存时会被内核阻塞
4) 若依然没有线索、可以检测下内部延迟
watch-dog
8. 内存故障分析
1) 注意used_memory_human是否大于maxmemory_human
redis4-cli -h 127.0.0.1 -p 63790 info memory | egrep "used_memory_human|maxmemory_human"
used_memory_human:297.23M
maxmemory_human:1.95G
2) 向redis写入简单的键值来定期检测实例是否在正常工作
set foo bar 10
3) 注意 evicted_keys 指标的增长情况
redis4-cli info stats | grep evicted_keys
4)注意server进程的系统内存
redis4-cli -h 127.0.0.1 -p 63790 info memory | grep used_memory_rss_human
used_memory_rss_human:316.18M
5)注意交换空间的使用情况
[root@lianjia ~]# redis-cli info | grep process_id
process_id:1738
[root@lianjia ~]# awk '/VmSwap/{print $2 " " $3}' /proc/1738/status
0 kB
6) 使用 --bigkeys 获取值较大的key
7) 检查内部的内存使用情况
a. 检查客户端的查询缓冲区的内存使用情况
redis-cli client list | awk 'BEGIN{sum=0} {sum+=substr($12, 6); sum+=substr($13, 11)}END{print sum}'