一、Redis监控

1.参考地址

http://www.redis.cn/commands/info.html

2.内容详解

server相关

redis_version: Redis 服务器版本
redis_git_sha1: Git SHA1
redis_git_dirty: Git dirty flag
redis_build_id: 构建ID
redis_mode: 服务器模式(standalone,sentinel或者cluster)
os: Redis 服务器的宿主操作系统
arch_bits: 架构(32 或 64 位)
multiplexing_api: Redis 所使用的事件处理机制
atomicvar_api: Redis使用的Atomicvar API
gcc_version: 编译 Redis 时所使用的 GCC 版本
process_id: 服务器进程的 PID
run_id: Redis 服务器的随机标识符(用于 Sentinel 和集群)
tcp_port: TCP/IP 监听端口
uptime_in_seconds: 自 Redis 服务器启动以来,经过的秒数
uptime_in_days: 自 Redis 服务器启动以来,经过的天数
hz: 服务器的频率设置
lru_clock: 以分钟为单位进行自增的时钟,用于 LRU 管理
executable: 服务器的可执行文件路径
config_file: 配置文件路径

client相关

connected_clients: 已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_longest_output_list: 当前连接的客户端当中,最长的输出列表
client_biggest_input_buf: 当前连接的客户端当中,最大输入缓存
blocked_clients: 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

memory相关

used_memory: 由 Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_human: 以人类可读的格式返回 Redis 分配的内存总量
used_memory_rss: 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
used_memory_peak: Redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human: 以人类可读的格式返回 Redis 的内存消耗峰值
used_memory_peak_perc: 使用内存占峰值内存的百分比
used_memory_overhead: 服务器为管理其内部数据结构而分配的所有开销的总和(以字节为单位)
used_memory_startup: Redis在启动时消耗的初始内存大小(以字节为单位)
used_memory_dataset: 以字节为单位的数据集大小(used_memory减去used_memory_overhead)
used_memory_dataset_perc: used_memory_dataset占净内存使用量的百分比(used_memory减去used_memory_startup)
total_system_memory: Redis主机具有的内存总量
total_system_memory_human: 以人类可读的格式返回 Redis主机具有的内存总量
used_memory_lua: Lua 引擎所使用的内存大小(以字节为单位)
used_memory_lua_human: 以人类可读的格式返回 Lua 引擎所使用的内存大小
maxmemory: maxmemory配置指令的值
maxmemory_human: 以人类可读的格式返回 maxmemory配置指令的值
maxmemory_policy: maxmemory-policy配置指令的值
mem_fragmentation_ratio: used_memory_rss 和 used_memory 之间的比率
mem_allocator: 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
active_defrag_running: 指示活动碎片整理是否处于活动状态的标志
lazyfree_pending_objects: 等待释放的对象数(由于使用ASYNC选项调用UNLINK或FLUSHDB和FLUSHALL)
在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。
当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。
内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。
当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。
由于Redis无法控制其分配的内存如何映射到内存页,因此常住内存(used_memory_rss)很高通常是内存使用量激增的结果。
当 Redis 释放内存时,内存将返回给分配器,分配器可能会,也可能不会,将内存返还给操作系统。
如果 Redis 释放了内存,却没有将内存返还给操作系统,那么 used_memory 的值可能和操作系统显示的 Redis 内存占用并不一致。
查看 used_memory_peak 的值可以验证这种情况是否发生。

持久化相关

loading: 指示转储文件(dump)的加载是否正在进行的标志
rdb_changes_since_last_save: 自上次转储以来的更改次数
rdb_bgsave_in_progress: 指示RDB文件是否正在保存的标志
rdb_last_save_time: 上次成功保存RDB的基于纪年的时间戳
rdb_last_bgsave_status: 上次RDB保存操作的状态
rdb_last_bgsave_time_sec: 上次RDB保存操作的持续时间(以秒为单位)
rdb_current_bgsave_time_sec: 正在进行的RDB保存操作的持续时间(如果有)
rdb_last_cow_size: 上次RDB保存操作期间copy-on-write分配的字节大小
aof_enabled: 表示AOF记录已激活的标志
aof_rewrite_in_progress: 表示AOF重写操作正在进行的标志
aof_rewrite_scheduled: 表示一旦进行中的RDB保存操作完成,就会安排进行AOF重写操作的标志
aof_last_rewrite_time_sec: 上次AOF重写操作的持续时间,以秒为单位
aof_current_rewrite_time_sec: 正在进行的AOF重写操作的持续时间(如果有)
aof_last_bgrewrite_status: 上次AOF重写操作的状态
aof_last_write_status: 上一次AOF写入操作的状态
aof_last_cow_size: 上次AOF重写操作期间copy-on-write分配的字节大
aof_current_size: 当前的AOF文件大小
aof_base_size: 上次启动或重写时的AOF文件大小
aof_pending_rewrite: 指示AOF重写操作是否会在当前RDB保存操作完成后立即执行的标志。
aof_buffer_length: AOF缓冲区大小
aof_rewrite_buffer_length: AOF重写缓冲区大小
aof_pending_bio_fsync: 在后台IO队列中等待fsync处理的任务数
aof_delayed_fsync: 延迟fsync计数器

