OceanBaseデータベースでは、リーダーがトランザクションにおける読み書きリクエストを処理するため、各パーティションのリーダーの配置が各ノード上のトラフィックの分散を決定します。
トラフィックの概要
データベースシステムはアプリケーションアーキテクチャにおいてデータストレージとクエリ機能を担っており、アプリケーションの読み書きリクエストはデータベーストラフィックと呼ばれます。データベーストラフィックは、書き込みトラフィック、強整合性読み取りトラフィック、弱整合性読み取りトラフィックに分類されます。書き込みトラフィックと強整合性読み取りトラフィックはOceanBaseデータベースのリーダーレプリカが提供し、弱整合性読み取りトラフィックはリーダーレプリカとフォロワーレプリカが提供します。ODPはデータベーストラフィックのルーティング機能を提供しており、ODPは簡単なSQL Parserモジュールを実装しています。これにより、SQLからデータベース名、テーブル名、ヒントを解析し、業務SQL、ルーティングルール、およびOBServerノードの状態に基づいて、リクエストを転送する最適なOBServerノードを選択します。
プライマリゾーンの紹介
トラフィックの分散はプライマリゾーンによって記述されます。プライマリゾーンはリーダーレプリカの優先位置を示し、リーダーレプリカは業務の強整合性読み書きトラフィックを担います。つまり、プライマリゾーンがOceanBaseデータベースのトラフィック分散を決定します。例えば、あるテーブルt1のprimary_zone="Zone1"と設定されている場合、RootServiceは可能な限りt1テーブルのリーダーをZone1にスケジュールします。
説明
レプリカが対象とするのはデータであり、プライマリゾーンが対象とするのはデータを格納するコンテナです。そのため、このコンテナ配下のデータは、コンテナのプライマリゾーン属性で記述されたリーダーの優先位置を継承します。OceanBaseデータベースの現在のバージョンでは、テナントレベルのプライマリゾーンのみをサポートしていますが、OceanBaseデータベースV3.xでは、テーブルレベル、DBレベル、Table Groupレベルでのプライマリゾーン設定もサポートしています。
プライマリゾーンは実際にはゾーンのリストであり、そのリストには複数のゾーンが含まれます。このリストは以下の方法でゾーンに優先順位を設定します:
プライマリゾーンリストに複数のゾーンが含まれる場合、';'で区切られたものは高い優先順位から低い優先順位への順です。','で区切られたものは同じ優先順位であり、トラフィックが複数のゾーンに分散され、これらのゾーンが同時にサービスを提供することを意味します。
例:'hz1,hz2;sh1,sh2;sz1'は、hz1とhz2が同じ優先順位を持ち、かつsh1/sh2およびsz1よりも優先順位が高いことを示します。sh1とsh2は同じ優先順位を持ち、かつsz1よりも優先順位が高いことを示します。
OceanBaseデータベースの現在のバージョンでは、テナントレベルのプライマリゾーンのみをサポートしており、テーブルレベル、DBレベル、Table Groupレベルでのプライマリゾーン設定はサポートされなくなりました。テナント作成時にprimary_zoneを指定しなかった場合、デフォルトでRANDOMが設定され、各ゾーンの優先順位が同じであることを意味します。
テナントのプライマリゾーン属性は、システムテナントのoceanbase.DBA_OB_TENANTSビューのPRIMARY_ZONEフィールドで確認できます。例:
obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, CREATE_TIME, PRIMARY_ZONE, LOCALITY, COMPATIBILITY_MODE, STATUS FROM oceanbase.DBA_OB_TENANTS;
クエリ結果は次のとおりです:
+-----------+-------------+-------------+----------------------------+--------------+----------------------------------------------+--------------------+--------+
| TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | PRIMARY_ZONE | LOCALITY | COMPATIBILITY_MODE | STATUS |
+-----------+-------------+-------------+----------------------------+--------------+----------------------------------------------+--------------------+--------+
| 1 | sys | SYS | 2025-12-29 15:43:42.930290 | RANDOM | FULL{1}@zone1 | MYSQL | NORMAL |
| 1001 | META$1002 | META | 2025-12-29 15:44:48.700796 | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | MYSQL | NORMAL |
| 1002 | mysql001 | USER | 2025-12-29 15:44:48.704354 | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | MYSQL | NORMAL |
| 1003 | META$1004 | META | 2025-12-29 15:50:35.033311 | zone1 | FULL{1}@zone1 | MYSQL | NORMAL |
| 1004 | oracle001 | USER | 2025-12-29 15:50:35.034367 | zone1 | FULL{1}@zone1 | ORACLE | NORMAL |
+-----------+-------------+-------------+----------------------------+--------------+----------------------------------------------+--------------------+--------+
5 rows in set
さらに、現在のバージョンでは、ログストリームのリーダーを二次プライマリゾーンに分散することがサポートされています。つまり、第一優先順位のゾーンに障害が発生した場合、ログストリームのリーダーはPRIMARY_ZONEの次の優先順位を持つ各ゾーンに均等に分散されます。
注意
第二優先順位のPRIMARY_ZONEの数が第一優先順位と異なる場合、ログストリームのリーダーが第二優先順位で完全に分散されない可能性があります。
Regionプロパティ
OceanBaseデータベースでは、ゾーンにはRegionプロパティ(DBA_OB_ZONESビューのREGIONフィールド)があり、そのゾーンが位置する地域を示します。各ゾーンには1つのRegionしか設定できませんが、1つのRegionには複数のゾーンを含めることができます。プライマリゾーンの設定には、リーダーが優先的に配置されるRegionの位置が暗黙的に含まれています。具体的には、ユーザーがプライマリゾーンを設定する際には、2つの意味合いが含まれます:
指定されたプライマリゾーンは、リーダーが優先するゾーンのRegionです。
指定されたプライマリゾーンが位置するRegionは、リーダーが優先するRegionです。
具体的には、リーダーは最も優先度の高いゾーンに優先的にスケジュールされます。最も優先度の高いゾーン上のレプリカがリーダーになれない場合、同じRegion内の他のゾーンがリーダーの位置として優先的に選択されるため、業務アクセスがOceanBaseデータベースを跨ぐことができるだけ避けられます。