CentOS7環境でexporterを自動で再起動させる方法
個人的な備忘録
やりたかったこと
サーバを再起動しても不意にKillされてもnode_exporter, mysqld_exporterが自動起動するようにしたかった
環境
CentOS 7.6 node_exporter 0.18.1 mysqld_exporter 0.12.1
環境はWin7上に立てた仮想マシン 各exporterはGit Hubからバイナリファイルをwgetしたものです。 すでに展開しています。(各exporterはバージョン名まで含み冗長なので省略しました)
[root@instance2:/usr/local/src/prometheus]$ ll 合計 14852 drwxr-xr-x. 2 3434 3434 58 7月 29 2019 mysqld_exporter -rw-r--r--. 1 root root 7121565 2月 14 2020 mysqld_exporter-0.12.1.linux-amd64.tar.gz drwxr-xr-x. 2 3434 3434 56 6月 5 2019 node_exporter -rw-r--r--. 1 root root 8083296 2月 14 2020 node_exporter-0.18.1.linux-amd64.tar.gz
node_exporter
node_exporterはOSのメトリクスを収集してくれます。
デフォルトポートは9100ですので、Prometheusを利用する場合は予めfirewall-cmd
で開けておくといいでしょう。
$ firewall-cmd --add-port=9100/tcp --zone=public --permanent
今回は省略します。
mysqld_exporter
mysqld_exporterはMySQLのメトリクスを収集してくれます。
デフォルトポートは9104ですので、Prometheusを利用する場合は予めfirewall-cmd
で開けておくといいでしょう。
$ firewall-cmd --add-port=9104/tcp --zone=public --permanent
今回は省略します。
Unit定義ファイルを作成する
/lib/systemd/sytem/
に各exporterのUnit定義ファイルを作成します。
/lib/systemd/system/node-exporter.service
[Unit] Description=Node Exporter Documentation=https://github.com/prometheus/node_exporter [Service] Type=simple ExecStart=/usr/local/src/prometheus/node_exporter/node_exporter Restart=always [Install] WantedBy=multi-user.target
Restart=always
とすることでsystemctlで完全に停止したとき以外でプロセスが終了したときに再起動してくれます。
/lib/systemd/system/mysqld-exporter.service
[Unit] Description=Mysqld Exporter Documentation=https://github.com/prometheus/mysqld_exporter [Service] Type=simple ExecStart=/usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf Restart=always [Install] WantedBy=multi-user.target
node_exporterとほぼ同じですが、オプションにconfig.my-cnf
を渡しています。
ここで指定している.my.cnfにはmysqld_exporterがMySQLにログインするための接続情報を記載しています。
/usr/local/src/prometheus/mysqld_exporter/.my.cnf
[client] user=prometheus password=%1+ja%l{ou+ITW{}B(%p host=127.0.0.1 port=3306
各Unit定義ファイルを作成したら反映させる必要があります。
[root@instance2:/usr/local/src/prometheus]$ systemctl daemon-reload [root@instance2:/usr/local/src/prometheus]$ systemctl list-unit-files | grep exporter mysqld-exporter.service disabled node-exporter.service disabled
各exporterを起動させる
[root@instance2:/usr/local/src/prometheus]$ systemctl start node-exporter [root@instance2:/usr/local/src/prometheus]$ systemctl start mysqld-exporter
起動後は必ずサービスが正常に起動しているか確認しましょう
[root@instance2:/usr/local/src/prometheus]$ systemctl status node-exporter ● node-exporter.service - Node Exporter Loaded: loaded (/usr/lib/systemd/system/node-exporter.service; disabled; vendor preset: disabled) Active: active (running) since 金 2020-02-14 09:52:58 JST; 8s ago Docs: https://github.com/prometheus/node_exporter Main PID: 5346 (node_exporter) Tasks: 3 CGroup: /system.slice/node-exporter.service └─5346 /usr/local/src/prometheus/node_exporter/node_exporter 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - sockstat" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - stat" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - textfile" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - time" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - timex" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - uname" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - vmstat" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - xfs" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg=" - zfs" source="node_exporter.go:104" 2月 14 09:52:58 instance2 node_exporter[5346]: time="2020-02-14T09:52:58+09:00" level=info msg="Listening on :9100" source="node_exporter.go:170" [root@instance2:/usr/local/src/prometheus]$ systemctl status mysqld-exporter ● mysqld-exporter.service - Mysqld Exporter Loaded: loaded (/usr/lib/systemd/system/mysqld-exporter.service; disabled; vendor preset: disabled) Active: active (running) since 金 2020-02-14 09:53:02 JST; 9s ago Docs: https://github.com/prometheus/mysqld_exporter Main PID: 5359 (mysqld_exporter) Tasks: 3 CGroup: /system.slice/mysqld-exporter.service └─5359 /usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Starting mysqld_exporter (version=0.12.1, branch=HEAD, revision=48667bf7c3b438b5e93b259f3d17b7...orter.go:257" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58)" source="mysqld_exporter.go:258" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Enabled scrapers:" source="mysqld_exporter.go:269" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.slave_status" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.global_status" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.global_variables" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.query_response_time" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.innodb_cmp" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg=" --collect.info_schema.innodb_cmpmem" source="mysqld_exporter.go:273" 2月 14 09:53:02 instance2 mysqld_exporter[5359]: time="2020-02-14T09:53:02+09:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:283" Hint: Some lines were ellipsized, use -l to show in full.
大丈夫そうです。
サービス自動起動を有効にする
このままではサーバが再起動したときに自動でサービスを再起動してくれないので、自動起動を有効にする必要があります。
[root@instance2:/usr/local/src/prometheus]$ systemctl enable node-exporter Created symlink from /etc/systemd/system/multi-user.target.wants/node-exporter.service to /usr/lib/systemd/system/node-exporter.service. [root@instance2:/usr/local/src/prometheus]$ systemctl enable mysqld-exporter Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld-exporter.service to /usr/lib/systemd/system/mysqld-exporter.service.
設定後は必ず自動起動が有効になっているか確認しましょう。
[root@instance2:/usr/local/src/prometheus]$ systemctl list-unit-files | grep exporter mysqld-exporter.service enabled node-exporter.service enabled
enableになっていればOKです。
最後に実際にサーバを再起動してみて各exporterが自動で起動されるか確認してみます。
[root@instance2:/usr/local/src/prometheus]$ reboot [root@instance2:~]$ uptime 11:16:21 up 2 min, 1 user, load average: 0.75, 0.42, 0.16 [root@instance2:~]$ [root@instance2:~]$ systemctl status node-exporter ● node-exporter.service - Node Exporter Loaded: loaded (/usr/lib/systemd/system/node-exporter.service; enabled; vendor preset: disabled) Active: active (running) since 金 2020-02-14 11:14:31 JST; 5min ago Docs: https://github.com/prometheus/node_exporter Main PID: 2744 (node_exporter) Tasks: 5 CGroup: /system.slice/node-exporter.service └─2744 /usr/local/src/prometheus/node_exporter/node_exporter 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - sockstat" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - stat" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - textfile" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - time" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - timex" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - uname" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - vmstat" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - xfs" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg=" - zfs" source="node_exporter.go:104" 2月 14 11:14:33 instance2 node_exporter[2744]: time="2020-02-14T11:14:33+09:00" level=info msg="Listening on :9100" source="node_exporter.go:170" [root@instance2:~]$ [root@instance2:~]$ systemctl status mysqld-exporter ● mysqld-exporter.service - Mysqld Exporter Loaded: loaded (/usr/lib/systemd/system/mysqld-exporter.service; enabled; vendor preset: disabled) Active: active (running) since 金 2020-02-14 11:14:30 JST; 5min ago Docs: https://github.com/prometheus/mysqld_exporter Main PID: 2696 (mysqld_exporter) Tasks: 4 CGroup: /system.slice/mysqld-exporter.service └─2696 /usr/local/src/prometheus/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/src/prometheus/mysqld_exporter/.my.cnf 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58)" source="mysqld_exporter.go:258" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Enabled scrapers:" source="mysqld_exporter.go:269" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.global_status" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.global_variables" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.slave_status" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.innodb_cmpmem" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.query_response_time" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg=" --collect.info_schema.innodb_cmp" source="mysqld_exporter.go:273" 2月 14 11:14:31 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:31+09:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:283" 2月 14 11:14:44 instance2 mysqld_exporter[2696]: time="2020-02-14T11:14:44+09:00" level=error msg="Error pinging mysqld: dial tcp 127.0.0.1:3306: connect: connection refused" source="exporter.go:146"
無事に目標が達成されました!