前言



由于近期某个同事部署这prometheus的监控mysql的组件的时候,出现了一个没见过的报错,刚好有时间就写一下。



mysqld_exporter的部署



数据库授权



需要一个账号对数据库进行查询,所以必须去监控的数据库中授权
用户和密码随意

CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'expoter12Ssdc3' WITH MAX_USER_CONNECTIONS 3; 
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

or

GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'expoter12Ssdc3' WITH MAX_USER_CONNECTIONS 3;


mysqld_exporter安装



<1>下载mysqld_exporter
#https://github.com/prometheus/mysqld_exporter/releases

cd /data
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
tar xf mysqld_exporter-0.12.1.linux-amd64.tar.gz
mv mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter


<2>配置用于监控的配置文件
mysqld_exporter会读取该配置文件中的账号密码用于监控

cd /data/mysqld_exporter
cat .my.cnf

[client]
host = 127.0.0.1
user = exporter
password = expoter12Ssdc3
socket = /tmp/mysql_3306.sock
[mysqladmin]
host = 127.0.0.1
user = exporter
password = expoter12Ssdc3
socket = /tmp/mysql_3306.sock


配置完,测试一下使用该配置文件中的账号密码socket是否可登陆

mysql -uexporter -p'expoter12Ssdc3' -S /tmp/mysql_3306.sock


<3>配置启动方式

根据系统版本配置启动方式,暂时不需要启动

Centos7

# cat /usr/lib/systemd/system/mysqld-exporter.service 
[Unit]
Description=mysqld_exporter


[Service]
ExecStart=/data/mysqld_exporter/mysqld_exporter --config.my-cnf /data/mysqld_exporter/.my.cnf --web.listen-address=0.0.0.0:9104 \
--collect.slave_status \
--collect.binlog_size \
--collect.info_schema.processlist \
--collect.info_schema.innodb_metrics \
--collect.engine_innodb_status \
--collect.perf_schema.file_events \
--collect.perf_schema.replication_group_member_stats
Restart=on-failure

[Install]
WantedBy=multi-user.target


管理方式:
systemctl daemon-reload
systemctl enable mysqld-exporter
systemctl restart mysqld-exporter
systemctl status mysqld-exporter
systemctl stop mysqld-exporter
Centos6

cat /etc/init.d/mysqld_exporter
#!/bin/bash

# chkconfig: 2345 80 80
# description: Start and Stop mysqld_exporter
# Source function library.

. /etc/init.d/functions

prog_name="mysqld_exporter"
prog_path="/data/mysqld_exporter/mysqld_exporter"
pidfile="/var/run/mysqld_exporter.pid"
prog_logs="/data/mysqld_exporter/mysqld_exporter.log"
options="--config.my-cnf=/data/mysqld_exporter/.my.cnf --web.listen-address=0.0.0.0:9104 --collect.slave_status --collect.binlog_size --collect.info_schema.processlist --collect.info_schema.innodb_metrics --collect.engine_innodb_status --collect.perf_schema.file_events --collect.perf_schema.replication_group_member_stats"
DESC="mysqld_exporter"

[ -x "${prog_path}" ] || exit 1

RETVAL=0

start(){
action $"Starting $DESC..." su -s /bin/sh -c "nohup $prog_path $options >> $prog_logs 2>&1 &" 2> /dev/null
RETVAL=$?
PID=$(pidof ${prog_path})
[ ! -z "${PID}" ] && echo ${PID} > ${pidfile}
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog_name
return $RETVAL
}

stop(){
echo -n $"Shutting down $prog_name: "
killproc -p ${pidfile}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog_name
return $RETVAL
}

