Prometheus+Grafana构建云原生分布式监控系统(四)

Prometheus+Grafana构建云原生分布式监控系统(三)https://blog.csdn.net/xiaochenXIHUA/article/details/157127991

一、Prometheus监控Redis数据库

1.1、安装部署Redis数据库

Linux中下载安装部署Redis7.4.5------并设置用户名、密码及其授权的保姆级教程https://blog.csdn.net/xiaochenXIHUA/article/details/151261564

1.2、监控Redis需关注的几个重要指标

|--------|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 监控Redis的重要指标 | 说明 |
| 1 | 延迟 | 延迟数据对使用Redis的应用程序至关重要,因此要重点监控。 bash #Redis官方提供的延迟测试命令 #(实时检测客户端redis-cli与指定redis服务器之间的网络/响应延迟) #会持续向redis发送Ping命令,统计每次请求的往返耗时(单位是:毫秒) #方式一:若有密码则会提示输入密码后测试(可避免命令行明文暴漏密码) redis-cli --latency -h 192.168.1.37 -p 6379 --user ck #方式二:使用配置文件方式连接(完全避免命令行暴漏用户名与密码【最安全】) #1-创建 Redis 客户端配置文件 vim ~/.rediscli.cnf #2-写入以下内容(适配 Redis 6.0+ 用户名密码) username ck password Qzsd43561 host 192.168.1.37 port 6379 #3-设置文件权限(仅当前用户可读写,关键) chmod 600 ~/.rediscli.cnf #4-执行延迟测试(自动读取配置,无警告) redis-cli --latency -c ~/.rediscli.cnf #方法三:通过URI完整连接快速测试(存在redis用户密码暴露风险,不建议使用) redis-cli --latency -u redis://ck:Qzsd43561@192.168.1.37:6379 bash #定位redis慢查询 #1-查看到Redis当前配置的慢查询配置命令【单位是(微秒)默认为10000微秒=10毫秒】 grep slower /etc/redis.conf #2-使用【redis-cli】登录到redis中设置慢查询的参数 redis-cli -h 192.168.1.37 -p 6379 --user ck #2.1-设置redis的慢查询阈值为5毫秒 config set slowlog-log-slower-than 5000 config get slowlog-log-slower-than config rewrite #2.2-在登录的redis中查询最新的15条慢查询的详细内容 slowlog get 15 #最后退出登录 quit |
| 2 | 流量 | Redis每秒处理多少请求,每秒接收多少字节、返回多少字节,在Redis里面都内置了相关指标,通过redis-cli连接上Redis,执行【info all】命令可以看到很多指标。 bash #使用redis-cli登录到Redis redis-cli -h 192.168.1.37 -p 6379 --user ck info all #1-使用redis-cli登录到Redis查看到【info all】命令包含的所有【瞬时指标】 redis-cli -h 192.168.1.37 -p 6379 --user ck info all | grep instantaneous #2-查看redis中【缓存的命中与非命中数量】 #注意:若这里查询到的命中率低于0.8则需要关注了 redis-cli -h 192.168.1.37 -p 6379 --user ck info all | grep keyspace |
| 3 | 错误 | 客户端操作Redis返回了错误比较常见,要关注;另外需要关注客户端的最大连接数量。 bash #查看redis允许连接的最大客户端数量和拒绝连接的数量 redis-cli -h 192.168.1.37 -p 6379 --user ck info all | grep maxclients redis-cli -h 192.168.1.37 -p 6379 --user ck info all | grep rejected_connections |
| 4 | 饱和度 | Redis重度使用内存,内存的使用率、碎片率,以及因为内存不够用而需要清理的Key数量,都是需要重点关注的。可以通过【info memory】命令查看这几个关键指标。 bash #使用【redis-cli】登录到redis中查看所有的内存信息 redis-cli -h 192.168.1.37 -p 6379 --user ck info memory #临时设置【开启自动内存碎片整理(总开关)】(redis重启后失效) redis-cli -h 192.168.1.37 -p 6379 --user ck config get activedefrag config set activedefrag yes config get activedefrag #永久设置内存相关配置(即:编辑redis的配置文件/etc/redis.conf) #如下的内存配置按需调整优化 vi /etc/redis.conf # 开启自动内存碎片整理(总开关) activedefrag yes # 当碎片达到 100mb 时,开启内存碎片整理 active-defrag-ignore-bytes 100mb # 当碎片超过 10% 时,开启内存碎片整理 active-defrag-threshold-lower 10 # 内存碎片超过 100%,则尽最大努力整理 active-defrag-threshold-upper 100 # 内存自动整理占用资源最小百分比 active-defrag-cycle-min 25 # 内存自动整理占用资源最大百分比 active-defrag-cycle-max 75 #最后保存配置文件后,重启 Redis 服务使配置生效 systemctl restart redis.service |
[监控Redis需关注的几个重要指标]

