使用 Redis Exporter 监控 Redis

67次阅读
没有评论

共计 4914 个字符,预计需要花费 13 分钟才能阅读完成。

背景

在之前的文章:使用 MySQL Exporter 监控MySQL 中介绍了使用 MySQL Exporter 监控多个数据库实例。

MySQL 有 Role 用于配置单独的低权限监控只读用户,在每个实例中创建的监控用户密码都是相同的。

而 Redis 则不具备 Role,往往不同的 redis 有且仅有一个密码,且不一致。

下面会介绍如何使用 使用 Redis Exporter 监控多组不同密码的 redis 实例。

环境

此次为全新部署,从0开始测试,不操作生产环境。

software IP port
Redis 5.0.14 192.168.2.11 6379
Redis 7.4.1 192.168.2.11 6380
redis_exporter 0.16.0 192.168.2.10 9104
Prometheus 192.168.2.10 9090

实践

部署 redis

使用最简单的 docker 部署方式,部署2个 Redis 单实例,版本分别为 5.0.14 & 7.4.1

# 创建持久化数据目录
mkdir /usr/local/redis-test/5.0.14/data -p
mkdir /usr/local/redis-test/7.4.1/data -p

# 创建启动脚本
# vim /usr/local/redis-test/run-redis-5.sh
#!/bin/bash

# 配置参数
REDIS_PORT=6379                      # Redis端口
REDIS_PASSWORD="testpasswd123"       # Redis密码
REDIS_VERSION="5.0.14"               # Redis版本
REDIS_DATA_DIR="/usr/local/redis-test/5.0.14/data"         # 数据目录
REDIS_CONTAINER_NAME="redis-5"         # 容器名称
REDIS_MEMORY="2gb"                   # 最大内存限制
REDIS_BIND="0.0.0.0"                # Redis绑定地址

# 创建必要的目录
mkdir -p ${REDIS_DATA_DIR}

# 检查是否已存在同名容器
if [ "$(docker ps -aq -f name=${REDIS_CONTAINER_NAME})" ]; then
    echo "发现同名容器,正在删除..."
    docker rm -f ${REDIS_CONTAINER_NAME}
fi

# 启动Redis容器
docker run -d \
  --name ${REDIS_CONTAINER_NAME} \
  -p ${REDIS_PORT}:6379 \
  -v ${REDIS_DATA_DIR}:/data \
  --restart unless-stopped \
  --memory=${REDIS_MEMORY} \
  redis:${REDIS_VERSION} \
  redis-server \
    --appendonly yes \
    --requirepass ${REDIS_PASSWORD} \
    --maxmemory ${REDIS_MEMORY} \
    --maxmemory-policy allkeys-lru \
    --save 900 1 \
    --save 300 10 \
    --save 60 10000 \
    --bind ${REDIS_BIND} \
    --protected-mode yes

# 检查容器是否成功启动
if [ "$(docker ps -q -f name=${REDIS_CONTAINER_NAME})" ]; then
    echo "Redis容器启动成功!"
    echo "容器名称: ${REDIS_CONTAINER_NAME}"
    echo "访问地址: localhost:${REDIS_PORT}"
    echo "数据目录: ${REDIS_DATA_DIR}"
    echo ""
    echo "本地连接命令:"
    echo "docker exec -it ${REDIS_CONTAINER_NAME} redis-cli -a ${REDIS_PASSWORD}"
    echo ""
    echo "远程连接命令:"
    echo "redis-cli -h <服务器IP> -p ${REDIS_PORT} -a ${REDIS_PASSWORD}"
else
    echo "Redis容器启动失败,请检查日志:"
    docker logs ${REDIS_CONTAINER_NAME}
fi

# 显示容器运行状态
echo -e "\n容器运行状态:"
docker ps | grep ${REDIS_CONTAINER_NAME}

# vim /usr/local/redis-test/run-redis-7.sh
#!/bin/bash

# 配置参数
REDIS_PORT=6380                      # Redis端口
REDIS_PASSWORD="testpasswd456"       # Redis密码
REDIS_VERSION="7.4.1"               # Redis版本
REDIS_DATA_DIR="/usr/local/redis-test/7.4.1/data"         # 数据目录
REDIS_CONTAINER_NAME="redis-7"         # 容器名称
REDIS_MEMORY="2gb"                   # 最大内存限制
REDIS_BIND="0.0.0.0"                # Redis绑定地址

# 创建必要的目录
mkdir -p ${REDIS_DATA_DIR}

# 检查是否已存在同名容器
if [ "$(docker ps -aq -f name=${REDIS_CONTAINER_NAME})" ]; then
    echo "发现同名容器,正在删除..."
    docker rm -f ${REDIS_CONTAINER_NAME}
