問題の背景
同社は電子商取引システムを開発しており、システム全体がHuawei Cloud上に構築されています。システムを設計する際には、後続のユーザーや注文の数が比較的多いことを考慮して、いくつかの大規模なデータベース コンポーネントを使用する必要があります。リレーショナルデータベースは、その後のデータ量の急速な増加を考慮して、MySQLに直接書き込むのではなく、Huawei Cloudの分散データベースミドルウェアDDMを使用しました。 DDM を使用すると、企業が意識することなく MySQL 読み取りインスタンスの数を直接増やすことができ、読み取りパフォーマンスが直線的に向上します。また、ミドルウェア レベルでサブデータベースとテーブルもサポートし、大規模なリレーショナル データベースの操作を提供します。電子商取引システム用にカスタマイズされているだけです。
DDM自体はクラスターの形でサービスを提供しており、複数の接続IPアドレスが公開されています。負荷分散の層が必要です。ロード バランシングのために LB を追加する従来の方法を使用すると、追加のトランジット層が発生し、パフォーマンスの低下が発生します。したがって、MySQL-JDBC によって提供されるクライアント負荷分散機能が直接使用されます。
論理構造は以下の図に示されています:
▲ビジネスは、MySQL-JDBC のロードバランスを通じて複数の DDM ノードにアクセスできます。 MySQL-JDBC は負荷分散機能を提供します。
問題の説明
MySQL JDBC ドライバーのクライアント負荷分散機能は良好に動作しており、パフォーマンスは驚くべきものです。しかし、少し前に、ビジネス リクエストが理由もなく失敗しました。私は、リアルマネーを伴う電子商取引モジュールを担当しています。この問題には冷や汗がでました...
そこで、すぐにバックグラウンド ログを確認したところ、何も言わずに DDM へのアクセス時に例外があることがわかりました。 、ファーウェイクラウドDDMサービスを提供するという作業命令を直接上げました。
Huawei Cloud のサービスは依然として非常に優れていると言わざるを得ません。30 分以内に専任のスタッフが私に連絡し、問題のトラブルシューティングに協力してくれました。
当社のビジネスのログを取得し、DDM サポート スタッフと分析したところ、エラーが次のように報告されていることがわかりました: 根本原因は MySQL ドライバーのバグであることが判明し、それが StackOverflow ローカル スタックを引き起こしましたオーバーフロー...バグによる殺人事件でした、DDMサービスを誤解していました、本当にごめんなさい
例外がMySQLをトリガーしたことがスタックからわかります-JDBC のバグ。スタックがオーバーフローするまでループ呼び出しが発生します。 Huawei DDM サポートスタッフの提案により、ドライバーコードが逆コンパイルされました。逆コンパイルから、確かにループネストの可能性があることがわかります。
ロードバランス ポーリング接続 -> 新しい接続と古い接続のステータスを同期する -> サーバーに SQL を送信する -> ロードバランス ポーリング接続。
関連するコードは次のとおりです:
これほど明白なバグですが、MySQL がそれを見つけられないとは思えません。現在、ドライバーの 5.1.44 バージョンを使用しています。最新の 5.1.66 コードを確認したところ、この問題は次のように修正されていることがわかりました。 、この問題は回避されます。ネストされたループが発生します。
しかし、5.1.66 では新しいバグが導入されました。postProcess が呼び出されるすべての場所に SQL があるわけではないため、ここのコードは null ポインター例外をスローします。 MySQL JDBCの開発者はテストをしないのですか...
まさかの5.1.44のコードを解析したところ、loadBalanceAutoCommitStatementThresholdパラメータの値を適切に調整することでループのネストも回避できることが分かりました。環境を5に変更しました。変更後1週間は問題なく快適に動作しました。変更計画
loadBalanceAutoCommitStatementThreshold は 5 に変更されますが、問題は、ビジネスに時間のかかる SQL が含まれている場合、DDM の負荷の不均衡を引き起こす可能性があることです。ただし、現在の状況から判断すると、DDM のパフォーマンスはまだ比較的強力です~関連記事:
PHP ドライバー MongoDB 整数問題のバグと戦略
WebLogic での MySql データベース用の JDBC ドライバーの構成
関連動画:以上がMySQL-JDBC ドライバーによって引き起こされるバグの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。