1.3、安装部署redis_exporter

bash 复制代码
#在安装了redis的服务器上安装redis_exporter

#1-下载redis_exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v1.80.1/redis_exporter-v1.80.1.linux-amd64.tar.gz -c -P /data

#2-解压redis_exporter
cd /data
tar -zxvf redis_exporter-v1.80.1.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv redis_exporter-v1.80.1.linux-amd64 redis_exporter-v1.80.1
cd redis_exporter-v1.80.1/
ls

#3-编写redis_exporter的服务
#3.1-创建环境变量文件
vim /etc/redis_exporter.env
#【/etc/redis_exporter.env】文件完整内容如下:
REDIS_USERNAME=ck
REDIS_PASSWORD=Qzsd43561

#3.2-设置文件权限(仅 root 可读写)
chmod 600 /etc/redis_exporter.env
chown redis:redis /etc/redis_exporter.env

#3.3-编写redis_exporter的服务文件
vim /usr/lib/systemd/system/redis_exporter.service
#【/usr/lib/systemd/system/redis_exporter.service】文件的完整内容
[Unit]
Description=redis_exporter for prometheus
Documentation=https://github.com/oliver006/redis_exporter
After=network.target

[Service]
Type=simple
#指定运行用户(建议用非 root 用户,如 redis 或 prometheus)
User=redis
Group=redis
#禁止服务进程被交换到虚拟内存
NoNewPrivileges=true
#添加环境变量
EnvironmentFile=/etc/redis_exporter.env
#启动参数:指定 Redis 地址、用户名、密码
ExecStart=/usr/local/redis_exporter-v1.80.1/redis_exporter \
  --redis.addr=192.168.1.37:6379 \
  --redis.user=${REDIS_USERNAME} \
  --redis.password=${REDIS_PASSWORD} \
  --web.listen-address=0.0.0.0:9121 \
  --log-level=info
#进程崩溃后的重启策略
Restart=on-failure
RestartSec=2s

[Install]
WantedBy=multi-user.target


#4-启动redis_exporter服务并设置开机自启
systemctl daemon-reload
systemctl start redis_exporter
systemctl status redis_exporter
ps -ef | grep redis_exporter
netstat -antlp | grep redis_exporte
systemctl enable redis_exporter.service


#5-打开浏览器访问【IP:9121】即可查看到redis_exporter收集到的redis状态数据。
ip a

|--------|---------------------------|--------------------------------|
| 序号 | redis_exporter启动参数 | 说明 |
| 1 | --redis.addr | 指定redis服务的ip地址和端口号 |
| 2 | --redis.user | 指定登录redis服务的用户名称(有才需要配置,没有则不用) |
| 3 | --redis.password | 指定登录redis服务的密码(有才需要配置,没有则不用) |
| 4 | --redis.password-file | 指定登录redis服务的密码文件(有才需要配置,没有则不用) |
| 5 | --web.listen-address | 指定当前redis-exporter启动使用的端口信息 |
[redis_exporter的启动参数解析]