正在加载的操作

loading_start_time: 加载操作的开始时间(基于纪元的时间戳)
loading_total_bytes: 文件总大小
loading_loaded_bytes: 已经加载的字节数
loading_loaded_perc: 已经加载的百分比
loading_eta_seconds: 预计加载完成所需的剩余秒数

stats相关

total_connections_received: 服务器接受的连接总数
total_commands_processed: 服务器处理的命令总数
instantaneous_ops_per_sec: 每秒处理的命令数
rejected_connections: 由于maxclients限制而拒绝的连接数
expired_keys: key到期事件的总数
evicted_keys: 由于maxmemory限制而导致被驱逐的key的数量
keyspace_hits: 在主字典中成功查找到key的次数
keyspace_misses: 在主字典中查找key失败的次数
pubsub_channels: 拥有客户端订阅的全局pub/sub通道数
pubsub_patterns: 拥有客户端订阅的全局pub/sub模式数
latest_fork_usec: 最新fork操作的持续时间,以微秒为单位

replication相关

role: 如果实例不是任何节点的从节点,则值是”master”,如果实例从某个节点同步数据,则是”slave”。 请注意,一个从节点可以是另一个从节点的主节点(菊花链)。
如果实例是从节点,则会提供以下这些额外字段:master_host: 主节点的Host名称或IP地址
master_port: 主节点监听的TCP端口
master_link_status: 连接状态(up或者down)
master_last_io_seconds_ago: 自上次与主节点交互以来,经过的秒数
master_sync_in_progress: 指示主节点正在与从节点同步
如果SYNC操作正在进行,则会提供以下这些字段:master_sync_left_bytes: 同步完成前剩余的字节数
master_sync_last_io_seconds_ago: 在SYNC操作期间自上次传输IO以来的秒数
如果主从节点之间的连接断开了,则会提供一个额外的字段:master_link_down_since_seconds: 自连接断开以来,经过的秒数
以下字段将始终提供:connected_slaves: 已连接的从节点数
对每个从节点,将会添加以下行:slaveXXX: id,地址,端口号,状态

CPU相关

used_cpu_sys: 由Redis服务器消耗的系统CPU
used_cpu_user: 由Redis服务器消耗的用户CPU
used_cpu_sys_children: 由后台进程消耗的系统CPU
used_cpu_user_children: 由后台进程消耗的用户CPU

3.zabbix参考配置

cat >/etc/zabbix/zabbix_agentd.d/redis.conf <<'EOF'
UserParameter=redis_info[*],redis-cli info|grep -w "$1"|sed -r 's#^.*:##g'
EOF

二、Redis常用运维工具

1.使用第三方工具迁移-只适合4.x之前的版本

需求背景

刚切换到redis集群的时候肯定会面临数据导入的问题,所以这里推荐使用redis-migrate-tool工具来导入单节点数据到集群里

官方地址:

http://www.oschina.net/p/redis-migrate-tool

安装工具

yum install libtool autoconf automake -y
cd /opt/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install

创建配置文件

cat >redis_6379_to_6380.conf <<EOF
[source]
type: single
servers:
- 10.0.0.51:6379
[target]
type: redis cluster
servers:
- 10.0.0.51:6380
[common]
listen: 0.0.0.0:8888
source_safe: true
EOF

生成测试数据

cat >input_key.sh <<EOF
#!/bin/bash
for i in $(seq 1 1000)
doredis-cli -c -h db01 -p 6379 set k_${i} v_${i} && echo "set k_${i} is ok"
done
EOF

执行导入命令

redis-migrate-tool -c redis_6379_to_6380.conf

数据校验

redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check

2.使用redis-cli数据迁移-适合4.x以后的版本

4.x以前的数据迁移使用第三方工具

https://github.com/vipshop/redis-migrate-tool

不加copy参数相当于mv,老数据迁移完成后就删掉了

