Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

背景

アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッドが頻繁に (1 日に 2 回程度) アラームを発するようになります。この監視項目は、アラーム数が少なく、しきい値も高くない(50 以下)ものの、データベースのスレッド実行は運用・保守上、重視しなければならないポイントです。

通常、アラームは夜中に表示され、threads-running がラインを通過した後、どの接続が処理されているかを手動で記録することは不可能です。このデータを自動的に記録できる優れたツールは市場に存在しないため、現時点では zabbix のアクション機能が必要になります。

ザビックス設定

1. 監視項目を定義する

ここでは怠け者なので、percona テンプレートの Threads Running 監視項目を直接使用します。

ここに画像の説明を挿入

2. トリガーを定義する

Percona トリガー設定にも同じことが当てはまります。

ここに画像の説明を挿入

3. アクションを作成する

以下の順序でアクションを作成します。

ここに画像の説明を挿入

4. 行動条件

ここに画像の説明を挿入

アクションは、条件 A、B、C、および D が満たされた場合にのみトリガーされます。ここでは、Zabbix への誤った呼び出しを避けるために、できるだけ詳細にフィルタリングするようにしてください。

5. 運用内容の改善

ここに画像の説明を挿入

ここでは ssh メソッドが適用可能です。もちろん、タイプ列のカスタム スクリプト オプションを使用して、zabbix クライアントに sudo 権限を付与することもできます。

コマンドバーには /bin/sh /opt/connect.sh コマンドが入っています。これは分かりやすいですね。connect.sh スクリプトを直接呼び出します。具体的なスクリプトは次のテキストに添付されています。

6. zabbix-agentの設定を変更する

監視対象サーバーを入力してください:

zabbix_agentd.conf を vim で開きます。
    
    EnableRemoteCommands=1 #zabbixサーバーのリモートコマンドサービスzabbix-agentの再起動を許可するには、このパラメータを追加します

ここまででzabbixに関する設定はすべて完了です。あとは書き込んだ処理スクリプトを/optディレクトリに置くだけです。

機能スクリプト

今回実現したいのは、接続が50件を超えたときに、どのアカウント、どのIP、どのSQLが実行されているかなどの情報を出力することです。スクリプトは次のとおりです。

#!/bin/sh

    エクスポート PATH=$PATH:/usr/bin
    da=`日付 +%Y%m%d`
    dc=`日付 +%Y-%m-%d" "%H:%M:%S`
    
    echo $dc"------------------------------私は境界線です------------------------------------" >> /tmp/ok_$da.log
    
    /usr/local/mysql/bin/mysql -uroot -pXXX -e "select * from information_schema.PROCESSLIST where COMMAND != 'Sleep' order by TIME DESC;" >> /tmp/ok_$da.log

拡張機能

Zabbix はアラームがトリガーされたときにスクリプトを呼び出すことができるので、より複雑なタスクを Zabbix で処理することは可能ですか?

データベース接続、ロック、ストレージエンジンなどの情報