bash 复制代码
#3-编写redis_exporter的服务【避免redis密码暴露版本】【生产环境推荐使用】
#3.1-创建redis密码的json文件
vi /etc/redis_exporter.json
#【/etc/redis_exporter.json】文件的完整内容如下:
{
  "192.168.1.37:6379": "Qzsd43561"
}


#3.2-设置文件权限(仅 root 可读写)
chmod 600 /etc/redis_exporter.json
chown redis:redis /etc/redis_exporter.json

#3.3-编写redis_exporter的服务文件
vim /usr/lib/systemd/system/redis_exporter.service
#【/usr/lib/systemd/system/redis_exporter.service】文件的完整内容
[Unit]
Description=redis_exporter for prometheus
Documentation=https://github.com/oliver006/redis_exporter
After=network.target

[Service]
Type=simple
#指定运行用户(建议用非 root 用户,如 redis 或 prometheus)
User=redis
Group=redis
#禁止服务进程被交换到虚拟内存
NoNewPrivileges=true
#添加环境变量
EnvironmentFile=/etc/redis_exporter.env
#启动参数:指定 Redis 地址、用户名、密码
ExecStart=/usr/local/redis_exporter-v1.80.1/redis_exporter \
  --redis.addr=192.168.1.37:6379 \
  --redis.user=ck \
  --redis.password-file=/etc/redis_exporter.json \
  --web.listen-address=0.0.0.0:9121 \
  --log-level=info
#进程崩溃后的重启策略
Restart=on-failure
RestartSec=6s

[Install]
WantedBy=multi-user.target


#4-启动redis_exporter服务并设置开机自启
systemctl daemon-reload
systemctl start redis_exporter
systemctl status redis_exporter
ps -ef | grep redis_exporter
netstat -antlp | grep redis_exporter
systemctl enable redis_exporter.service

1.4、在Prometheus上添加redis_exporter节点

bash 复制代码
#在prometheus上添加redis_exporter节点

#1-进入prometheus server的目录下编辑【prometheus.yml】配置文件
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】配置文件最后【scrape_configs下】可以新增名为【- job_name "dbserver"】的节点且在该节点下【 static_configs-->- targets】里面添加上redis_exporter所在服务器的【IP:1921】(如:192.168.1.37:9121)
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100']
       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
        labels:
          app: "prometheus"

  - job_name: "dbserver"
    static_configs:
      - targets: ['192.168.1.36:9104','192.168.1.36:9100','192.168.1.37:9121']
        labels:
          app: "db-exporter"


#2-验证编辑后的【prometheus.yml】配置文件语法是否正确(若结果显示SUCCESS则表示正确可用,否则需要根据提示错误修改)
./promtool check config prometheus.yml

#3-验证编辑后的【prometheus.yml】配置文件无误后重载配置生效(热重载)
curl -XPOST localhost:9090/-/reload

#4-最后在浏览器访问prometheus的web界面查看【status-->Target health】即可看到这个redis_exporter的节点内容,且状态显示UP在线

二、Grafana中配置prometheus的redis_exporter数据可视化

(若已经添加过数据源了则不用重复这个操作)登录到Grafana中(IP:3000)选择【连接】-->【添加新连接】-->【搜索Prometheus】后点击Prometheus-->点击右上角的【添加新数据源】则进入设置界面,在设置界面可以填写名称、与prometheus server的URL地址后点击最底部的【保存并测试】。

然后配置仪表盘(到【Grafana dashboards | Grafana Labs】官网获取更多的仪表盘模板。在Grafana的仪表盘界面中间输入框输入redis即可列出所有redis相关模板(如:我们选择【Redis Dashboard for Prometheus Redis Exporter 1.x】模板进入后,获取到该模板的编号是【763】)然后在浏览器上进入我们服务器上部署好的Grafana界面的【仪表盘】-->【新建】-->【导入】界面输入模板的编号或者JSON文件内容后点击【加载】后弹出的界面上可以修改模板名称、数据源为prometheus后点击【Import】)如下图所示:

