OceanBase Database Proxy(略称:ODP)は、OceanBaseデータベース専用のプロキシサーバーです。OceanBaseデータベースのユーザーデータは、複数のレプリカとして各OBServerノードに保存されています。ODPはユーザーから送信されたSQLリクエストを受信し、最適なターゲットOBServerにSQLリクエストを転送し、実行結果をユーザーに返します。
なぜODPが必要か?
ODPはプロキシサーバーであり、データベースへのアクセスパスに1つのハイプを追加します。では、なぜODPが必要なのでしょうか?以下の図を例に説明します。

図中のAPPは業務プログラムです。APPの前には3台のODP(ODPのプロセス名はobproxy)があります。実際のデプロイメントでは、ODPとAPPの間には通常、ロードバランシング(例:F5)があり、リクエストを複数のODPに分散します。ODPの下にはOBServerノードがあり、図中には6台のOBServerノードがあります。
ODPを使用する理由は以下の通りです:
接続管理:OceanBaseクラスタは規模が大きく、マシンやソフトウェアに障害が発生したり、運用保守のためマシンが追加・削除される可能性が高いです。OBServerノードに直接接続する場合、上記のような状況が発生するとクライアント側で接続が切断されます。ODPはOBServerノード自体の分散型の複雑さを隠蔽し、クライアントがODPに接続することで、ODPが接続の安定性を保証し、OBServerノードの複雑な状態を処理します。
データルーティング:ODPはOBServerノード内のデータ分布情報を取得でき、ユーザーのSQLをデータが存在するマシンに効率的に転送し、実行効率を向上させます。例えば、テーブルt1のデータは図中のP1に、テーブルt2のデータはP2に、テーブルt3のデータはP3にあります。insert into t1 ステートメントに対して、ODPはSQLをZONE_2内のP1リーダーレプリカを含むマシンに転送できます。update t2 ステートメントに対して、ODPはSQLをZONE_1内のP2リーダーレプリカを含むマシンに転送できます。
ODPにより、分散データベースを単一マシンのデータベースのように利用できます。
ODPの特徴
OceanBaseデータベースの重要なコンポーネントとして、ODPは以下の特徴を備えています:
高性能転送
ODPはMySQLプロトコルと完全に互換性があり、OceanBase独自のプロトコルもサポートしています。マルチスレッド非同期フレームワークと透過的ストリーミング転送の設計を採用しており、データの高性能転送を保証すると同時に、マシンリソースへの消費を最小限に抑えます。
最適ルーティング
ODPは、ユーザーリクエストに関連するレプリカの位置、ユーザーが設定した読み書き分離のルーティングポリシー、OceanBaseデータベースの複数地域展開における最適なリンク、およびOceanBaseデータベース各マシンの状態と負荷状況を十分に考慮し、ユーザーのリクエストを最適なOBServerノードにルーティングします。これにより、OceanBaseデータベース全体の高性能な稼働を最大限に保証します。
接続管理
1つのクライアントの物理接続に対して、ODPは自身とバックエンドの複数のOBServerノードとの接続を維持し、バージョン番号に基づく増分同期方式を採用して各OBServerノード接続のセッション状態を維持します。これにより、クライアントが各OBServerノードに効率的にアクセスできるようになります。
専用プロトコル
ODPは、デフォルトでOceanBase専用プロトコルをOBServerノードと使用します。例えば、メッセージにCRC検証を追加してOBServerノードとのリンクの正確性を保証したり、Oracle互換性のデータ型とインタラクションモデルをサポートするために伝送プロトコルを強化したりします。
セキュリティと信頼性
ODPはSSLを使用したデータアクセスをサポートしており、MySQLプロトコルとの互換性も備えているため、顧客のセキュリティ要件を満たします。
保守の容易さ
ODPは自己無状態であり、無制限の水平スケーリングをサポートします。また、複数のOceanBaseクラスタへの同時アクセスも可能です。豊富な内部コマンドを通じて自身の状態をリアルタイムで監視できるため、保守作業が非常に容易になります。
ライセンス
ODP Community Editionは完全にオープンソースであり、MulanPubL-2.0ライセンスを使用しています。ソースコードを無料でコピーおよび使用できます。ソースコードを変更または配布する際は、Mulanプロトコルを遵守してください。