#!/bin/sh
エクスポート PATH=$PATH:/usr/bin
da=`日付 +%Y%m%d`
dc=`日付 +%Y-%m-%d" "%H:%M:%S`
echo $dc"------------------------------私は境界線です------------------------------------" >> /home/zabbix/engine_log/engine_log_$da.log
/usr/bin/mysql -hlocalhost -uroot -pXXX -e "エンジン innodb ステータスを表示 \G;" >> /home/zabbix/engine_log/engine_log_$da.log
echo -e "\n\n\n" >> /home/zabbix/engine_log/engine_log_$da.log
echo $dc"-------------------------------私が境界線です------------------------------------" >> /home/zabbix/processlist/processlist_$da.log
/usr/bin/mysql -hlocalhost -uroot -pXXX -e "select * from information_schema.processlist where time>=0 and command !='sleep' order by time desc \G;" >> /home/zabbix/processlist/processlist_$da.log
echo -e "\n\n\n" >> /home/zabbix/processlist/processlist_$da.log
echo $dc"------------------------------私は境界線です------------------------------------" >> /home/zabbix/lock/lock_$da.log
/usr/bin/mysql -hlocalhost -uroot -pxxx -e Lo.Lock_type、lo.lock_table、lo.lock_index、tx.trx_query、tx.trx_tables_in_use、tx.trx_tables_locked、tx.trx_lows_locked情報ocks lo、information_schema.processlist p where lw.blocking_trx_id = tx.trx_id = tx.trx_mysql_thread_id and lo.lock_trx_id = tx.trx_id unionすべてTRX_STATE、TX.TRX_STARTED、TIMESTAMPDIFF(2番目、TX.TRX_STARTED、NOW())HURTER、LO.LOCK_MODE、LO.LOCK_INDEX、TX.TRX_QUERY、TX.TX_TABLES_USE、TX.TRX_LOCKED_LOCKED_TX.TRX_LOCKED_TABLE schema.innodb_trx tx、Information_schema.innodb_lock_waits lw、information_schema.innodb_locks lo、information_schema.processlist p where lw.requesting_trx_id = tx.trx_idおよびp.id = tx.trx_mysql_ded_ded_ded_ded_ded_ded_ded_ded_ded_ded_ded_ded_ \ g; ">> /home/zabbix/lock/lock_$da.log
echo -e "\n\n\n" >> /home/zabbix/lock/lock_$da.log
val=`/usr/bin/mysql -hlocalhost -uroot -pXXX -N -e "'general_log' のような変数を表示" |awk '{print $2}'`
[ $val = 'OFF' ]の場合;
それから
        /usr/bin/mysql -hlocalhost -uroot -pXXX -e "グローバル general_log=0 を設定します。"
それ以外
        終了0;
フィ

データベースに大きな負荷がかかっている場合、ロック情報、接続情報、ストレージ エンジン情報を記録できます。いわゆる高圧は、次のトリガー項目として定義できます。

  • スレッド実行中: 実行中の接続が多すぎます
  • Innodb 行ロック待機: ロック待機時間が長すぎます
  • Com Select\Update\Insert\Delete: 運用環境での変更が多すぎます
  • 受信\送信ネットワークトラフィック: 受信トラフィックと送信トラフィックが異常な場合

これらはすべてトリガー条件として機能します。

長いSQLを強制終了する

#!/bin/sh
エクスポート PATH=$PATH:/usr/bin
da=`日付 +%Y%m%d`
dc=`日付 +%Y-%m-%d" "%H:%M:%S`
ユーザー="root"
パスワード="XXX"
val=`mysql -u$user -p$password -N -e "time>=180 かつ command ='Query' かつ user in ('job_name','report') の場合、information_schema.processlist から count(*) を選択" | awk '{print $1}'`
[ $val -gt 0 ]の場合;
それから
        echo $dc"-------------------------------私が境界線です------------------------------------" >> /home/zabbix/kill_log/long_query_$da.log
        mysql -u$user -p$password -e "select * from information_schema.processlist where time>=180 and command ='Query' and user in ('job_name','report') order by time desc \G;" >> /home/zabbix/kill_log/long_query_$da.log
        echo -e "\n\n\n" >> /home/zabbix/kill_log/long_query_$da.log
        count=`mysql -u$user -p$password -N -e "time>=180 かつ command ='Query' かつ user in ('job_name','report')"` から information_schema.processlist の id を選択
        $count 内の id の場合;
        する
           mysql -u$user -p$password -e "$id を削除"
        終わり
それ以外
        終了0;
フィ

場合によっては、一部のジョブやレポート SQL が長時間実行され、他の業務に影響を及ぼします。データベース接続が急増した場合、そのほとんどが大きな SQL がそこに殺到したことによるものであると簡単に判断できます。このとき、Zabbix はこのスクリプトを呼び出して、特別なアカウントによって 180 秒以上開始された SQL を強制終了できます。 SQL を強制終了する条件はスクリプト内でカスタマイズできます。

もちろん、処理に長い時間がかかることが分かっている SQL ステートメントは、データベースから実行する必要があります。

不要なログを削除する

#!/bin/sh
ログディレクトリ='/mysql/logs'
binlog='/mysql/binlog'
var_percent=`df -h |grep var|grep dev/sda|awk '{print $5}'|awk -F% '{print $1}'`
[ -z $var_percent ] || [ $var_percent -lt 90 ]の場合
        「気にしないで」とエコーする
        終了 0
