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データベースでは、ゾーンにはリージョン属性(DBA_OB_ZONESビューのREGIONフィールド)があり、そのゾーンが位置する地域を示します。各ゾーンには1つのリージョンのみを設定できますが、1つのリージョン内には複数のゾーンを含めることができます。プライマリゾーンの設定には、リーダーが優先的に配置されるリージョンの場所が暗黙的に含まれています。具体的には、ユーザーがプライマリゾーンを設定する際には、2つの意味合いが含まれます:
指定されたプライマリゾーンは、リーダーが優先するゾーンのリージョンです。
指定されたプライマリゾーンが存在するリージョンは、リーダーが優先するリージョンです。
具体的には、リーダーは最も高い優先順位を持つゾーンに優先的にスケジュールされます。最も高い優先順位を持つゾーン上のレプリカがリーダーになれない場合、同一リージョン内の他のゾーンがリーダーの場所として優先的に選択されるため、業務アクセスがOceanBaseデータベースを跨ぐことができるだけ避けられます。