redis-cli --cluster import 10.0.0.51:6380 --cluster-from 10.0.0.51:6379

加了copy参数相当于cp,老数据迁移完成后会保留

redis-cli --cluster import 10.0.0.51:6380 --cluster-from 10.0.0.51:6379 --cluster-copy

添加replace参数会覆盖掉同名的数据,如果不添加遇到同名的key会提示冲突,对新集群新增加的数据不受影响

redis-cli --cluster import 10.0.0.51:6380 --cluster-from 10.0.0.51:6379 --cluster-copy --cluster-replace

验证迁移期间边写边导会不会影响: 同时开2个终端,一个写入key,

for i in {1..1000};do redis-cli set k_${i} v_${i};sleep 0.2;echo ${i};done

一个执行导入命令

redis-cli --cluster import 10.0.0.51:6380 --cluster-copy --cluster-replace --cluster-from  10.0.0.51:6379

得出结论:

只会导入当你执行导入命令那一刻时,当前被导入节点的所有数据,类似于快照,对于后面再写入的数据不会更新

3.分析key大小

使用redis-cli分析

redis-cli --bigkeys
redis-cli --memkeys

使用第三方分析工具:

安装命令

yum install python-pip gcc python-devel -y
cd /opt/
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
pip install python-lzf
python setup.py install

生成测试数据

redis-cli set txt $(cat txt.txt)

生成rdb文件

redis-cli bgsave

使用工具解析RDB文件

cd /data/redis_6379/
rdb -c memory redis_6379.rdb -f redis_6379.rdb.csv

过滤分析

awk -F"," '{print $4,$3}' redis_6379.rdb.csv |sort -r

汇报领导

将结果整理汇报给领导,询问开发这个key是否可以删除
删除之前,最好做次备份

4.性能测试

redis-benchmark -n 10000 -q

5.多实例运维脚本

cat > redis_shell.sh << 'EOF'
#!/bin/bashUSAG(){echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}
if [ "$#" = 1 ]
thenREDIS_PORT='6379'
elif [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
thenREDIS_PORT="$2"
elseUSAGexit 0
fiREDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.logCMD_START(){redis-server ${PATH_CONF}
}CMD_SHUTDOWN(){redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}CMD_LOGIN(){redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}CMD_PS(){ps -ef|grep redis
}CMD_TAIL(){tail -f ${PATH_LOG}
}case $1 instart)CMD_STARTCMD_PS;;stop)CMD_SHUTDOWNCMD_PS;;restart)CMD_STARTCMD_SHUTDOWNCMD_PS;;login)CMD_LOGIN;;ps)CMD_PS;;tail)CMD_TAIL;;*)USAG
esac
EOF

三、Redis内存管理

1.生产上一定要配置Redis内存限制

maxmemory NG

2.内存回收机制

1.noevicition       默认策略,不会删除任务数据,拒绝所有写入操作并返回客户端错误信息,此时只响应读操作
2.volatile-lru      根据LRU算法删除设置了超时属性的key,指导腾出足够空间为止,如果没有可删除的key,则退回到noevicition策略
3.allkeys-lru       根据LRU算法删除key,不管数据有没有设置超时属性
4.allkeys-random    随机删除所有key
5.volatile-random   随机删除过期key
5.volatile-ttl      根据key的ttl,删除最近要过期的key

3.生产上redis限制多大内存

先空出来系统一半内存
48G 一共
24G 系统
24G redis
redis先给8G内存 满了之后,分析结果告诉老大和开发,让他们排查一下是否所有的key都是必须的
redis再给到12G内存 满了之后,分析结果告诉老大和开发,让他们排查一下是否所有的key都是必须的
redis再给到16G内存 满了之后,分析结果告诉老大和开发,让他们排查一下是否所有的key都是必须的
等到24G都用完了之后,汇报领导,要考虑买内存了。
等到35G的时候,就要考虑是加内存,还是扩容机器。

4.优化建议

1.专机专用,不要跑其他的服务
2.内存给够,限制内存使用大小
3.使用SSD硬盘
4.网络带宽够大
5.定期分析BigKey

四、实战-槽位分配错误如何调整

1. 假如是在集群初始化状态下分配错了

解决难度: *
解决方法: 重新初始化

redis-cli -h 10.0.0.51 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.51 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6381 CLUSTER RESETredis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS {10922..16383}redis-cli -h 10.0.0.52 -p 6381 CLUSTER NODES
redis-cli -h 10.0.0.52 -p 6381 CLUSTER INFO

