Mysqld_exporter部署及常见的几种错误
前言由于近期某个同事部署这prometheus的监控mysql的组件的时候,出现了一个没见过的报错,刚好有时间就写一下。mysqld_exporter的部署数据库授权需要一个账号对数据库进行查询,所以必须去监控的数据库中授权用户和密码随意CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'expoter12Ssdc3' WITH MAX_USER_C
前言
由于近期某个同事部署这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,还需要看一下启动日志是否报错,通过接口是否可获得数据。
更多推荐
所有评论(0)