fi

# 启动Redis容器
docker run -d \
  --name ${REDIS_CONTAINER_NAME} \
  -p ${REDIS_PORT}:6379 \
  -v ${REDIS_DATA_DIR}:/data \
  --restart unless-stopped \
  --memory=${REDIS_MEMORY} \
  redis:${REDIS_VERSION} \
  redis-server \
    --appendonly yes \
    --requirepass ${REDIS_PASSWORD} \
    --maxmemory ${REDIS_MEMORY} \
    --maxmemory-policy allkeys-lru \
    --save 900 1 \
    --save 300 10 \
    --save 60 10000 \
    --bind ${REDIS_BIND} \
    --protected-mode yes

# 检查容器是否成功启动
if [ "$(docker ps -q -f name=${REDIS_CONTAINER_NAME})" ]; then
    echo "Redis容器启动成功!"
    echo "容器名称: ${REDIS_CONTAINER_NAME}"
    echo "访问地址: localhost:${REDIS_PORT}"
    echo "数据目录: ${REDIS_DATA_DIR}"
    echo ""
    echo "本地连接命令:"
    echo "docker exec -it ${REDIS_CONTAINER_NAME} redis-cli -a ${REDIS_PASSWORD}"
    echo ""
    echo "远程连接命令:"
    echo "redis-cli -h <服务器IP> -p ${REDIS_PORT} -a ${REDIS_PASSWORD}"
else
    echo "Redis容器启动失败,请检查日志:"
    docker logs ${REDIS_CONTAINER_NAME}
fi

# 显示容器运行状态
echo -e "\n容器运行状态:"
docker ps | grep ${REDIS_CONTAINER_NAME}

# 启动 redis 容器
bash /usr/local/redis-test/run-redis-5.sh
bash /usr/local/redis-test/run-redis-7.sh

# 测试登录
redis-cli -h 192.168.2.11 -p 6379 -a testpasswd123
redis-cli -h 192.168.2.11 -p 6380 -a testpasswd456

redis exporter配置

GitHub 下载对应版本:

cd /tmp
wget https://github.com/oliver006/redis_exporter/releases/download/v1.67.0/redis_exporter-v1.67.0.linux-amd64.tar.gz
tar xf redis_exporter-v1.67.0.linux-amd64.tar.gz
cd redis_exporter-v1.67.0.linux-amd64/
mv redis_exporter /usr/local/bin/

# 创建密码配置文件
# vim /var/lib/redis-passwd.json
{
  "redis://192.168.2.11:6379":"testpasswd123",
  "redis://192.168.2.11:6380":"testpasswd456"
}

# 使用 systemd 管理 redis_exporter
# 配置单元文件
# vim /etc/systemd/system/redis_exporter.service
[Unit]
Description=Prometheus Redis Exporter
After=network.target

[Service]
Type=simple
User=root
Group=root
Nice=-5
ExecStart=/usr/local/bin/redis_exporter \
    --redis.password-file=/var/lib/redis-passwd.json \
    --web.listen-address=0.0.0.0:9121 \
    --redis-only-metrics

SyslogIdentifier=redis_exporter
Restart=always

# 启动和开机自启
systemctl start redis_exporter.service
systemctl enable redis_exporter.service
systemctl status redis_exporter.service

Prometheus 配置

一般情况下,job 中建议使用 file_sd_configs 而不是 static_configs 维护多实例的 target,这样可以使得配置文件结构更清晰,且便于管理。

# 添加 job
# vim /etc/prometheus/prometheus.yml
- job_name: 'redis_exporter'
  file_sd_configs:
    - files:
      - '/etc/victoria-metrics/file_sd/redis.yml'
  metrics_path: /scrape
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - source_labels: ['__address__']
      regex: 'redis://(.+):(\d+)'
      replacement: '${1}'
      target_label: 'host_ip'
    - target_label: __address__
      replacement: 127.0.0.1:9121

# 维护对应的子配置文件以实现自动发现
# vim /etc/prometheus/file_sd/redis.yml
- labels:
    instance_name: "test-redis-5.0.14"
  targets:
  - 192.168.2.11:6379

- labels:
    instance_name: "test-redis-7.4.1"
  targets:
  - 192.168.2.11:6380

# 重载 Prometheus
systemctl reload prometheus.service

查看 Prometheus web端的 target 抓取情况:

使用 Redis Exporter 监控 Redis

Grafana 展示

使用 Redis Exporter 监控 Redis

本文属于专题:Prometheus Exporter

引用链接

正文完
 
pengyinwei
版权声明:本站原创文章,由 pengyinwei 2024-12-31发表,共计4914字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.opshub.cn
评论(没有评论)