三、redis中各个监控指标的含义

bash 复制代码
#redis监控指标的含义(以下的这些指标都是【light weight(轻量级 lw)】
#表示采集、获取这些指标几乎不消耗 Redis 性能,无需担心采集开销。)
redis_active_defrag_running:活动碎片整理是否运行

redis_allocator_active_bytes:分配器活动字节
redis_active_allocated_bytes:活动分配的字节
redis_assocator_frag_bytes:关联碎片字节
redis_allocator_frag_ratio:分配器碎片比率
redis_allocator_resident_bytes:分配器常驻字节
redis_allocator_rss_bytes:分配器RSS字节
redis_allocator_rss_ratio:分配器RSS比率


redis_aof_current_rewrite_duration_sec:aof当前重写持续时间sec
redis_aof_enabled:是否启用aof
redis_aof_last_bgrewrite_status:最近一次AOF重写操作是否执行成功
redis_aof_last_cow_size_bytes:在执行AOF重写期间,分配给COW的大小
redis_aof_last_rewrite_duration_sec:最近一次AOF重写操作消耗的时间
redis_aof_last_write_status:aof上次写入状态
redis_aof_rewrite_in_progress:是否在进行AOF的重写操作
redis_aof_rewrite_scheduled:是否有AOF操作等待执行

redis_blocked_clients:被阻止的客户

redis_client_recent_max_input_buffer_bytes:客户端最近最大输入缓冲区字节
redis_client_recent_max_output_buffer_bytes:客户端最近最大输出缓冲区字节
redis_cluster_enabled:是否启用集群

redis_commands_duration_seconds_total:命令持续时间总秒数
redis_commands_processed_total:命令处理总数
redis_commands_total:命令总数

redis_config_maxclients:配置最大客户端
redis_config_maxmemory:配置最大内存

redis_connected_clients:连接的客户
redis_connected_slave_lag_seconds:连接的从节点延迟秒
redis_connected_slave_offset_bytes:连接的从节点偏移字节
redis_connected_slaves:连接的从节点
redis_connections_received_total:收到的连接总数

redis_cpu_sys_children_seconds_total:由后台进程消耗的系统CPU
redis_cpu_sys_seconds_total:由Redis服务器消耗的用户CPU
redis_cpu_user_children_seconds_total:由后台进程消耗的用户CPU
redis_cpu_user_seconds_total:由Redis服务消耗的用户CPU

redis_db_avg_ttl_seconds:db平均ttl秒
redis_db_keys:数据库key的数量
redis_db_keys_expiring:即将过期的key

redis_defrag_hits:碎片整理命中
redis_defrag_key_hits:碎片整理命中key
redis_defrag_key_misses:碎片整理未命中key
redis_evicted_keys_total:被驱逐的key总数

redis_expired_keys_total:过期key总数
redis_expired_stale_percentage:过期陈旧key占百分比
redis_expired_time_cap_reached_total:已达到总时间上限

redis_exporter_build_infor:redis_exporter信息
redis_exporter_last_scrape_connect_time_seconds:redis_exporter最后一次采集时间
redis_exporter_last_scrape_duration_seconds:redis_exporter次抓取持续时间秒
redis_exporter_last_scrape_error:redis_exporter次抓取错误
redis_exporter_scrape_duration_seconds_count:redis_exporter采集续时间秒数
redis_exporter_scrape_duration_seconds_sum:redis_exporter持续时间秒总和
redis_exporter_scrapes_total:redis_exporter抓取总数

redis_instance_info:实例信息
redis_keyspace_hits_total:键空间命中总数
redis_keyspace_misses_total:键空间未命中总数

redis_last_key_groups_scrape_duration_milliseconds:最后一个键组抓取持续时间毫秒
redis_last_slow_execution_duration_seconds:最后一个慢执行持续时间秒
redis_latest_fork_seconds:最新fork时间
redis_lazyfree_pending_objects:惰性删除或延迟释放的对象
redis_loading_dump_file:加载转储文件

