背景:頻繁な事故•毎年、SQL の問題が原因でオンライン問題が発生しています。検出が容易ではない• SQL パフォーマンスの問題は、本番環境前では検出が困難です。 • SaaS システムの SQL 条件における分離フィールドの省略は、権限昇格のリスクにつながる可能性があります。 • SQL の問題は、ビジネスの初期段階では問題ないかもしれませんが、ビジネスが成長するにつれて問題が容易に発生する可能性があります。 • DBS における低速な SQL クエリはリアルタイムアラートをサポートしていないため、タイムリーな検出が不可能です。 •コードレビューに頼ると、必然的に抜け漏れが発生します。イベント後の処理•オンラインAPIのパフォーマンス問題やデータベースアラートが発生して初めて問題に気づき、SQLの最適化を試みます。その時点では、すでに深刻なオンラインインシデントが発生している可能性があります。 考える:手動で問題を発見するのは確実ではありません。本番環境への問題拡大を防ぐには、テスト環境やプレプロダクション環境で早期に問題を発見することが望ましいでしょう。技術的な手段を用いて事前に問題を検出することは可能でしょうか?問題のあるSQLクエリを自動的に検出する新しいツールを開発することは可能でしょうか? プロセス設計: アクション:問題のある SQL クエリに対する自動アラートは、SQL 検査プラグインを開発することによって実装されます。 1. SQLインターセプターを使用して、システムによって実行されるSQLをインターセプトします。2 .非同期スレッドプールを有効にして、業務プロセスの実行が妨げられないようにします。特定の入力パラメータとフォーマットを無視してSQLを解析します。SQL文はMD5で暗号化します。重複したSQL実行を防ぐため、以前にインターセプトしたMD5値をキャッシュします。キャッシュ時間はカスタマイズ可能で、この期間中は同じSQLは解析されません。3 .業務システムの安定性を確保するため、プラグイン統合時に手動データソースインジェクションをサポートします。後続のexplain/show create table操作を実行する際に、マスターまたはスレーブを選択できます。4 . explain/show create table実行結果とSQL文をHTTP/MQ経由でSQL検査プラットフォームに送信します。5 . SQL検査プラットフォームは情報を受け取り、分割してテーブル名と条件を取得します。6 .まず、実行プランを分析します。例えば、[possible_keys][key]でインデックスが使用されているかどうかを分析します。使用されていない場合は、タイムリーに警告が発せられ、検査プラットフォームに記録されます。7 .次に、テーブルとクエリ条件を分析します。プラットフォーム設定を読み取り、特定のテーブル(正規表現をサポート)のクエリ条件の検証ルールを設定します。例えば、 「xxx_infoテーブルの条件にはxxx_codeを使用する必要があります」などです。条件が満たされていない場合は、早期警告が発せられ、その情報が検査プラットフォームに記録されます。
アクセス:SQL 検査 JAR パッケージをインポートし、インターセプターをデータ ソースに登録します。 </プロパティ>
<プロパティ名="プラグイン">
<リスト>
<bean class="com.yzt.plugin.MysqlExplainInterceptor">
<プロパティ名="sysName" 値="yzt-refund"/>
<プロパティ名="monitorSqlService" ref="monitorSqlServiceImpl"/>
</bean>
</リスト>
</プロパティ>重複したSQLクエリをインターセプトする期間を指定します @オーバーライド
パブリックブール値 warnFLag(文字列 id) {
//指定された時間内に重複した SQL レポートをインターセプトするためのキャッシュ実装。false を返します。
}
............当社の検査プラットフォームでは、設定されたシステム名に基づいてアラーム ユーザーとアラーム ルールをカスタマイズできます。 自動検査とタイムリーな警告により、テスト環境およびプレプロダクション環境におけるSQLの問題を事前に特定し、修正することで本番環境での問題発生を未然に防ぐことができます。同時に、問題のあるSQLに対して最適化の提案を提供することで、開発チームが迅速に修正できるよう支援します。 |