restart() {
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status $prog_path
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac


------------------------------------------------------------
cat  /etc/sysconfig/mysqld_exporter
ARGS=""



------------------------------------------------------------
管理方式:
chmod +x /etc/init.d/mysqld_exporter
chkconfig mysqld_exporter on
/etc/init.d/mysqld_exporter restart



<4>mysqld_exporter监控多个数据库

可以根据配置文件分开监控,日志也分开

例如:一台服务器有多个数据库3306 3307

拷贝2个mysqld_exporter安装包
cp -r mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter_3306
cp -r mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter_3307

修改监控文件为对应的库的配置
cd  /data/mysqld_exporter_3307
cat .my.cnf
[client]
host = 127.0.0.1
user = exporter
password = expoter12Ssdc3
socket = /tmp/mysql_3307.sock
[mysqladmin]
host = 127.0.0.1
user = exporter
password = expoter12Ssdc3
socket = /tmp/mysql_3307.sock

修改启动文件也根据情况修改



mysqld_exporter常见报错



报错类型



权限

<1> level=error msg=“Error pinging mysqld: Error 1045: Access denied for user ‘root’@‘localhost’ (using password: YES)” source=“exporter.go:146”

如上报错,是授权问题,数据库中记得授权,并且查看mysqld_exporter下的my.cnf中的配置



socket

<2>level=error msg=“Error pinging mysqld: dial unix /tmp/mysql_3306.sock: connect: no such file or directory” source=“exporter.go:146”

如上报错,和明显是socket问题,修改my.cnf中的socket为正确的



DSN

<3>level=error msg=“Error pinging mysqld: this user requires old password authentication. If you still want to use it, please add ‘allowOldPasswords=1’ to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords” source=“exporter.go:146”

见于老数据库,是由于old_paswords参数导致,这个文档实际主要是这个问题。当前服务不支持密码的简单散列。

old_passwords,这个参数是mysql为了兼容4.1之前的客户端而保留的。开启这个old_passwords参数后,添加用户时生成的密码是以16位加密的方式存储的,而4.1之后的客户端都是采用64位加密方式存储的,所以通常情况下这个参数默认关闭的 old_passwords=0 ,即 old_passwords OFF,意思是不用16位加密,而是加密成64位
“https://github.com/go-sql-driver/mysql#allowoldpasswords”

1、按照官方提示你需要去你的mysql数据库设置old_passwords=0,不采用16位的加密,不管你是临时设置还是修改配置文件并重启,当执行后,所有用户的密码都会变成64位加密,即41个字节。

show variables like '%password%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| old_passwords   | OFF   |
| report_password |       |
+-----------------+-------+
2 rows in set (0.00 sec)

SET SESSION old_passwords=0;


show variables like '%password%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| old_passwords   | ON    |
| report_password |       |
+-----------------+-------+
2 rows in set (0.00 sec)

重新设置密码
SET PASSWORD FOR 'user'@'localhost' = PASSWORD('fiuurw65d7u');

SET GLOBAL old_passwords=0;


2、但是上面存在一个问题。当这个服务很老,你不清楚为什么使用这个,是前人不小心还是业务有需求设置的这个参数?修改或重启数据库时候是否会导致业务异常?所以我们需要一个不对数据库进行修改的方法。

在启动时候设置DSN的环境变量来启动,可以直接在外面使用也可以写到启动文件中

格式:

DATA_SOURCE_NAME=用户名:密码@unix\(Sock)/?参数=&参数=
or
DATA_SOURCE_NAME=用户名:密码@(ip地址:端口)/?参数=&参数=

DATA_SOURCE_NAME=exporter:expoter12Ssdc3@unix\(/tmp/mysql_3306.sock\)/?allowOldPasswords=true
Centos7
# cat /usr/lib/systemd/system/mysqld-exporter.service 
[Unit]
Description=mysqld_exporter


[Service]
Environment="DATA_SOURCE_NAME=exporter:expoter12Ssdc3@unix\(/tmp/mysql_3306.sock\)/?allowOldPasswords=true"
ExecStart=/data/mysqld_exporter/mysqld_exporter --config.my-cnf /data/mysqld_exporter/.my.cnf --web.listen-address=0.0.0.0:9104 \
--collect.slave_status \
--collect.binlog_size \
--collect.info_schema.processlist \
--collect.info_schema.innodb_metrics \
--collect.engine_innodb_status \
--collect.perf_schema.file_events \
--collect.perf_schema.replication_group_member_stats
Restart=on-failure
等等
Centos6

cat /etc/init.d/mysqld_exporter

#!/bin/bash

# chkconfig: 2345 80 80
# description: Start and Stop mysqld_exporter
# Source function library.

. /etc/init.d/functions

export DATA_SOURCE_NAME=exporter:'expoter12Ssdc3'@unix\(/tmp/mysql_3306.sock\)/?allowOldPasswords=true
prog_name="mysqld_exporter"
等等


补充:

go连接数据库是通过DSN数据源,.my.cnf只是一个用于从其中读取部分参数的文件,但是有部分选项是不能通过文件中获取的,所以allowoldpasswords等参数配置到mysqld_exporter的my.cnf中是不识别的,需要以DSN环境变量来启用某些功能或配置

这个设置常见于很老的服务,如果老版本打开了old_passwords选项,迁移或复制后的mysql也要打开old_password 或者 对密码rehash,生成新的hash密码长度(40个16进制字符,然后在前面再加一个*,41字节)



不兼容参数

<4>level=error msg=“Error scraping for collect.perf_schema.replication_group_member_stats: Error 1146: Table ‘performance_schema.replication_group_member_stats’ doesn’t exist” source=“exporter.go:171”

该数据库版本不兼容该参数,此报警忽略或删除启动文件中这个参数

#收集器参数
#参数名 MySQL版本  作用
#collect.auto_increment.columns                 5.1 自增列最大值
#collect.binlog_size                            5.1 binlog文件大小
#collect.engine_innodb_status                   5.1 从SHOW ENGINE INNODB STATUS 命令收集
#collect.engine_tokudb_status                   5.6 从SHOW ENGINE TOKUDB STATUS 命令收集 .
#collect.global_status                          5.1 从SHOW GLOBAL STATUS命令收集 (默认可用)
#collect.global_variables                       5.1 从SHOW GLOBAL VARIABLES命令收集 (默认可用)
#collect.info_schema.clientstats                5.5 如果使用userstat=1运行,则设置为true以收集客户端统计信息。
#collect.info_schema.innodb_metrics             5.6 收集information_schema.innodb_metrics 指标.
#collect.info_schema.innodb_tablespaces         5.7 收集information_schema.innodb_sys_tablespaces 指标.
#collect.info_schema.innodb_cmp                 5.5 收集information_schema.innodb_cmp中的innoDB压缩表指标
#collect.info_schema.innodb_cmpmem              5.5 收集information_schema.innodb_cmpmem中InnoDB 缓冲池指标 .
#collect.info_schema.processlist                5.1 收集 information_schema.processlist中的线程状态
#collect.info_schema.processlist.min_time       5.1 线程在每个状态的最小时间. (默认: 0)
#collect.info_schema.query_response_time        5.5 如果query_response_time_stats 设置的 ON,则收集查询响应时间.
#collect.info_schema.tables                     5.1 收集information_schema.tables中的指标 (默认开启)
#collect.info_schema.tables.databases           5.1 为所有数据库收集表统计信息.
#collect.info_schema.tablestats                 5.1 如果tablestats=1, 收集数据表统计数据.
#collect.info_schema.userstats                  5.1 如果userstat=1, 收集用户统计数据.
#collect.perf_schema.eventsstatements           5.6 收集performance_schema.events_statements_summary_by_digest中的指标.
#collect.perf_schema.eventsstatements.digest_text_limit 5.6 标准语句的最大长度. (默认: 120)
#collect.perf_schema.eventsstatements.limit     5.6 根据响应时间限制语句的事件数量. (默认: 250)
#collect.perf_schema.eventsstatements.timelimit 5.6 限制最后出现的事件事件. 单位:(默认: 86400)
#collect.perf_schema.eventswaits                5.5 收集performance_schema.events_waits_summary_global_by_event_name中的指标.
#collect.perf_schema.file_events                5.6 收集performance_schema.file_summary_by_event_name中的指标.
#collect.perf_schema.file_instances             5.5 收集performance_schema.file_summary_by_instance中的指标.
#collect.perf_schema.indexiowaits               5.6 收集performance_schema.table_io_waits_summary_by_index_usage中的指标.
#collect.perf_schema.tableiowaits               5.6 收集performance_schema.table_io_waits_summary_by_table中的指标.
#collect.perf_schema.tablelocks                 5.6 收集performance_schema.table_lock_waits_summary_by_table中的指标.
#collect.perf_schema.replication_group_member_stats 5.7 收集performance_schema.replication_group_member_stats中的指标.
#collect.slave_status                           5.1 收集SHOW SLAVE STATUS (默认可用)
#collect.slave_hosts                            5.1 收集SHOW SLAVE HOSTS信息
#collect.heartbeat                              5.1 收集数据库实例心跳
#collect.heartbeat.database                     5.1 收集某数据库心跳. (默认 heartbeat)
#collect.heartbeat.table                        5.1 收集某表的心跳. (默认 heartbeat)



Grafana不出图



版本不兼容



关于这个问题不只出现在这个组件中。实际上在部署各种服务中,常见因版本问题导致的异常。
例如:你在grafana中导入一个几年前的监控模板,而你的组件使用的是最新的或者近期的版本,通常每一版本的软件都会对一些配置或参数进行优化调整,时间越久与老版本的差别越大,这就导致了新软件获取的数据在老模板上不一定适用。这时需要降低组件版本,最好是与老模板同年的组件版本。
所以不要什么软件都直接使用最新的,如果是根据某篇文档进行配置,最好版本和文档中不要差太多。



启动问题

启动后,不仅要看端口是否up,还需要看一下启动日志是否报错,通过接口是否可获得数据。



Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