Redis 运维 三相关推荐

  1. redis 运维讲解01

    运维不需要往里面存数据,但是需要搭建.备份.扩容.收缩都是运维的工作,保证 redis 不能宕机.备份数据.协助开发查询数据 一.为什么需要redis 1.传统架构 ​app  →  DAL(DAL( ...

  2. Redis运维优化的陷阱及避坑指南

    Linux 配置优化 我们在使用 Redis 过程中,可能更多的关注 Redis 本身的一些配置优化,如 AOF.RDB 配置.数据结构配置优化等.但是很少关心 Redis 的载体,服务器的优化.而这 ...

  3. Redis运维实战之客户端连接

    背景:最近生产环境中出现了一次Redis客户端连接数被打爆的事故,打算简单记录一下Redis客户端连接数高的排查思路,并深度学习一下Redis客户端方面的知识. 1.Redis客户端建立连接的过程 R ...

  4. redis desktop manager 集群_Redis Manager(2.0) —— Redis 运维利器

    Redis 作为一个基于内存的可持久化的日志型.Key-Value 数据库,以其出色的性能表现以及高可用性在许多公司有着举足轻重的地位.伴随着业务量的增长,Redis 集群的规模不可避免的需要扩大,此 ...

  5. 一份12W+字数的踩坑总结,覆盖前端、后端、运维三个维度,一步一个脚印,我们一起成长!(实时更新)

    文章目录 1.1 Css/Scss 1.1.1 层叠性 1.1.2 继承性 1.1.3 优先级 1.1.4 backgroud设置背景图片样式顺序决定是否生效 1.1.5 Vue在元素中要使用当前vu ...

  6. Redis 运维 二、

    一. 持久化 1.RDB持久化和AOF持久化 RDB: 类似于快照,当前内存里的数据的状态持久化到硬盘 优点:压缩格式/恢复速度快 缺点:不是实时的,可能会丢数据,操作比较重量AOF:类似于mysql ...

  7. redis 运维常用命令

    2019独角兽企业重金招聘Python工程师标准>>> CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相 ...

  8. 2018-06-13(日常运维三)

    10.19 iptables规则备份和恢复 service iptables save 将规则保存到默认配置文件/etc/sysconfig/iptables iptables如果不使用service ...

  9. 【linux】【jenkins】自动化运维三 整合gitlab、docker发布vue项目

    由于工作需要,这里我先创建一个vue的工程. 1.首先安装好gitlab相关插件:GitLab.GitLab Hook.NodeJS 插件安装参考:https://www.cnblogs.com/jx ...

最新文章

  1. hid自定义report 影响键盘_【iOS12人机交互指南】10.1-自定义键盘
  2. 来自闪闪宝石的光芒 - “宝石迷阵” x 信息检索 | 论文访谈间 #20
  3. Web前端开发薪资待遇及发展前景解读
  4. 目标检测的图像特征提取之(一)Hog特征提取
  5. 信息学奥赛一本通 提高篇 第6章 平衡树Treap
  6. 机器视觉开源代码集合(转载)
  7. Extjs下拉多选框
  8. (4)回归决策树_预测波士顿房价
  9. 比特币 以太坊 真的是去中心化的吗?
  10. NYOJ题目37-回文字符串
  11. 计算机专业就业发展现状,计算机专业就业形势分析
  12. an error occurred while attempting to contact the server_cheney
  13. MapGuide 添加临时点图层
  14. 分峰截幅c语言算法,光纤布拉格光栅传感解调中的寻峰算法.docx
  15. i5-12400和i5-12400F有什么区别 i512400和12400f哪个好
  16. Duang~Shark 闪跌 99%! Fork 了 Bunny 的代码还 Fork 了它的攻击
  17. GIF’ted 1.3 GIF动画制作工具
  18. 基于正点原子STM32F1精英版秒表(库函数版)
  19. c语言1000内所有素数组成的集合,【汇编程序】实现输出1000以内所有素数
  20. 控制步进电机正反转的实际应用程序

热门文章

  1. 02 FreeRTOS 任务的延续
  2. JAVA之JTextFiled设置高度大小
  3. 2022年PMP考试地点一般会在哪里?
  4. Python金融量化
  5. 西门子808 802 828 PLC密码获取
  6. 【HTML+CSS】网站TDK三大标签SEO优化
  7. 尚硅谷MySQL笔记
  8. 010-跨平台开发-MUI-单选框及取值(radio)
  9. 【网络安全】LemonDuck木马进化,危害性增强
  10. 媒资管理系统服务器配置,媒资管理系统