prometheus实战练习mysql和redis

prometheus监控mysql数据库

五、prometheus监控mysql数据库

1、部署数据库 172.16.213.27

这里使用目前MySQL8.0.32版本,采用MySQL官方发布的二进制版本进行安装,下载后的二进制版本名称大致为mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz,下面是在mysqldb主机(almalinux9.1)上安装MySQL的过程:

[root@mysqldb ~]# xz -d mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
[root@mysqldb ~]# tar xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar  -C /usr/local
[root@mysqldb ~]# cd /usr/local/
[root@mysqldb ~]# mv mysql-8.0.32-linux-glibc2.12-x86_64 mysql
[root@mysqldb ~]# cd mysql
[root@mysqldb mysql]# useradd mysql
[root@mysqldb mysql]# mkdir etc logs data
[root@mysqldb mysql]# more /usr/local/mysql/etc/my.cnf 
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
[root@mysqldb mysql]# chown -R mysql:mysql   /usr/local/mysql
[root@mysqldb mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
[root@mysqldb mysql]# /usr/local/mysql/support-files/mysql.server start

当在命令行登录mysql的时候,由于二进制版本发布环境的不同,在almalinux9/rhel9环境下,可能会出现依赖库文件问题,下面是错误信息:

[root@mysqldb mysql]# /usr/local/mysql/bin/mysql -uroot -p
bin/mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory

这就是二进制文件编译环境不同导致的,解决方法如下:

[root@mysqldb mysql]# ll /usr/lib64/libtinfo.so.6
lrwxrwxrwx. 1 root root 15  2月 10  2022 /usr/lib64/libtinfo.so.6 -> libtinfo.so.6.2
[root@mysqldb mysql]# ln -s /usr/lib64/libtinfo.so.6.2  /usr/lib64/libtinfo.so.5
[root@mysqldb mysql]# ll /usr/lib64/libtinfo.so.5
lrwxrwxrwx 1 root root 26  3月 14 15:02 /usr/lib64/libtinfo.so.5 -> /usr/lib64/libtinfo.so.6.2

做完软连接之后,就可以顺利登陆mysql命令行了。

Mysql启动成功后,需要重置root密码,临时密码在上面定义的mysql日志文件/usr/local/mysql/logs/mysqld.log中可以查到。登录mysql命令行,并重置密码,执行如下SQL命令:

[root@mysqldb mysql]#  /usr/local/mysql/bin/mysql -uroot -p
Enter password:  #输入临时密码
mysql> alter user 'root'@'localhost' identified by 'abc123456';
mysql>  quit

至此,MySQL部署完成。

2、在数据库上创建用户

紧接着上面的操作,在数据库上创建一个监控用户,并做授权:

SQL> CREATE USER 'mysqld_exporter'@'localhost' IDENTIFIED BY 'mysqld123456' WITH MAX_USER_CONNECTIONS 3;
SQL> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'localhost';

注意:在创建用户的时候,推荐执行 MAX_USER_CONNECTIONS参数,避免我们监控使用过多的数据库连接数,导致数据库压力过大。

3、部署mysqld_exporter监控程序

下载mysqld_exporter监控程序,然后将mysqld_exporter放到/usr/local目录下,执行如下操作:

[root@mysqldb local]# tar zxvf mysqld_exporter-0.15.0.linux-amd64.tar.gz -C /usr/local
[root@mysqldb local]# cd /usr/local
[root@mysqldb prometheus]# mv mysqld_exporter-0.15.0.linux-amd64  mysqld_exporter
[root@mysqldb prometheus]# cd mysqld_exporter
[root@mysqldb prometheus]# vi .my.cnf
[client]
user=mysqld_exporter
password=mysqld123456
host = 127.0.0.1
port = 3306
[root@mysqldb prometheus]# chown -R mysql:mysql /usr/local/mysqld_exporter

4、编写启动mysqld_exporter服务脚本

用于启动mysqld_exporter的脚本内容如下:

[root@mysqldb local]# vim /usr/lib/systemd/system/mysqld_exporter.service
[Unit]
Description=mysqld_exporter
After=network.target
[Service]
Type=simple
User=mysql
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --web.listen-address=0.0.0.0:9104 --config.my-cnf=/usr/local/mysqld_exporter/.my
.cnf \
    --collect.global_status \
    --collect.auto_increment.columns \
    --collect.info_schema.processlist \
    --collect.binlog_size \
    --collect.info_schema.tablestats \
    --collect.global_variables \
    --collect.info_schema.innodb_metrics \
    --collect.info_schema.query_response_time \
    --collect.info_schema.userstats \
    --collect.info_schema.tables \
    --collect.perf_schema.tablelocks \
    --collect.perf_schema.file_events \
    --collect.perf_schema.eventswaits \
    --collect.perf_schema.indexiowaits \
    --collect.perf_schema.tableiowaits \
    --collect.slave_status \
    --collect.info_schema.innodb_tablespaces \
    --collect.info_schema.innodb_cmp \
    --collect.info_schema.innodb_cmpmem
Restart=on-failure
[Install]
WantedBy=multi-user.target

几个重要参数,含义如下:

  • --config.config.my-cnf 指定export连接数据库配置文件的路径
  • --web.listen-address 指定监听的地址,端口
  • --log.level 指定日志级别
  • --collect.*:表示启用对应模块指标收集

接着,启动mysqld_exporter服务即可:

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start mysqld_exporter

mysqld_exporter服务启动之后,就可以通过http://ip:9104/metrics 访问到mysqld_exporter收集到的mysql状态数据。

最后,还要将数据对接到prometheus server,打开prometheus.yml添加以下内容:

- job_name: 'mysql'  
  static_configs:
    - targets: ['172.16.213.27:9104']
      labels:
        instance: mysqld-exporter

执行prometheus配置刷新:

curl -XPOST localhost:9090/-/reload

5、监控mysql几个重要的指标

  • 延迟监控

主要是慢查询,关注慢查询数量。

  • 流量

统计 SELECT、UPDATE、DELETE、INSERT 等语句执行的数量。

  • 错误

错误量这类指标有多个应用场景,比如客户端连接 MySQL 失败了,或者语句发给MySQL,执行的时候失败了,都需要有失败计数。另外就是最大连接数的监控。

六、prometheus监控redis数据库

1、部署redis数据库

这里仍以172.16.213.27主机(almalinux9.1)为例,从https://redis.io/download下载redis最新版本,然后进行编译安装,过程如下:

[root@redisserver ~]# tar zxvf redis-7.0.11.tar.gz 
[root@redisserver ~]# cd redis-7.0.11
[root@redisserver redis-7.0.11]# make && make install
[root@redisserver redis-7.0.11]# cp redis.conf /etc/

安装完成后,启动数据库即可:

[root@redisserver ~]# sed -i 's#daemonize no#daemonize yes#g' /etc/redis.conf
[root@redisserver ~]# redis-server  /etc/redis.conf

上面第一个操作命令是修改redis配置文件,将redis-server放在后台运行。第二个命令是启动redis服务。

2、监控redis需要关注的几个重要的指标

  • 延迟

延迟数据对使用 Redis 的应用程序至关重要,所以要重点监控。

  • 流量

Redis 每秒处理多少请求,每秒接收多少字节、返回多少字节,在 Redis 里都内置了相关指标,通过 redis-cli 连上 Redis,执行 info all 命令可以看到很多指标。

  • 错误

客户端操作 Redis 返回了错误比较常见,要关注,另外需要关注客户端的最大连接数量。

  • 饱和度

Redis 重度使用内存,内存的使用率、碎片率,以及因为内存不够用而清理的 Key 数量,都是需要重点关注的。可以通过 info memory 命令查看这几个关键指标。

# 开启自动内存碎片整理(总开关)
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

3、获取并部署redis_exporter

redis_exporter并不是prometheus官方提供的,但官方推荐了第三方开发的exporter,搭建可以从https://github.com/oliver006/redis_exporter获取redis_exporter。

从这个地址下载最新版本的redis_exporter,由于安装包是二进制形式的,所以下载后,解压即可使用。

[root@redisserver ~]#  tar zxvf redis_exporter-v1.50.0.linux-amd64.tar.gz -C /usr/local
[root@redisserver ~]#  cd /usr/local
[root@redisserver local]#  mv redis_exporter-v1.50.0.linux-amd64  redis_exporter

这里将redis_exporter放到了/usr/local/redis_exporter目录下。

4、启动redis_exporter

执行如下命令,即可启动redis_exporter:

[root@redisserver data]# nohup /usr/local/redis_exporter/redis_exporter -redis.addr 127.0.0.1:6379 -web.listen-address :9121 &

几个参数含义如下:

  • -redis.addr: 指定redis服务的ip地址和端口号
  • -web.listen-address: 指定当前redis-exporter启动使用的端口信息
  • -redis.password: redis服务若是有密码的话,可用此参数指定redis的密码

可以将启动redis_exporter的服务写个脚本,内容如下:

[root@redisserver local]# vim /usr/lib/systemd/system/redis_exporter.service
[Unit]
Description=redis_exporter
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/redis_exporter/redis_exporter -redis.addr 127.0.0.1:6379 -web.listen-address :9121
Restart=on-failure
[Install]
WantedBy=multi-user.target

最后,重启redis_exporter服务即可:

[root@redisserver ~]# systemctl daemon-reload
[root@redisserver ~]# systemctl start redis_exporter

redis_exporter服务启动之后,就可以通过http://ip:9121/metrics 访问到redis_exporter收集到的redis状态数据。

redis监控指标含义:

redis_active_defrag_running:活动碎片整理是否运行[lw]

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


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

redis_blocked_clients:被阻止的客户[lw]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

redis_rejected_connections_total:拒绝的连接总数[lw]
redis_repl_backlog_first_byte_offset:复制起始偏移量[lw]
redis_repl_backlog_history_bytes:repl_backlog历史数据大小[lw]
redis_repl_backlog_is_active:repl_backlog是否开启[lw]
redis_replica_partial_resync_accepted:[lw]
redis_replica_partial_resync_denied:[lw]
redis_replica_resyncs_full:[lw]
redis_replication_backlog_bytes:[lw]
redis_second_repl_offset:[lw]
redis_slave_expires_tracked_keys:[lw]
redis_slave_info:从节点信息[lw]
redis_slave_priority:从节点优先级[lw]
redis_slave_repl_offset:从节点累加偏移量(判断主从是否同步)[lw]
redis_slowlog_last_id:慢查询日志最后一个的id[lw]
redis_slowlog_length:慢查询日志长度[lw]
redis_start_time_seconds:开始时间秒[lw]
redis_target_scrape_request_errors_total:[lw]
redis_up:运行时间[lw]
redis_uptime_in_seconds:正常运行时间[lw]

别忘记了,还要在Prometheus server上添加redis 这个监控节点,实现数据对接到Prometheus 。

5、在grafana上出图展示redis数据

从https://grafana.com/grafana/dashboards/下载对应redis的模板,导入到grafana即可。

posted @ 2025-07-19 20:06  国家一级冲浪yzk  阅读(77)  评论(0)    收藏  举报