このスクリプトを作成する本来の目的は、Alibaba Cloud RDS の使用中にデータベースで例外が発生し、迅速な回復が必要になるということです。インターネット上には同様の kill スクリプトが多数あり、すべて mysqladmin を通じて実装されています。ただし、Ali-RDS 環境には次の制限があります:
ユーザーに SUPER 権限を提供しない、つまり、ユーザーは自分のスレッドのみを強制終了できます
接続数が急激に増加すると、外部ユーザーはログインできなくなります。コンソール
午前 2 時の大きな問題を解決するために、この Python スクリプトは DB インスタンスでマルチスレッドを使用して各ユーザーの接続を予約し、kill 時にコマンド設定ファイル mysqk.ini を読み取ります。要件が見つかった場合、対応するユーザーの既存の接続を使用して、information_schema.processlist の条件を満たすスレッドが強制終了されます。
注: このスクリプトは 9 月に一度書き直されました。7 月のバージョン (ブランチ old_0.5.0) は、1 つの DB インスタンスに対応する 1 つのインスタンスごとにあります。そのため、常に確認するのが困難です。エレガントなので、複数のユーザーのセッションを同時に維持するために 1 つの DB インスタンスと 1 つのスレッドに変更されました。同時に、新バージョンでは、特定の接続を含むまたは除外する時間帯によるチェック、電子メール通知、構成項目のカバレッジなどの機能も追加されています。
機能
mysql pingを通じて常に長時間の接続を維持し、接続が利用できないという厄介な状況を解決するために切断後の自動再起動メカニズムを備えています
各データベースインスタンスには独自のスレッドがあり、個々のユーザーにログインする必要がありません別々に殺すための複雑な操作。 SUPER 権限を持っている場合は、構成を簡素化して互換性を持たせることもできます。
スレッドを個別に強制終了する必要があるシナリオに対処できるようにすることもできます。
N 秒を超えて長時間実行される
スリープ状態のトランザクション。 (通常は推奨されませんが、場合によっては強制終了し、管理者が使用するために接続をすぐに解放できます)
Binlog ダンプなど、強制終了できない一部のスレッドを除外します
特定のキーワードを含むスレッドを強制終了する必要がある場合
適格なスレッドの場合表示されると、現在のプロセスリスト、エンジンのステータス、lock_wait が表示されます スナップショットを作成し、メールで送信します
試運転用の dry_run モードがあり、すべてのチェックプロセスを実行しますが、実際には強制終了はしません
時間内のみの実行をサポートします一部の長いタスクが夜間にチェックされないことを考慮してウィンドウを作成します
パスワード暗号化
< ;!-- more -->
簡単に使用するには
MySQL-python および pycrypto ライブラリをインストールするために pip が必要です。テストのみが行われます。 Python 2.7上で。
settings.py で接続用のユーザー名とパスワード情報を設定します。ここでは、DB の同じバッチ内でチェックされる認証情報が同じであると仮定します。指定されたユーザーは、ログイン認証に使用され、チェックする必要があるユーザーをスクリプトに通知します。
パスワードは prpcryptec.py を通じて暗号化する必要があり、暗号化されたキーはスクリプト自体の KEY_DB_AUTH 変数に書き込む必要があります。 (リークが心配な場合は、mysqk.py を pyc にコンパイルして実行してください)
mysqk.ini メイン設定ファイルの
db_info セクションで、確認する必要があるデータベース アドレス (db01=10.0 など) を設定します。 200.100:3306
は個別に db01 にすることができます。スレッドを強制終了する必要があるオプションを指定するまで待ちます。 [id_db01] は、デフォルトで [db_commkill] のオプションを再利用します
db_comconfig セクションでは、db_puser をすべてのプロセスリストを表示できる権限を持つユーザーとして設定し、settings.py の DB_AUTH で指定されています
チェックのみを実行したいので、実際に例外を強制終了したくありません スレッド、dry_run が 0 に等しくないことを確認してください
それでは、開始します!
設定項目の説明
mysqk.ini:
mail_config
メール通知関連の設定、SMTP サービス アドレスと認証情報。
mail_receiver= 空に設定します。これは、メールが送信されないことを意味します
db_info
どのデータベース インスタンスをチェックして強制終了するかを設定します。
形式: ccba59bbdb8214500b1cca8a72093b37=f7e6dec31ab1a0471d06c55afaca8d77:298c9bd6ad6e8c821dc63aa0473d6209、dbid が唯一のものですこれは DB インスタンスを表し、その後に削除する各 DB のオプションを設定します。セクション構成名は id_ccba59bbdb8214500b1cca8a72093b37 です。ポートを指定する必要があります。
ここに表示される DB インスタンスはチェックされ、; でコメントできますが、スクリプトを再起動する必要があります。
db_comconfig
パブリック設定を確認し、リアルタイムで有効にします。
db_puser: show processlist のユーザー名を指定します。必要な権限: PROCESS、information_schema ライブラリの表示。異常なスレッドをチェックし、スレッドを強制終了する権限を持つユーザーに結果を提供する代表ユーザーとみなすことができます。
run_max_count: グローバル制御スイッチであるチェックを実行する回数。この値が変更されるたびにチェックが再開され、つまりクリーン スタートとなり、新しく変更された構成が有効になります。
は 0 です。これは、スクリプトがチェックを実行せず、単にデータベースへの接続を維持することを意味します。生存チェックの頻度は、settings.py の CHECK_CONFIG_INTERVAL × CHECK_PING_MULTI で決まります。
は 999 です。これは、接続スレッドがバックグラウンドで一貫してチェックされることを意味します (ただし、kill 条件を満たすものが存在しない可能性があります)。チェックは settings.py の CHECK_CONFIG_INTERVAL で指定されます。
は、チェック回数に達した後にチェックが停止されることを意味します。0 は、実際の強制終了を意味します。 1 またはその他の値は試行を意味します。試行モードを使用すると、遅いクエリを監視し、警告することができます。同じセッション スレッド ID は 1 回だけアラートを生成することに注意してください
run_time_window: 実行中のチェックの時間枠。形式は 08:00 ~ 22:00 です。この時間以外ではチェックは実行されません。空白のままにすると制限がないことを意味します。主な考慮事項は、夜間に一部の統計タスクで「異常な」スレッドが発生する可能性があることです。
db_commkill
kill はパブリック設定を使用し、リアルタイムで有効になり、id_ccba59bbdb8214500b1cca8a72093b37 セクションのオプションによってオーバーライドされます。
k_user: 非常に重要なオプションで、どのデータベース ユーザーをチェックして強制終了するかを指定します。複数のユーザーはカンマで区切られます (引用符は含めないでください)。
が all の場合、 settings.py の DB_AUTH で指定されたすべてのユーザーをチェックすることを意味します
k_exclude と k_include の値は、Python re モジュールをサポートする通常の形式です。引用符は使用しないでください。
[mail_config] mail_host=smtp.exmail.qq.com mail_user=xxx@ecqun.com mail_pass=xxxxxx mail_receiver= [db_info] crm0=192.168.1.125:3306 crm1=192.168.1.126:3306 crm2=192.168.1.127:3306 crm3=192.168.1.128:3306 base=10.0.200.142:3306 [db_commconfig] db_puser=ecuser ; how many kill times once this config file changed ; 0: DISABLE all kill ; 999: always kill threads that meet kill conditions ; default: 1 ; can not be inherit run_max_count=999 dry_run=1 run_time_window=08:00-22:00 [db_commkill] k_user=all k_longtime=10 k_lock=1 k_sleep=0 k_exclude=Binlog|ecdba|Daemon k_include=select sleep\(17\) [id_crm0] ; k_user: who's threads to be killed. use comma to separate ; none: do not kill anyone's threads ; all: kill all user's threads (with other where conditions) ; default: none k_user=all ; k_longtime: filter the threads who's running time is longer than this ; 0: ignore the time > x condition ; default: 10 k_longtime=10 ; k_sleep: whether kill sleepd threads or not ; 0: do not kill command='Sleep' threads from processlist ; when it set to 1, usually it's subset of k_longtime condition ; default: 0 k_sleep=0 [id_crm1] k_user=ecuser k_longtime=10 k_sleep=0 [id_crm2] k_user=all k_longtime=10 k_sleep=0 [id_crm3]