本稿は、TDSQL-C for MySQLのデータベースプロキシサービスの自動読み書き分離、機能の利点、読み書き分離ルーティングルールを主に紹介します。
現在、多くの本番環境ユーザーのビジネスシナリオでは、読み取りが多く書き込みが少ない状況や、予測不可能な業務負荷が存在します。大量の読み取りリクエストが発生するアプリケーションシナリオでは、単一のインスタンスが読み取り負荷に耐えられず、ビジネスに影響を与える可能性があります。読み取り能力の弾力的な拡張を実現し、データベースの負荷を分散させるために、1つまたは複数の読み取り専用インスタンスを作成し、大量のデータベース読み取り需要を満たすことができます。ただし、このようなソリューションでは、ビジネス側で読み書き分離の改修対応が必要であり、コードの堅牢性がビジネスの読み書き分離の品質を決定するため、ユーザーの技術要件が高く、柔軟性と拡張性に欠けます。
したがって、読み取り専用インスタンス作成後、データベースプロキシを開通し、アクセスアドレス戦略を設定した上で、アプリケーションにデータベースプロキシアドレスを設定することで、書き込みリクエストは自動的にプライマリインスタンスに転送され、読み取りリクエストは各読み取り専用インスタンスに自動転送されます。データベースプロキシは自動読み書き分離機能に加え、他の業務課題に対してもより優れたソリューションを提供します。具体的には以下の通りです:
負荷予測不能または不規則な変動/負荷の「急激な増加」現象が顕著なシナリオ
インターネットビジネスシナリオでは、業務負荷とアクセス圧力は予測不可能で不安定なことが多く、頻繁な変動と「急激な負荷増加」が発生します。ビジネス側でショートコネクションを多用してデータベースにアクセスする場合、こうしたシナリオでは多数の新規接続(つまりデータベースとアプリケーション間の接続数)が容易に発生し、業務アクセス負荷の頻繁な変動に伴って変動しやすくなります。
データベースプロキシの接続管理により、ユーザーはデータベース接続を効果的に再利用することで、予測不可能なワークロードに対応するアプリケーション接続問題を適切に拡張できます。まず、複数のアプリケーション接続がデータベース接続を共有できるようにし、データベースリソースを効率的に活用します。次に、オープン状態のデータベース接続数を調整することで、データベースのパフォーマンスを維持できます。最後に、使用不能なアプリケーションリクエストを削除し、アプリケーション全体のパフォーマンスと可用性を保持します。
アプリケーションとデータベースが頻繁に接続を確立・切断するシナリオ
サーバーレス、PHP、Ruby on Railsなどの技術で構築されたアプリケーションでは、アプリケーションリクエストを満たすためにデータベース接続を頻繁にオープン・クローズする可能性があります。
データベースプロキシはデータベース接続プールを維持することで、データベースの計算リソースや新規接続確立用メモリへの不要な負荷を回避できます。
データベースアクセス接続が長時間アイドル状態で解放されないシナリオ
SaaSや電子商取引業界の従来型アプリケーションでは、ユーザーの再参加時の応答時間を最小限に抑えるため、データベース接続をアイドル状態のまま保持する場合があります。ユーザーはデータベースプロキシを使用してアイドル接続を維持し、必要に応じてデータベース接続を確立することで、大多数のアイドル接続をサポートするために閾値を過度に引き上げたり、高スペックデータベースへアップグレードしたりすることを回避できます。
データベースPaaSサービスのフェイルオーバーシナリオにおけるスムーズさと安定性の向上
データベースプロキシを使用することで、ユーザーは複雑な障害処理コードを記述する必要なく、データベースのフェイルオーバー(アクティブ/パッシブ)を透過的に許容できるアプリケーションを構築できます。データベースプロキシは読み取りトラフィックを新しいデータベースインスタンスに自動的にルーティングすると同時に、アプリケーション接続を維持します。
機能メリット
セルフサービス型リードライト分離と統一アクセスアドレス。
ネイティブリンクサポート、性能向上、保守コスト削減。
重みと閾値を設定可能で、ユーザーが柔軟に選択できます。
フェイルオーバー機能を備えており、データベースプロキシに障害が発生しても、リクエストはプライマリデータベースに正常にアクセスできます。
読み書きインスタンスの切り替え、構成変更、読み取り専用インスタンスの増減などが発生しても、データベースプロキシは設定を動的にホットロードできるため、ネットワーク中断や再起動が発生しません。
機能説明
TDSQL-C for MySQLのデータベースプロキシサービスは自動的な読み書き分離機能を備えており、読み書きインスタンスと複数の読み取り専用インスタンスに対する読み取り重みの割り当てをサポートしています。注意が必要なのは、ここの重みは読み取りリクエスト(非トランザクション)向けの重み割り当て戦略であることです。
読み書き分離のルーティング規則
マスターインスタンスに送信する
CREATE、ALTER、DROP、RENAMEなどのDDLステートメント。
INSERT、UPDATE、DELETEなどのDMLステートメント。
SELECT FOR UPDATEステートメント。
一時テーブル関連のステートメント。
一部のシステム関数呼び出し(例:last_insert_id())およびすべてのユーザー定義関数呼び出し。
LOCK関連ステートメント。
トランザクション開始後のステートメント(set autocommit=0を含む)。
ストアドプロシージャ。
セミコロンで接続された複数ステートメント。
SQL文内のKILL(コマンドではないKILL)。
すべてのユーザー変数に対するクエリおよび変更。
読み取り専用インスタンスを送信する
トランザクション外のSELECT文。
注意:
読み取り専用分析エンジンは読み書き分離をサポートしていません。
すべてのインスタンスに送信する
show processlist文。
すべてのシステム変数の変更(SETコマンド)。
USEコマンド