フィ
日付 >>$binlog/del_list.txt
リスト=`ls -l --time-style='+%Y-%m-%d %H:%M:%S' $binlog/mysql-bin.0?????|awk '{print $6","$7","$8}'`
$list 内の i について
する
        filetime=`echo $i|awk -F "," '{print $1,$2}'`
        ファイルタイムスタンプ=`date -d "$filetime" +%s`
        cur_time = `日付 + %s`
        [ $(($cur_time - $filetimestamp)) -gt $((3*24*3600)) ];の場合
                ファイル名=`echo $i|awk -F, '{print $3}'`
                echo "$filename は削除されます">>$binlog/del_list.txt
                /bin/rm $ファイル名
        フィ
終わり
if [ -f $logdir/mysql-slow.log ];then
        slow_log_size=`stat $logdir/mysql-slow.log|grep 'サイズ:'|awk -F ':' '{print $2}'|awk '{print $1}'`
        [ $slow_log_size -gt $((2*1024*1024*1024)) ];の場合
                echo "$logdir/mysql-slow.log">>$logdir/del_list.txt
                /bin/rm $logdir/mysql-slow.log
        フィ
フィ

場合によっては、binlog と slowlog が自動的に削除されるように設定されていないため、時間の経過とともにディスク領域がいっぱいになります。この時点で、/mysql の空きディスク容量監視項目を関連付け、しきい値を確認し、上記のスクリプトを呼び出して、不要な binlog と slowlog をクリーンアップすることができます。

マスターとスレーブが中断され、後で復元する必要がある場合など、binlog に依存する状況では、注意して使用する必要があります。

参考リンク:

Zabbix を通じてデータベース接続情報といくつかの拡張機能を取得します: https://www.jb51.net/article/207412.htm

zabbix によるデータベース接続情報と拡張機能の取得に関するこの記事はこれで終わりです。zabbix データベース接続に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Zabbix Agent2を使用してOracleデータベースを監視する方法
  • Zabbix を使用して Oracle データベースを監視する方法の詳細な説明
  • MongoDB データベースの状態を監視する Zabbix3.4 メソッド
  • Zabbix でデータベースをバックアップし、テーブルをパーティション分割する方法
  • Python スクリプト Zabbix カスタム キーを使用して Oracle 接続ステータスを監視する

<<:  Vueプロジェクトの最適化とパッケージ化の詳細な説明

>>:  MySql で、存在しない場合は挿入し、存在する場合は更新する方法

推薦する

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

Centos7 で MySQL マスター スレーブ サーバーを構築する方法 (グラフィック チュートリアル)

この記事では主に CentOS 上で MySQL マスタースレーブサーバーを構築する方法を紹介します...

曇り空のアイコン効果を実現する純粋な CSS

効果効果は以下のとおりです​実装のアイデアbox-shadow プロパティを使用して、複数の灰色の円...

MySQL INT型の完全な分析

序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...

Javascript 操作メカニズム イベントループ

目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...

Linux 基本チュートリアル: 特別な権限 SUID、SGID、SBIT

序文Linux のファイルまたはディレクトリの権限については、共通の rwx 権限を知っておく必要が...

Docker コンテナにおける Patroni の簡単な分析

目次イメージの作成ファイル構造Dockerファイルエントリポイント関数ファイルを生成するイメージを構...

Linux seqコマンドの使い方の詳しい説明

01. コマンドの概要seq コマンドは整数のシーケンスを生成するために使用されます。 02. コマ...

無効と読み取り専用で入力を読み取り専用に設定する

読み取り専用入力を実現するには、無効と読み取り専用の 2 つの方法があります。当然、どちらの結果も読...

HTML ドラッグ アンド ドロップ機能の実装コード

Vueベースこの機能の核となるアイデアは、JavaScript コードを通じてページ上のノードの左余...

Vue 2.0 の基礎を詳しく解説

目次1. 特徴2. 例3. オプション4. 基本的な文法5. ライフサイクル6. ルーティング管理 ...

MySql5.7.21 インストールポイント記録メモ

ダウンロードしたバージョンは、Zip 解凍版、Windows システムです。長い間 Windows ...

ビジュアルデザインとインタラクションデザインについて

<br />製品設計プロセス全体において、ビジュアルデザインとインタラクションデザインの...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

Tomcatのクラスロードメカニズムのプロセスとソースコード分析

目次序文1. Tomcat クラスローダー構造図: 2. Tomcat のクラスロードプロセスの説明...