redis_master_last_io_seconds_ago:master最后io过去时间
redis_master_repl_offset:主节点累加偏移量(判断主从是否同步)
redis_master_sync_in_progress:正在进行主同步

redis_mem_clients_normal:
redis_mem_clients_slaves:
redis_mem_fragmentation_bytes:内存碎片字节
redis_mem_fragmentation_ratio:内存碎片率
redis_mem_not_counted_for_eviction_bytes:内存不计入驱逐的字节数
redis_memory_max_bytes:内存最大字节
redis_memory_used_lua_bytes:lua脚本使用内存字节数
redis_memory_used_overhead_bytes:维护数据集的内部机制所需的内存开销
redis_memory_used_peak_bytes:内存使用峰值
redis_memory_used_rss_bytes:rss占用内存的字节数
redis_memory_used_scripts_bytes:脚本占用内存的字节数
redis_memory_used_startup_bytes:启动占用内存的字节数
redis_migrate_cached_sockets_total:
redis_net_input_bytes_total:网络input总数
redis_net_output_bytes_total:网络output总数
reids_process_id:进程号
redis_pubsub_channels:发布订阅频道
redis_pubsub_patterns:发布订阅模式

redis_rdb_bgsave_in_progress:
redis_rdb_changes_since_last_save:自上次保存以来的rdb更改
redis_rdb_current_bgsave_duration_sec:rdb当前bgsave持续时间
redis_rdb_last_bgsave_duration_sec:rdb上次bgsave持续时间
redis_rdb_last_bgsave_status:rdb上次bgsave状态
redis_rdb_last_cow_size_bytes:rdb上次cow的大小
redis_rdb_last_save_timestamp_seconds:rdb最后保存时间戳

redis_rejected_connections_total:拒绝的连接总数
redis_repl_backlog_first_byte_offset:复制起始偏移量
redis_repl_backlog_history_bytes:repl_backlog历史数据大小
redis_repl_backlog_is_active:repl_backlog是否开启
redis_replica_partial_resync_accepted:
redis_replica_partial_resync_denied:
redis_replica_resyncs_full:
redis_replication_backlog_bytes:
redis_second_repl_offset:
redis_slave_expires_tracked_keys:
redis_slave_info:从节点信息
redis_slave_priority:从节点优先级
redis_slave_repl_offset:从节点累加偏移量(判断主从是否同步)
redis_slowlog_last_id:慢查询日志最后一个的id
redis_slowlog_length:慢查询日志长度
redis_start_time_seconds:开始时间秒
redis_target_scrape_request_errors_total:
redis_up:运行时间
redis_uptime_in_seconds:正常运行时间
相关推荐
牛奶咖啡132 小时前
Prometheus+Grafana构建云原生分布式监控系统(五)
云原生·grafana·prometheus·监控nginx·两种监控nginx方法·nginx源码编译参数解析·编译nginx源码实操
Leo July2 小时前
Kubernetes全解析:从容器编排到云原生实战
云原生·容器·kubernetes
峰顶听歌的鲸鱼11 小时前
Kubernetes介绍和部署
运维·笔记·云原生·容器·kubernetes·学习方法
一条闲鱼_mytube16 小时前
Istio 服务网格完全指南:从原理到实战
云原生·istio
汪碧康17 小时前
一文掌握k8s的升级更新策略
云原生·容器·kubernetes·k8s·亲和性·xkube
澄澈青空~18 小时前
畜牧业养牛技术与商家微服务解决方案
微服务·云原生·架构
a努力。19 小时前
虾皮Java面试被问:分布式Top K问题的解决方案
java·后端·云原生·面试·rpc·架构
AC赳赳老秦19 小时前
Prometheus + DeepSeek:自动生成巡检脚本与告警规则配置实战
前端·javascript·爬虫·搜索引擎·prometheus·easyui·deepseek